有没有办法在'FROM'子句中使用PLSQL变量?

时间:2013-07-29 06:16:03

标签: oracle plsql

嗨有没有办法在from子句中使用PL sql变量? 我正在使用下面的代码,但我在选择语句中收到“表未找到”

的错误
declare 
--var varchar2(20);
cursor cur is
    select table_name from my_tables where table_name like 'RATED%';
    v_rows cur%rowtype;
--V_name varchar2(20);
begin
    open cur;
    loop
        fetch cur into v_rows;  
            exit when cur%NOTFOUND;
            select * from v_rows.table_name;  --here i am getting error.
   end loop;
 end;

2 个答案:

答案 0 :(得分:0)

您可以使用动态sql:

excute immediate 'select * from ' || v_rows.table_name;

请查看execute immediateDBMS_SQL的{​​{3}}以了解动态sql。

要从此类查询中获取结果,您必须使用显式游标(也在上述说明中进行了解释)。

答案 1 :(得分:0)

不,这是不可能的。您不能将变量用作表或模式名称。 您必须使用本机动态SQL或DBMS_SQL。

另外,你不能在PL / SQL中使用普通的'SELECT * from v_rows.table_name' - 你需要一个INTO子句(一个“目标”,你可以放置SELECT的结果)。

这是一个让你走上正确轨道的例子:

create table my_tables as select table_name as table_name from user_tables;

declare
  cursor cur is
    select table_name
      from my_tables
       where table_name like 'RATED%';
  v_rows cur%rowtype;
  v_cnt  pls_integer;
  v_SQL varchar2(4000);
begin
  open cur;
  loop
    fetch cur into v_rows;
    exit when cur%NOTFOUND;
    v_SQL := 'select count(*) from ' || v_rows.table_name;
    -- debug output
    dbms_output.put_line(v_SQL);
    EXECUTE IMMEDIATE v_SQL INTO v_cnt;
    dbms_output.put_line(v_rows.table_name || ' : ' || v_cnt);
  end loop;
end;