如何将select语句where子句的值作为输入传递给oracle DB中的函数

时间:2018-04-09 14:30:23

标签: oracle

首先,谢谢你,堆叠器,帮助我解决了我在这里发布的大部分问题!我需要再次帮助。如果我需要进一步澄清,请告诉我。提前致谢。 代码是,

根据效果因素创建了一个流水线查询。

create package pkg_emp
as
  type emprec is record
  ( id int
  , name varchar2(10)
  );

  type tb_emp IS   TABLE OF emprec;    
  function f_emp(id number) return tb_emp PIPELINED;
end pkg_emp;
/

Package created.

 create package body pkg_emp
 as
   function f_emp(p_id) return tb_emp PIPELINED
   is
     out_rec emprec;
   begin
    for i in (select id,name from emp_records where id =p_id) loop
        out_rec.id := i.id;
        out_rec.name := i.name;
        pipe_row(out_rec);
    end loop; 
    return;
   end f_emp;
 end mypkg;
 /

现在,当我使用下面的表函数选择查询时,

 select * from table(pkg_emp.f_emp(100));

记录完美显示

 id         name
 -----      ------
 100        marc
 100        paul
 100        sam
 100        stacker

现在,真正的问题是如何使用where子句动态传递值。

这样的事情,

 select * from table(pkg_emp.f_emp(%id)) where id=30;

注意:我之前提到过%只是为了理解。喜欢用%来表示替换30的值作为函数的输入。

1 个答案:

答案 0 :(得分:1)

尝试使用子查询因子(WITH)子句:

WITH myId AS (
  SELECT 30 As id FROM dual
)
select * from table(pkg_emp.f_emp(myId.id)) where id=myId.id;

也可以使用子查询和交叉应用(在Oracle 12c上):

select x.* 
from (
    SELECT 30 As id FROM dual
) MyId
CROSS APPLY( 
   table(pkg_emp.f_emp(myId.id)) where id=myId.id
) x