簡體   English   中英

函數從select語句調用時返回空字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM