2017-05-08 52 views
-1

我在oracle pl sql中包含一些脚本,它包含一些sql命令(创建,插入...),并且当某些命令抛出一个错误时,例外。
在我的例外我想显示命令的实际文本,我想知道是否有一个局部变量存储最后一个命令的文本,或者如果是一种方式来存储该文本在我创建的变量。
sql * plus中的一种方法也可以提供帮助。
例如:包含sql命令/语句的实际文本的变量

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; 
+0

你为什么抓住它,你为什么使用PL/SQL块如果你只是跑了一个脚本中的语句作为普通的SQL,至少通过? SQL \ * Plus或SQL Developer,它会一起向您显示语句和错误。 –

+1

@ omatan234,我认为,您唯一的选择是创建一个新变量并存储确切的sql。 –

+0

@AlexPoole在SQL * Plus中运行一个脚本,没有任何例外,捕捉不会给我这个声明。我需要所有在另一个文件中抛出错误的语句。有一种方法可以捕捉异常并使用存储该语句文本的变量? – omatan234

回答

0

http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html

为链接描述上面,你应该使用DBMS_UTILITY.FORMAT_CALL_STACK

要打印它,你可以做DBMS_OUTPUT.PUT_LINE (DBMS_UTILITY.FORMAT_CALL_STACK);

+0

不按OP所要求的方式工作。他需要首先生成异常的sql。 error_stack不会返回。 –

+0

好的一点。改变了我的答案 - format_call_stack应该这样做 –

+0

这仍然不会显示导致错误的语句的文本 - 在问题中插入... ...。 –

0

您可以使用SQLERRM功能如下:

set serveroutput on; 
declare 
consumers_rec consumers%rowtype; 
id_no number := 30; 

begin 
select * into consumers_rec from consumers where CONSUMER_ID=id_no; 
dbms_output.put_line('CONSUMER_NAME' || consumers_rec.CONSUMER_NAME); 
EXCEPTION 
when no_data_found then 
dbms_output.put_line('When input is :' || id_no); 
dbms_output.put_line('ERROR MESSAGE:' || "SQLERRM"); 
dbms_output.put_line('SQLCODE:' || SQLCODE); 
end; 
/

你会看到输出如下:

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

这会给你错误消息,但不会导致它的SQL命令的文本,这是OP要求的。 –

+0

我想你的意思是'dbms_output.put_line('ERROR MESSAGE:'|| SQLERRM);' –

+0

@WernfriedDomscheit - 看起来很不寻常,但它的工作原理如图所示;因为['SQLERRM'是一个函数](https://docs.oracle.com/database/121/LNPLS/sqlerrm_function.htm),它只是一个不必要的引号标识符... –