Plsql Oracle PL/SQL过程不执行insert
我有一个程序,在TOAD中,应该在检查记录不存在后插入一个新记录。 它成功地创建了: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
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值来放置两行。然后您可以捕获复制异常,或许可以执行更新而不是插入?