将唯一值插入表中的过程不起作用
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 代码(假设您始终使用锚定类型)。
我也倾向于建议在 aeropuerto
和 terminal
table 的定义中使用 id_aeropuerto
和 id_terminal
而不是使用通用 id
每 table 列。这更像是一种风格问题,但我总是发现在加入相同列名以及具有相同名称的列表示相同事物的地方更容易阅读代码。在一堆 table 中拥有相同的 id
列,每个都意味着不同的东西,这让我花更多时间查看代码以确保它没有加入错误的标识符。
我是这门语言的初学者,我被要求通过过程将一些唯一变量插入表 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 代码(假设您始终使用锚定类型)。
我也倾向于建议在 aeropuerto
和 terminal
table 的定义中使用 id_aeropuerto
和 id_terminal
而不是使用通用 id
每 table 列。这更像是一种风格问题,但我总是发现在加入相同列名以及具有相同名称的列表示相同事物的地方更容易阅读代码。在一堆 table 中拥有相同的 id
列,每个都意味着不同的东西,这让我花更多时间查看代码以确保它没有加入错误的标识符。