将唯一值插入表中的过程不起作用

Procedure to insert in unique in values into tables not working

我是这门语言的初学者,我被要求通过过程将一些唯一变量插入表 aeropuerto 和终端(与表中的其他变量相比,这些变量必须是唯一的)并在思考之后,这是我所到之处。您对如何编辑代码或我如何使用简单的说明插入有什么建议吗? (我们在课程中还没有走那么远:))

create or replace PROCEDURE EX3 (
    IDAE IN NUMBER, 
    NOMA IN VARCHAR2, 
    PLAC IN VARCHAR2, 
    IDTER IN NUMBER, 
    NUMT IN NUMBER)
AS 
BEGIN
  
    IF IDAE!=AEROPUERTO.ID AND NOMA!=AEROPUERTO.NOMBRE AND PLAC!=AEROPUERTO.LUGAR THEN
            INSERT INTO AEROPUERTO(ID, NOMBRE, LUGAR) 
            VALUES (ID_AAUX, NOMA, PLAC);
    END IF;
    IF IDTER!=TERMINAL.ID AND NUMT!=TERMINAL.NUMERO AND IDAE!=TERMINAL.ID_AEROPUERTO THEN
            INSERT INTO TERMINAL(ID, NUMERO, ID_AEROPUERTO) 
            VALUES (ID_TAUX, NUMT, IDAE);
    END IF;
END EX3;

最简单的方法可能是在 INSERT 语句中使用 NOT EXISTS 子句。

create or replace PROCEDURE EX3 (
  IDAE IN NUMBER, 
  NOMA IN VARCHAR2, 
  PLAC IN VARCHAR2, 
  IDTER IN NUMBER, 
  NUMT IN NUMBER )
AS 
BEGIN
  INSERT INTO AEROPUERTO(ID, NOMBRE, LUGAR) 
    SELECT idae, noma, plac
      FROM dual
     WHERE NOT EXISTS( SELECT 1
                         FROM AEROPUERTO a
                        WHERE a.id = idae
                          AND a.nombre = noma
                          AND a.lugar = plac );

  INSERT INTO TERMINAL(ID, NUMERO, ID_AEROPUERTO) 
    SELECT idter, numt, idae
      FROM dual
     WHERE NOT EXISTS( SELECT 1
                         FROM terminal t
                        WHERE t.id = idter
                          AND t.numero = numt
                          AND t.id_aeropuerto = idae );
END EX3;

然而,根据实际获取重复值的常见程度,并假设存在唯一约束,尝试 insert 并捕获异常可能更有效

create or replace PROCEDURE EX3 (
  IDAE IN NUMBER, 
  NOMA IN VARCHAR2, 
  PLAC IN VARCHAR2, 
  IDTER IN NUMBER, 
  NUMT IN NUMBER )
AS 
BEGIN
  BEGIN
    INSERT INTO AEROPUERTO(ID, NOMBRE, LUGAR) 
      VALUES( idae, noma, plac );
  EXCEPTION
    WHEN dup_val_on_index
    THEN
      null;  -- Ignore the error if the row already exists
  END;

  BEGIN
    INSERT INTO TERMINAL(ID, NUMERO, ID_AEROPUERTO) 
      VALUES( idter, numt, idae );
  EXCEPTION
    WHEN dup_val_on_index
    THEN
      null;  -- Ignore the error if the row already exists
  END;
END EX3;

顺便说一句,如果您对参数和局部变量使用命名约定,确保清楚它们引用的列但又不会与实际列的名称冲突,您的生活通常会更轻松。如果您使用锚定类型来明确特定参数应该与哪些列匹配,您的生活将会更轻松。

如果您的程序已申报

create or replace PROCEDURE EX3 (
  p_id_aeropuerto IN aeropuerto.id%type, 
  p_nombre        IN aeropuerto.nombre%type, 
  p_lugar         IN aeropuerto.lugar%type, 
  p_id_terminal   IN terminal.id%type,
  p_numero        IN terminal.numero%type )

它可能更容易阅读,并且更清楚哪些参数映射到哪些 table。这也意味着更少的维护,因为当有人决定他们需要增加列的长度时,您不必调整您的 PL/SQL 代码(假设您始终使用锚定类型)。

我也倾向于建议在 aeropuertoterminal table 的定义中使用 id_aeropuertoid_terminal 而不是使用通用 id 每 table 列。这更像是一种风格问题,但我总是发现在加入相同列名以及具有相同名称的列表示相同事物的地方更容易阅读代码。在一堆 table 中拥有相同的 id 列,每个都意味着不同的东西,这让我花更多时间查看代码以确保它没有加入错误的标识符。