2012-12-01 165 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