Oracle 找到子记录时引发异常

Oracle 找到子记录时引发异常,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有一个plsql过程来删除子表和父表中的记录 我想在找到子记录时引发异常 我该怎么做 CREATE OR REPLACE PROCEDURE myproc( p_id number, p_id2 number, p_par3 number) AS BEGIN DELETE FROM child_table WHERE id1 = p_id and par=p_par3; DELETE FROM

我有一个plsql过程来删除子表和父表中的记录

我想在找到子记录时引发异常

我该怎么做

CREATE OR REPLACE PROCEDURE myproc(
    p_id       number,
    p_id2      number,
    p_par3      number)
AS
BEGIN
 DELETE FROM   child_table
            WHERE   id1 = p_id and par=p_par3;

    DELETE FROM   parent_table
            WHERE   no = p_id2;
COMMIT;

EXCEPTION   
    WHEN OTHERS
    THEN
        --raise
END myproc;
/

如果不想捕获异常,请删除异常块

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */
END myproc;
你不必把它们全都抓住()。如果你真的坚持捕捉并重新饲养,你可以使用或:

如果您想更具体一些,并且只捕获子异常,则必须进行编号,因为PL/SQL中不存在此错误:

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
   child_exists EXCEPTION;
   PRAGMA EXCEPTION_INIT(child_exists, -2292); /* raises ORA-02292 */
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */

EXCEPTION
   WHEN child_exists THEN
      -- do something
      RAISE;
END myproc;

如果不想捕获异常,请删除异常块

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */
END myproc;
你不必把它们全都抓住()。如果你真的坚持捕捉并重新饲养,你可以使用或:

如果您想更具体一些,并且只捕获子异常,则必须进行编号,因为PL/SQL中不存在此错误:

CREATE OR REPLACE PROCEDURE myproc(p_id NUMBER, p_id2 NUMBER, p_par3 NUMBER) AS
   child_exists EXCEPTION;
   PRAGMA EXCEPTION_INIT(child_exists, -2292); /* raises ORA-02292 */
BEGIN
   DELETE FROM child_table
    WHERE id1 = p_id
      AND par = p_par3;

   DELETE FROM parent_table WHERE no = p_id2;
   COMMIT; /* do you really want to commit in a procedure? */

EXCEPTION
   WHEN child_exists THEN
      -- do something
      RAISE;
END myproc;
我想在找到子记录时引发异常

亚历山德罗

PS:修改了我的阅读理解能力不足的答案,我想你们想要一个例外,当儿童记录找不到的时候

我想在找到子记录时引发异常

亚历山德罗


PS:修改了我对阅读理解缺陷的回答,我想你想要一个例外,当未找到儿童记录时。

在myproc中是否可能有类似的内容<代码>PRAGMA异常初始化(违反外键,-02291)如果过程中存在commit,您能建议会发生什么吗?当然,尽管我认为删除操作会引发
ORA-02292
,请参阅我的更新。对于用户定义的异常的进一步阅读:COMMIT结束事务,并且应该仅由调用的应用程序(如果不是PL/SQL)或最顶层的过程/语句(如果应用程序是PL/SQL)决定。通过中间过程频繁提交会中断事务流(例如,在批处理中间出现错误时,批处理过程将无法重新启动)。请参阅示例。是的,您是对的,我的应用程序中有一个
executeUpdate
。谢谢。有可能在myproc中有这样的东西吗<代码>PRAGMA异常初始化(违反外键,-02291)如果过程中存在commit,您能建议会发生什么吗?当然,尽管我认为删除操作会引发
ORA-02292
,请参阅我的更新。对于用户定义的异常的进一步阅读:COMMIT结束事务,并且应该仅由调用的应用程序(如果不是PL/SQL)或最顶层的过程/语句(如果应用程序是PL/SQL)决定。通过中间过程频繁提交会中断事务流(例如,在批处理中间出现错误时,批处理过程将无法重新启动)。请参阅示例。是的,您是对的,我的应用程序中有一个
executeUpdate
。谢谢。感谢您的回复,Vincent Malgrat解决方案解决了我的问题。感谢您的回复,Vincent Malgrat解决方案解决了我的问题。谢谢。