Plsql PL/SQL嵌套循环错误
以下嵌套循环有什么问题,它会引发以下错误: ORA-00936:缺少表达式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.*
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;