2012-12-01 160 views
0

任何機構請幫助我得到下面的代碼錯誤。需要幫助來調試代碼

ORA-06550:線20,列33:

PLS-00306:錯誤數量或類型的在調用參數 '||'

ORA-06550:行20,列12:

PL/SQL:語句被忽略

...條件1:如果我把價值明確我的參數多態光標則沒有到達,直到第二個FOR循環。並在打印完成後執行「Inside」語句。 條件2。如果我把變量作爲參數,那麼它會給出上面提到的錯誤。

DECLARE 
/* First cursor */ 
    CURSOR get_tables IS 
    SELECT DISTINCT * FROM src_table_list tbl ; 
/* Second cursor */ 
    CURSOR get_columns(v_table_name varchar2) IS 
    SELECT SUBSTR (SYS_CONNECT_BY_PATH (column_name, ','), 2) csv 
     FROM (SELECT column_name , ROW_NUMBER() OVER (ORDER BY column_name) rn, 
       COUNT (*) OVER() cnt 
      FROM USER_TAB_COLUMNS where table_name = v_table_name) 
    WHERE rn = cnt 
    -- and col.sn = v_sn 
    START WITH rn = 1 
    CONNECT BY rn = PRIOR rn + 1; 

BEGIN 
FOR i IN get_tables LOOP 
dbms_output.put_line('Inside '); 
    FOR j IN get_columns(i.table_name) LOOP 
     dbms_output.put_line('SELECT '|| j ||'FROM'||i.table_name||' ;'); 
     dbms_output.put_line(' '); 
    END LOOP; 
END LOOP; 
END; 
/

回答

2

您試圖在輸出中連接j,但j是對遊標中行的引用。這是一種不能隱式轉換爲字符串的類型,因此concat失敗。

你大概的意思是寫

dbms_output.put_line('SELECT '|| j.csv || ' FROM ' || i.table_name || ';'); 

PS。你通過連接做什麼?它是否得到逗號分隔值?也許你可以使用LISTAGG, or my custom variant of it

+0

可能是第二個查詢是錯誤的。你有沒有嘗試過,傳遞一個固定的表名?沒有語法錯誤了,但我無法確定你想要它返回什麼。在我的答案的最後一行查看問題+建議。 – GolezTrol

+0

症狀很明顯,所以請仔細閱讀:*行不會被忽略,但第二個遊標不會返回任何行*只要將它寫入查詢中,這使得測試和調試更容易。之後,您可以將其放回到此過程中。 – GolezTrol