【问题标题】:PLSQL Call Procedure If Exists ClausePLSQL Call Procedure If Exists 子句
【发布时间】:2014-09-17 02:48:16
【问题描述】:

我使用的是 Oracle 9i。

提示伪代码!

我有存储过程 A:

PROCEDURE stored_proc_a
IS
BEGIN
    insert into...
END;

那么,我就有了存储过程B:

PROCEDURE stored_proc_b
IS
BEGIN
    stored_proc_a
    WHERE NOT EXISTS (SELECT * FROM...);
END;

从我的伪代码中可以看出,如果给定的行没有 存在于表中。

我找不到任何文档表明 WHERE EXISTS 子句可以与过程调用一起使用(示例显示它与 INSERT、UPDATE 和 DELETE 一起使用)。

我可以将 WHERE EXISTS 与过程调用一起使用吗?如果不能,根据表中没有特定记录来执行过程调用的正确代码是什么?

【问题讨论】:

    标签: sql oracle stored-procedures plsql exists


    【解决方案1】:

    正确的做法如下:

    PROCEDURE stored_proc_b
        IS
            num_rows number;
        BEGIN
            select COUNT(*)  into num_rows
                FROM my_table
                WHERE my_table.xyz = 123; -- (whatever is appropriate)
    
            if num_rows < 1
            then
                stored_proc_a;
            end if;
        END;
    

    感谢Nicholas KrasnovWBAR 在其他帖子中提供的信息。

    【讨论】:

    • 轻微吹毛求疵;我会在您的 SELECT 语句中添加一个附加条件 WHERE ROWNUM
    • 它有效,但我在这里找到了更好的解决方案(至少在我看来):stackoverflow.com/questions/13217600/…
    【解决方案2】:

    实现相同的另一种方法,如果您想为多行调用它并希望在过程 B 中使用表中的数据-

    PROCEDURE stored_proc_b
    IS
    BEGIN
        FOR rec IN (SELECT COL1 FROM <<TABLE1>> T1 WHERE NOT EXISTS (SELECT * FROM <<TABLE2>> T2...WHERE T1.JOIN_COL = T2.JOIN_COL))
        LOOP
            stored_proc_a;
        END LOOP;    
    EXCEPTION
        WHEN OTHERS THEN
        rollback;
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多