在對oracle的預存程序、函數進行調試時,可能都需要輸出一些調試資訊,oracle內建的DBMS_OUTPUT.PUT_LINE()方法大部分情況下能夠滿足要求,但是如果輸出的內容超過256個字元時,就不支援了,可以採取以下幾種方法:
1.最基本的DBMS_OUTPUT.PUT_LINE()方法。
隨便在什麼地方,只要是BEGIN和END之間,就可以使用DBMS_OUTPUT.PUT_LINE(output);
然而這會有一個問題,就是使用該函數一次最多隻可以顯示255個字元,否則緩衝區會溢出。
此外,函數DBMS_OUTPUT.ENABLE(20000)這種函數,僅僅是設定整個過程的全部輸出緩衝區大小,
而非DBMS_OUTPUT.PUT_LINE()的緩衝區大小。
對於超過255個字元的變數,使用DBMS_OUTPUT.PUT_LINE()方法是沒有效。
DECLARE
OUTPUTVARCHAR2(200);
BEGIN
OUTPUT := '...';--賦值
DBMS_OUTPUT.PUT_LINE(OUTPUT);
END;
2.使用表的方法。
首先建立一張表,然後在PL/SQL中將要輸出的內容插到表中。然後再從表中查看內容。varchar2最長支援4000個字元。
--(1)建立一張表
CREATE TABLE my_output{
ID number(4),
txt varchar2(4000)
);
--(2)將要輸出的內容插到表中
DECLARE
OUTPUT VARCHAR2(4000);
STRSQL VARCHAR2(4500);
CNT NUMBER(4) := 0;
BEGIN
STRSQL := 'delete * from my_output';
EXECUTE IMMEDIATE STRSQL;
OUTPUT := '...'; --賦值
CNT := CNT + 1;
STRSQL := 'Insert into my_output value(cnt,''' || OUTPUT || ''')';--''在單引號中相當於字元'
EXECUTE IMMEDIATE STRSQL;
END;
3.使用輸出檔案的方法。
如果變數非常大,以致連使用表都沒有辦法插入時,只有使用檔案方式了。
--(1)建立一個檔案夾路徑
create or replace directory TMP as '/tmp'; --windows上實驗了好像不行,在linux機器上可以
--(2)輸出到檔案
DECLARE
FILE_HANDLE UTL_FILE.FILE_TYPE;
OUTPUT VARCHAR2(30000);
BEGIN
OUTPUT := "....";
FILE_HANDLE := UTL_FILE.FOPEN('TMP', 'output.txt', 'w', [ 1 - 32767 ]); --四個參數:目錄,檔案名稱,開啟檔案,最大行數(預設為2000)
UTL_FILE.PUT_LINE(FILE_HANDLE, OUTPUT);
UTL_FILE.FCLOSE(FILE_HANDLE);
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20000,
'ERROR:Invalid path for file or path not in INIT.ORA.');
END;
說明:
第3種方法需要通過sys使用者賦予許可權:
GRANT CREATE ANY DIRECTORY TO "FBASE";
grant read, write on directory TMP to "FBASE"; //賦予對TMP路徑的讀寫權限