我们可以在FOR-IN循环中使用变量吗?

时间:2014-02-26 12:36:13

标签: oracle plsql

下面的代码是自我解释的。我们可以在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;

1 个答案:

答案 0 :(得分:3)

不,您不能使用for循环来浏览动态构建的查询返回的结果集。但是,您无法为该动态构建的查询打开refcursor并使用LOOPWHILE循环结构来完成结果集。这是一个简单的示例,但在您的情况下,根本不需要使用动态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,实际上根本不需要它。表名和列名在编译时是已知的,仅在谓词更改的右侧。