我试图重构一段代码。我们在表和视图上执行类似的选择,我想在过程中导出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:表或视图不存在)。有没有办法评估变量的内容?我想我可以立即执行,但我不愿意:)
干杯。
答案 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;