oracle PL/SQL连接包函数结果与另一个select语句结果

0mkxixxg  于 2023-03-17  发布在  Oracle
关注(0)|答案(3)|浏览(129)

我有一个select语句,如下所示

SELECT 
    PLN.PLAN_NAME,
    HON.IVC_CODE,
    HON.FORENAME,
    HON.SURNAME,
    HON.SALUTATION
    FROM PLANS  PLN
    INNER JOIN COMPANIES COMP ON
    COMP.COMP_CODE = PLN.COMP_CODE
    INNER JOIN TRADING_STOCK_EXCHANGES TSE ON
    TSE.COMP_CODE = COMP.COMP_CODE
    INNER JOIN FINANCE_ORGANISATIONS FORG ON
    FORG.FINANCE_ORG_ID = TSE.FINANCE_ORG_ID
    INNER JOIN HOLDER_NAMES HON ON
    HON.COMP_CODE = PLN.COMP_CODE
    WHERE FORG.FINANCE_ORG_TYPE_CODE = 'SE' AND 
    COMP.COMP_CODE = 'B598' AND
    --HON.FORENAME LIKE '%g%' AND
    FORG.ORG_NAME IN ('NASDAQ','NEW YORK STOCK EXCHANGE');

这很有效,我可以看到结果。
我有一个包函数rr400_generate_sip_movement.get_sip_movement,它接受一个In参数和树输出参数。

declare        
          po_plan_name VARCHAR2(10 CHAR);
          po_client_comp_name VARCHAR2(50 CHAR);
          po_comp_code VARCHAR2(10 CHAR);  
          rc sys_refcursor;
          ab sys_refcursor;
        begin
            rc := rr400_generate_sip_movement.get_sip_movement(137610, po_plan_name, po_client_comp_name, po_comp_code);
             
       end;

当我运行这个命令时,我看到一条消息PL/SQL语句成功完成。我假设PL/SQL块是好的。
我想做的是将程序包函数的结果与我在IVC_CODE(每个选择语句的列名)上的选择语句结果连接起来。我只对程序包函数中的IVC感兴趣。
任何帮助都是非常感谢的。对不起,我是PL/SQL的新手。我已经尝试了一些方法,并根据@littlefoot在我的另一个问题中的建议
PL/SQL函数结果到表
这种方法可能是一种更干净、更整洁的方法。

cnwbcb6i

cnwbcb6i1#

我已经有一段时间没有使用Oracle了,但是通过从函数返回一个类型并使用table关键字应该是可行的。

ugmeyewa

ugmeyewa2#

如果我没理解错的话,函数返回refcursor(默认情况下)和3个OUT参数(可以存储到变量中),因为您希望在另一个查询中使用它们(变量),所以refcursor包含什么内容是无关紧要的。
这里有个例子这是一个模拟rr400_generate_sip_movement.get_sip_movement的函数(不过我只返回一个OUT值):

SQL> CREATE OR REPLACE FUNCTION f_test (par_deptno  IN     NUMBER,
  2                                     par_job        OUT VARCHAR2)
  3     RETURN SYS_REFCURSOR
  4  AS
  5     rc  SYS_REFCURSOR;
  6  BEGIN
  7     par_job := 'CLERK';
  8
  9     OPEN rc FOR SELECT empno, ename, job
 10                   FROM emp
 11                  WHERE deptno = par_deptno;
 12
 13     RETURN rc;
 14  END;
 15  /

Function created.

让我们利用它;读取代码中的注解:

SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     l_deptno  NUMBER := 10;   --> IN parameter to the function
  3     rc        SYS_REFCURSOR;  --> that's what function returns
  4     l_job     VARCHAR2 (10);  --> OUT parameter
  5     l_cnt     NUMBER;         --> local variable (for joining / filtering purposes)
  6  BEGIN
  7     rc := f_test (l_deptno, l_job);
  8
  9     DBMS_OUTPUT.put_line ('refcursor contents (along with PAR_JOB): ');
 10
 11     FOR cur_r IN (SELECT ename, job, sal
 12                     FROM emp
 13                    WHERE job = l_job)
 14     LOOP
 15        DBMS_OUTPUT.put_line (cur_r.ename || ' ' || cur_r.job);
 16     END LOOP;
 17
 18     -- join variable returned by function in another query
 19     SELECT COUNT (*)
 20       INTO l_cnt
 21       FROM emp e
 22      WHERE e.job = l_job;      --> L_JOB is consumed here
 23
 24     DBMS_OUTPUT.put_line ('Number of ' || l_job || ' employees: ' || l_cnt);
 25  END;
 26  /
refcursor contents (along with PAR_JOB):
SMITH CLERK
ADAMS CLERK
JAMES CLERK
MILLER CLERK
Number of CLERK employees: 4

PL/SQL procedure successfully completed.

SQL>
b09cbbtk

b09cbbtk3#

从我对这个问题的理解来看,我认为在您的情况下,使用流水线函数可能会更好,而不是返回游标。Oracle Doc:https://blogs.oracle.com/connect/post/pipelined-table-functions#:~:text=管道化的表函数是某个东西,SELECT语句的子句

--written in pseudo-code it would be something along the lines of:
--in your package:
create function xyz(<params>) return <table_type> pipelined
is
--<fill data> multiple examples given in the docs
  pipe row('abc');
  return;
end;
--

--select statement
So in your case it would look sth along the lines of
select <query#1>
<join> table(package.xyz(<params>)
where <condition>;

但要小心:table()函数喜欢吞下no_data_found异常而不引发它们!这将导致一个空的数据集/表!

相关问题