Plsql Oracle PL/SQL过程不执行insert

Plsql Oracle PL/SQL过程不执行insert,plsql,toad,Plsql,Toad,我有一个程序,在TOAD中,应该在检查记录不存在后插入一个新记录。 它成功地创建了: CREATE OR REPLACE PROCEDURE Set_Mod ( p_TypeID IN NUMBER, p_LinkID IN NUMBER ) AS v_isExists NUMBER := 0; v_query varchar2(200); BEGIN SELECT TypeID INTO v_isExists FROM myTab

我有一个程序,在TOAD中,应该在检查记录不存在后插入一个新记录。 它成功地创建了:

CREATE OR REPLACE PROCEDURE Set_Mod ( 
    p_TypeID IN NUMBER, p_LinkID IN NUMBER
    ) 
AS
    v_isExists NUMBER := 0;
    v_query varchar2(200);
BEGIN

    SELECT TypeID 
    INTO v_isExists
    FROM myTable
    WHERE  LinkID = p_LinkID 
    AND TypeID =  p_TypeID;

    IF (v_isExists = 0) THEN
       v_query := 'INSERT INTO myTable ( TypeID, LinkID ) VALUES (' || p_TypeID || ',' || p_LinkID || ')';

       EXECUTE IMMEDIATE v_query;   

    END IF;

END;

/
我正在尝试使用以下块运行此过程:

    BEGIN
         Set_Mod( 1, 1 );

    END;
/
我在TOAD中获得这些脚本输出:

Procedure created.
PL/SQL procedure successfully completed.
但没有任何插入。它不起作用。
你知道问题出在哪里吗?

所以你的程序逻辑是(某种程度上)合理的,但是你的测试逻辑不是:

调用Set_Mod(1,1)时,如果查询返回一行,则答案将是
v_isExists=1
,如果没有返回行,则答案将是PL/SQL异常
NO_DATA\u FOUND

由于未捕获此异常,因此过程将完成,但不会发生插入
v_isExists=0
将不为真,除非调用Set_Mod(0,0)


所以,请查看有关在过程中处理PL/SQL异常的内容,并搜索PL/SQL异常处理以了解更多详细信息。

我还建议您不要使用execute immediate,而是将insert语句放入异常处理程序中,并使其具有事务性。我需要使用您的解决方案或将查询更改为选择count(*)它是有效的。事实上,在这种情况下,我将永远不会面临重复插入的情况。感谢您的目标是找出记录是否已经存在,然后仅在不存在记录时插入一行。请阅读下面的关于如何修复错误的答案,但也要考虑两个列上的组合密钥唯一索引,这样就永远不能用相同的Type ID、LIKID值来放置两行。然后您可以捕获复制异常,或许可以执行更新而不是插入?