[英]function returning empty string when calling from select statement
CREATE OR REPLACE FUNCTION abc (
p_table_name IN VARCHAR2
)
RETURN VARCHAR2
IS
v_var varchar(200);
v_data VARCHAR2 (4000);
CURSOR cur_column_list
IS
SELECT column_name AS col_name
FROM all_tab_cols
WHERE table_name = p_table_name;
BEGIN
open cur_column_list;
loop
fetch cur_column_list into v_var;
exit when cur_column_list%notfound;
v_data := v_data || ' -- ' || v_var;
END LOOP;
RETURN v_data;
EXCEPTION
WHEN OTHERS
THEN
dbms_output.put_line(sqlerrm);
END;
/
從select語句調用時
select abc('pqr') FROM DUAL ;
abc('PQR')
1 row selected.
沒有檢索到輸出,pqr中有40列。
首先,你究竟傳遞給函數的是什么? 您的SELECT
語句顯示您傳遞的是小寫字符串'pqr'。 但是以粗體顯示,您傳遞的是大寫字符串'PQR'。 由於表名以大寫形式存儲在大寫的數據字典中(除非您碰巧使用了帶引號的標識符並指定了小寫表名),並且因為您沒有在查詢中執行UPPER
,這是一個重要的區別。
其次,異常處理程序的目的是什么? 這是沒有意義的趕上,你不能處理並調用異常dbms_output
,客戶端可能會或可能不會發生已經啟用,並可能會或可能不會從緩沖區中讀取dbms_output
寫入。 刪除異常處理程序並查看是否拋出錯誤。
第三,在定義者權限存儲過程中運行的代碼,即無法訪問通過角色授予的權限。 它只能訪問直接授予過程所有者的權限。 如果已通過角色授予過程的所有者對相關表的訪問權限,則可以直接在SQL * Plus會話中查詢ALL_TAB_COLS
並查看表,但如果查詢位於定義者的權限存儲過程中,則不能查看。 在SQL * Plus中,您可以禁用角色以模擬在定義者權限存儲過程中可以訪問的權限
SQL> set role none
然后重試該操作。 如果您無法再在ALL_TAB_COLS
看到預期的數據,則需要授予過程所有者直接訪問表的權限,而不是通過角色。 或者,您可以通過SELECT ANY DICTIONARY
權限授予用戶訪問DBA_TAB_COLS
視圖的權限,並將代碼更改為使用DBA_TAB_COLS
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.