下面的代码是自我解释的。我们可以在PL / SQL中的FOR-IN
循环中使用变量吗?
这是必需的,因为FOR-IN
内的查询本质上需要是动态的。
SET SERVEROUT ON;
DECLARE
STMNT varchar2(4000);
SELECT_SQL varchar2(4000);
BEGIN
SELECT_SQL := q'[select table_name from all_tables where owner='EMP' and table_name like 'TEMP_%']';
FOR REC IN (SELECT_SQL) LOOP
dbms_output.put_line (REC.table_name);
END LOOP;
END;
答案 0 :(得分:3)
不,您不能使用for
循环来浏览动态构建的查询返回的结果集。但是,您无法为该动态构建的查询打开refcursor
并使用LOOP
或WHILE
循环结构来完成结果集。这是一个简单的示例,但在您的情况下,根本不需要使用动态SQL :
set serveroutput on;
clear screen;
declare
l_sql_statement varchar2(4000); -- going to contain dynamically built statement
l_rcursor sys_refcursor; -- ref cursor
l_owner varchar2(100); -- variable that will contain owner's name
l_res_tab_name varchar2(100); -- variable we will fetch table name into
begin
l_owner := 'NK';
l_sql_statement := 'select table_name
from all_tables
where owner = :1'; -- bind variable
open l_rcursor for l_sql_statement
using dbms_assert.simple_sql_name(l_owner); -- slight protection from
-- SQL injection
loop
fetch l_rcursor into l_res_tab_name; -- fetch table name from the resultset
exit when l_rcursor%notfound; -- exit, when there is nothing to fetch
dbms_output.put_line(l_res_tab_name); -- print table name
end loop;
end;
结果:
anonymous block completed
TEST1
TEST2
TMP_TEST
ERR$_T1
注意:在这种情况下,考虑根本不使用动态SQL,实际上根本不需要它。表名和列名在编译时是已知的,仅在谓词更改的右侧。