【问题标题】:PL/SQL error: PLS-00103: Encountered the symbol "EXCEPTION"PL/SQL 错误:PLS-00103:遇到符号“EXCEPTION”
【发布时间】:2015-05-26 19:46:52
【问题描述】:

我正在制作一个 PL/SQL 错误处理模板。我收到此错误:'PLS-00103:遇到符号“例外”',我不知道出了什么问题。我们使用的是 Oracle 数据库。

DECLARE
err_num VARCHAR(100); -- We're not gonna do math on this so I made it a string.
err_msg VARCHAR2(100);
program  VARCHAR2(100);
statement VARCHAR2(100);
BEGIN
program := 'assign the program here';
statment := 'assign the statement here';
END;


EXCEPTION


WHEN ACCESS_INTO_NULL
THEN
err_num := SQLCODE;
err_msg := SQLERRM(SQLCODE);
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment, CURRENT_TIMESTAMP);

WHEN CASE_NOT_FOUND
THEN
err_num := SQLCODE;
err_msg := SQLERRM(SQLCODE);
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment, CURRENT_TIMESTAMP);

...

WHEN OTHERS
THEN
err_num := -9999;
err_msg := 'undefined error occurred';
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment, CURRENT_TIMESTAMP);


END;

ERRORS 表是:

CREATE TABLE ERRORS 
(
  ERR_NUM VARCHAR2(100 BYTE) NOT NULL 
, ERR_MSG VARCHAR2(100 BYTE) NOT NULL 
, PROGRAM VARCHAR2(100 BYTE) 
, STATEMENT VARCHAR2(100 BYTE) 
, USER_COMMENT VARCHAR2(100 BYTE) 
, TIMESTAMP DATE NOT NULL 
) 
LOGGING 
TABLESPACE DATAL03 
PCTFREE 10 
INITRANS 1 
STORAGE 
( 
  INITIAL 65536 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOCOMPRESS 
NOPARALLEL;

【问题讨论】:

  • 您希望EXCEPTION 关键字映射到什么?它不是它上面的 PL/SQL 块的一部分。它是否嵌入在此处未提及的外部 PL/SQL 块中?您的例外在哪里定义? access_into_nullcase_not_found 不是内置异常。也许您已经在同一个外部块中定义了它们?为什么不在others 块中使用sqlcode 和/或sqlerrm 函数?
  • 我是新手 - 感谢您的意见。如何使 EXCEPTION 关键字映射到该块?我以为有。我希望它处理上面的BEGINDECLARE 中引发的异常。我会用你所说的关于其他块的东西来修改它。 dba-oracleaccess_into_nullcase_not_found 是内置的,是不是错了?
  • 如果我没记错的话,是DECLARE ... BEGIN ... EXCEPTION ... END;
  • 对。删除第一个 END; 就完成了。

标签: oracle plsql database-administration error-handling


【解决方案1】:

正如其他人在 cmets 中建议的那样,您需要做的就是删除第一个 END,如下所示:

DECLARE
err_num VARCHAR(100); -- We're not gonna do math on this so I made it a string.
err_msg VARCHAR2(100);
program  VARCHAR2(100);
statement VARCHAR2(100);
BEGIN
program := 'assign the program here';
statment := 'assign the statement here';



EXCEPTION


WHEN ACCESS_INTO_NULL
THEN
err_num := SQLCODE;
err_msg := SQLERRM(SQLCODE);
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment,  CURRENT_TIMESTAMP);

WHEN CASE_NOT_FOUND
THEN
err_num := SQLCODE;
err_msg := SQLERRM(SQLCODE);
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment, CURRENT_TIMESTAMP);

...

WHEN OTHERS
THEN
err_num := -9999;
err_msg := 'undefined error occurred';
comment := "assign a comment here";
INSERT INTO ERRORS VALUES (err_num, err_msg, program, statement, comment, CURRENT_TIMESTAMP);


END;

异常部分应该是 PL/SQL 块的一部分,而不是单独的部分。也就是说,它应该包含在 PL/SQL 块的 BEGINEND 语句中

Reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多