PL / SQL:我可以直接在select语句中使用过程输入吗?

时间:2013-12-16 12:07:51

标签: sql oracle plsql

我试图重构一段代码。我们在表和视图上执行类似的选择,我想在过程中导出select并使用表名作为输入参数。例如:

procedure show_table (
  i_table_name varchar2
)
is
begin
  for c in (
    select *
    from i_table_name
  ) loop
    ...
  end loop;
end;

但是PL / SQL认为i_table_name是一个文字名称(抛出PL / SQL:ORA-00942:表或视图不存在)。有没有办法评估变量的内容?我想我可以立即执行,但我不愿意:)

干杯。

1 个答案:

答案 0 :(得分:3)

一种可能的方法是使用引用游标(假设您的视图与表完全相同列):

create table test_tab(pk number, value varchar2(30));
insert into test_tab values (1, 'hello');
create view test_view as select pk, value || '_view' as value from test_tab;

declare
  procedure show_table(i_table_name varchar2) is
    cur sys_refcursor;  
    rec test_tab%rowtype;
  begin
    open cur for 'select * from ' || i_table_name;
    loop
      fetch cur into rec;
      exit when cur%notfound;
      dbms_output.put_line(rec.pk ||' ' || rec.value);
    end loop;
  end;
begin
  show_table('TEST_TAB');
  show_table('TEST_VIEW');
end;