Plsql PL/SQL嵌套循环错误

Plsql PL/SQL嵌套循环错误,plsql,Plsql,以下嵌套循环有什么问题,它会引发以下错误: 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.*

以下嵌套循环有什么问题,它会引发以下错误:

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;
/
我会这样写(也不使用变量):

试试这个

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;

/

由于您使用的是两个单独的游标,因此实际上无法将结果连接在一起。更好的处理方法是使用一个光标来完成您需要完成的操作,如:

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样式((+))语法更可取


分享和享受。

reomve(+)在a.column\u name=外部\u rec.table\u name(+)中,但为什么?我想要所有选项卡列中的所有列。无论如何,删除(+)不会给出任何输出。这(+)很重要,它允许外部联接,以防外部表名称不匹配。只有在使用连接两个表时,才能使用外部联接。这里“外部记录表名称”是要查询的变量。不输出是因为您试图在列名中输入表名。可能您的意图是“a.table\u name=外部\u rec.table\u name”
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;