【问题标题】:PL/SQL: Can I use procedure inputs directly in the select statement?PL/SQL:我可以直接在 select 语句中使用过程输入吗?
【发布时间】:2014-01-03 19:46:47
【问题描述】:

我试图重构一段代码。我们对表和视图进行了类似的选择,我想在过程中导出选择并将表名用作输入参数。比如:

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: table or view does not exist)。有没有办法评估变量的内容?我想我可以立即执行,但我不想:)

干杯。

【问题讨论】:

  • 如果不想动态声明游标,可以声明两个游标,根据参数值选择打开哪个;取决于您是否担心选择重复或循环内的代码重复?
  • @AlexPoole 我想避免循环中的重复代码,因为无论如何选择都会有所不同。
  • @GunjanShakya 我想我必须使用动态查询。谢谢。

标签: sql oracle plsql


【解决方案1】:

一种可能的方法是使用引用光标(这假定您的视图具有与表完全相同相同的列):

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;

【讨论】:

  • 据我所知,我想我无法避免动态查询。感谢您的帮助:)
猜你喜欢
  • 2011-05-11
  • 2010-09-25
  • 2018-04-29
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2023-03-08
  • 2020-02-27
相关资源
最近更新 更多