【问题标题】:combine string and table type in oracle stored procedure在 oracle 存储过程中组合字符串和表类型
【发布时间】:2021-08-18 17:07:33
【问题描述】:

我对 oracle 存储过程中的一个要求感到震惊,我从 oracle 中的类型表中获取数据,该表有 2 列,现在我需要提取列并在存储过程 where 子句中使用它。

例如,我有一个类型数组 EData 有 2 列 IDName

我可以通过以下方式使用它:

Select * from employees
where ID in (Select ID from table(EData))

但由于一些限制,我将其存储在一个变量中并使用 Execute Immediate 执行

当我将代码组合为字符串时,出现错误无法使用字符串连接使用类型表。

Query := 'Select ID from employees
where ID in (Select ID from' ||' table(EData))'

稍后我将执行如下:

Execute Immediate Query into var_ID;

以上方法无效,不知道如何克服。

试了几天,不胜感激。

【问题讨论】:

  • 为什么不声明一个集合来存储表(Edata)中的所有ID?然后您可以稍后将查询中的所有 id 连接起来。
  • 因为execute immediate 不知道EData 是什么:execute immediate 有自己的执行上下文,除非您通过绑定显式传递变量,否则它与调用者是隔离的。

标签: arrays oracle concatenation


【解决方案1】:

这没有多大意义,但说明了如何做到这一点。注意第 11 和 12 行。

SQL> create or replace type t_row is object (id number, name varchar2(20));
  2  /

Type created.

SQL> create or replace type t_tab is table of t_row;
  2  /

Type created.

SQL> declare
  2    l_tab   t_tab;
  3    l_empno emp.empno%type;
  4    l_query varchar2(200);
  5  begin
  6    select t_row(deptno, dname)
  7      bulk collect
  8      into l_tab
  9      from dept;
 10
 11    l_query := 'select min(empno) from emp where deptno in (select deptno from table(:1))';
 12    execute immediate l_query into l_empno using l_tab ;
 13    dbms_output.put_line(l_empno);
 14  end;
 15  /
7369

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 感谢您的回复,将尝试解决方案并在明天更新,因为我今天完成了我的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-04-03
  • 2012-03-30
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多