2017-05-08 60 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),它只是一個不必要的引號標識符... –

相關問題