变量,该变量包含sql命令/语句的实际文本

变量,该变量包含sql命令/语句的实际文本,sql,oracle,plsql,Sql,Oracle,Plsql,我在oracle pl sql中有一个脚本,其中包含许多sql命令(创建、插入…),当某个命令抛出错误时,我会异常捕获它。 在我的例外情况下,我想显示命令的实际文本,我想知道是否有一个局部变量存储上一个命令的文本,或者是否有一种方法将该文本存储在我创建的变量中。 sql*plus中的一种方法也有帮助。 例如: BEGIN INSERT INTO suppliers (supplier_id, supplier_name) VALUES (5000, 'Apple'); EXCEPTION W

我在oracle pl sql中有一个脚本,其中包含许多sql命令(创建、插入…),当某个命令抛出错误时,我会异常捕获它。
在我的例外情况下,我想显示命令的实际文本,我想知道是否有一个局部变量存储上一个命令的文本,或者是否有一种方法将该文本存储在我创建的变量中。
sql*plus中的一种方法也有帮助。
例如:

BEGIN
INSERT INTO suppliers
(supplier_id, supplier_name)
VALUES
(5000, 'Apple');
EXCEPTION
  WHEN OTHERS THEN
  print the variable that contains tha actual text of the sql command
END;

如上面链接中所述,您应该使用
DBMS\u实用程序.FORMAT\u CALL\u STACK

要打印它,可以执行
DBMS\u OUTPUT.PUT\u行(DBMS\u UTILITY.FORMAT\u CALL\u STACK)

您可以使用SQLERRM函数执行以下操作: 您将看到如下输出:

 anonymous block completed
 When input is :30
 ERROR MESSAGE:ORA-01403: no data found
 SQLCODE:100

为什么要捕获它,为什么要使用PL/SQL块?如果您只是在脚本中以纯SQL的形式运行语句,至少通过SQL*Plus或SQL Developer,它会同时显示语句及其错误。@omatan234,我想,您唯一的选择是创建一个新变量并存储准确的sql。@AlexPoole在sql*Plus中运行脚本,没有异常捕获不会给我这个语句。我需要所有在另一个文件中抛出错误的语句。有一种方法可以捕获异常并使用存储语句文本的变量?仅当您使用动态SQL时。您是否仍然在PL/SQL
begin
/
end
中包含这些语句,还是仅在普通SQL中包含这些语句?@AlexPoole我有两个选项。你能给我举个例子吗?它不能按OP的要求工作。他首先需要生成异常的sql。错误\u堆栈没有返回该值。好的,很好。更改了我的答案-format_call_stack应该这样做,它仍然不会显示导致错误的语句的文本-问题中的
插入到…
。这会给出错误消息,但不是导致错误的SQL命令的文本,这是OP要求的。我猜您的意思是
dbms_output.put_行('ERROR MESSAGE:'| | SQLERRM);
@WernfriedDomscheit-这种情况很少见,但它的工作原理如图所示;因为它只是一个不必要的引用标识符。。。
 anonymous block completed
 When input is :30
 ERROR MESSAGE:ORA-01403: no data found
 SQLCODE:100