PL/SQL处理多个notfound表达式+约束冲突

PL/SQL处理多个notfound表达式+约束冲突,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我有一个与pl/sql相关的问题。 假设我有一个相当长的过程,其中包含一些插入、选择和全部 有没有一种方法,当其中一个选项出现错误时,我可以确切地知道是哪一个错误 假设我有 PROCEDURE processRequests IS P_ID numer; P_NAME varchar2(20); BEGIN SELECT NAME into P_NAME FROM users WHERE ID=P_ID; SELECT NAME into P_NAME FROM users WHERE ID2=

我有一个与pl/sql相关的问题。 假设我有一个相当长的过程,其中包含一些插入、选择和全部

有没有一种方法,当其中一个选项出现错误时,我可以确切地知道是哪一个错误

假设我有

PROCEDURE processRequests IS
P_ID numer;
P_NAME varchar2(20);
BEGIN
SELECT NAME into P_NAME FROM users WHERE ID=P_ID;
SELECT NAME into P_NAME FROM users WHERE ID2=P_ID;
INSERT INTO users (ID,ID2,NAME)values(1,2,'Joe');

END;
我想知道第一个和第二个select何时返回错误并在错误日志表中更新它,如果存在外键、主键等常量,我希望能够捕获这些错误

我尝试过使用not_found异常,但是我不知道错误在哪里

有什么建议吗

致意
Steven James

您必须使用BEGIN END块包装每个查询,并在异常情况下处理错误。对于select语句,如果要防止出现唯一约束,可以在索引上使用“未找到数据”和“重复值”

因此,代码的结构大致如下所示:

BEGIN
--...
  BEGIN
    SELECT NAME into P_NAME FROM users WHERE ID=P_ID;
  EXCEPTION WHEN NO_DATA_FOUND THEN
  -- handle error
  END;

  BEGIN
    INSERT INTO users (ID,ID2,NAME) values(1,2,'Joe');
  EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
  -- handle error
  END;
  --...
  END;

为了补充mkuligowski的答案,如果您有一个很长的块,并且总是希望在异常发生后退出,一个轻量级的替代方法是使用节标记来确定异常发生的位置

PROCEDURE processRequests IS
    P_ID numer;
    P_NAME varchar2(20);
    P_SECTION varchar2(30);
BEGIN
    P_SECTION := 'first select';
    SELECT NAME into P_NAME FROM users WHERE ID=P_ID;
    P_SECTION := 'second select';
    SELECT NAME into P_NAME FROM users WHERE ID2=P_ID;
    P_SECTION := 'first insert';
    INSERT INTO users (ID,ID2,NAME)values(1,2,'Joe');
EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line('Error in section: ' || p_section);
    dbms_output.put_line(dbms_utility.format_error_backtrace);
    raise;
END;

这些是PL/SQL的基础知识。如果您阅读了任何书籍或Oracle文档的一部分,您就会知道。这是你在问之前应该做的第一件事。这方面也有很多视频。例如,看看youtube上Steven Feuerstein频道几乎完美的PL/SQL。