【问题标题】:Oracle PL/SQL procedure does not execute insertOracle PL/SQL 过程不执行插入
【发布时间】:2017-10-18 16:20:38
【问题描述】:

我在 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.

但没有任何插入。它不起作用。 任何想法问题出在哪里?

【问题讨论】:

  • 看起来你的目标是找出一条记录是否已经存在,然后只有在一条记录不存在时才插入一行。阅读下面有关如何解决问题的答案,但还要考虑在两列上使用组合键 UNIQUE 索引,这样您就永远不能将具有相同 TypeID、LinkID 值的两行放入。 -- 然后你就可以捕获重复异常,也许做一个更新而不是插入?

标签: plsql toad


【解决方案1】:

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

当您调用 Set_Mod(1,1) 时,如果查询返回一行,则答案将是 v_isExists = 1;如果没有返回行,则答案将是 PL/SQL 异常 NO_DATA_FOUND

因为您没有捕获此异常,所以过程完成但没有插入发生...v_isExists = 0 不会为真,除非您调用 Set_Mod(0,0)。

所以,请查看this documentation 在过程中处理 PL/SQL 异常,并在 SO 中搜索 PL/SQL 异常处理以了解更多详细信息。

【讨论】:

  • 我还建议您不要使用立即执行,而是将插入语句放入异常处理程序并使其全部事务处理。
  • 我要么需要使用您的解决方案,要么将我的查询更改为选择 count(*) 并且它可以工作。事实上,在这种情况下,我永远不会遇到重复插入的情况。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多