2014-03-03 39 views
0

哪些錯誤與下面的嵌套循環,它拋出以下錯誤:PL/SQL嵌套循環錯誤

ORA-00936:缺少表達

SET SERVEROUT ON; 
SET FEED OFF; 
DECLARE 
schema_name varchar2(100); 
table_name varchar2(100); 

    BEGIN 

     FOR outer_rec IN (select * from scott.table_list) LOOP 

      FOR inner_rec IN (select a.* from all_tab_columns a where a.column_name =outer_rec.table_name(+) and a.owner='SCOTT' order by a.table_name) LOOP 
      dbms_output.put_line (q'[||]' ||inner_rec.column_name || q'[||'|@@@@|']'); 
      END LOOP; 

     END LOOP; 

    END; 
/
+0

reomve(+)in a.column_name = outer_rec.table_name(+) –

+0

但是爲什麼? 我想要all_tab_columns中的所有列。 反正,刪除(+)不會給出任何輸出。 – contravaluebets

+0

這個(+)很重要,它允許在外連接的情況下outer_rec.table_name不匹配 – Elfentech

回答

0

我會寫這種方式(也,你的變量不使用):

SET SERVEROUT ON; 
SET FEED OFF; 
DECLARE 
    schema_name VARCHAR2(100); 
    table_name VARCHAR2(100); 

    CURSOR c_get_tables IS 
    SELECT * FROM scott.table_list; 

    CURSOR c_get_all(c_name_in IN scott.table_name%TYPE) IS 
    SELECT a.* 
     FROM all_tab_columns a 
    WHERE a.table_name = c_name_in(+) 
     AND a.owner = 'SCOTT' 
    ORDER BY a.table_name; 

BEGIN 

    FOR outer_rec IN c_get_tables 
    LOOP 

    FOR inner_rec IN c_get_all(outer_rec.table_name) 
    LOOP 
     dbms_output.put_line(q'[||]' || inner_rec.column_name || 
          q'[||'|@@@@|']'); 
    END LOOP; 

    END LOOP; 

END; 
/
0

試試這個

SET SERVEROUT ON; 
SET FEED OFF; 
DECLARE 
schema_name varchar2(100); 
table_name varchar2(100); 

BEGIN 

    FOR outer_rec IN (select * from scott.table_list) LOOP 

     FOR inner_rec IN (select a.* from all_tab_columns a where a.table_name =outer_rec.table_name and a.owner='SCOTT' order by a.table_name) LOOP 
     dbms_output.put_line (q'[||]' ||inner_rec.column_name || q'[||'|@@@@|']'); 
     END LOOP; 

    END LOOP; 

END; 

/

1

由於您使用兩個單獨的光標,所以實際上沒有辦法將結果外部連接在一起。一個更好的辦法來處理這將是使用一個單一的光標,做你所需要的都做了,如:

BEGIN 
    FOR aRow IN (select * 
       FROM scott.table_list t 
       LEFT OUTER JOIN all_tab_columns a 
        ON (a.owner = 'SCOTT' AND 
         a.table_name = t.table_name) 
       order by a.table_name) 
    LOOP 
    dbms_output.put_line (q'[||]' || aRow.column_name || q'[||'|@@@@|']'); 
    END LOOP; 
END; 

注意,這也採用了ANSI語法爲左外連接,其優先於舊的Oracle風格((+))語法。

分享和享受。