oracle PL/SQL函数结果到表

xzv2uavs  于 2023-03-17  发布在  Oracle
关注(0)|答案(1)|浏览(239)

我当前有一个函数返回一个refcursor。我想将这个函数的结果存储到一个表中(可能是一个临时表),并使用一个列(IVC_CODE)将这些结果与另一个表连接。

CREATE FUNCTION EMP_REFCURSOR_F
  RETURN SYS_REFCURSOR
AS
  v_plan_name plans.plan_name%type;
  v_comp_name companies.comp_name%type;
  v_comp_code companies.comp_code%type;
BEGIN
  RETURN rr400_generate_sip_movement.get_sip_movement(
           137610,
           v_plan_name,
           v_comp_name,
           v_comp_code
         );
END;

提前道歉。希望我的问题是正确的。我真的是PL/SQL的新手。而且我正在使用SQL Developer。

wdebmtf2

wdebmtf21#

这(或多或少)是您所拥有的,也是将函数返回的结果存储到表中所应该做的。
函数(我不想再创建一个返回refcursor的函数):

SQL> create or replace function f_test
  2    return sys_refcursor
  3  is
  4    retval sys_refcursor;
  5  begin
  6    open retval for
  7    select deptno, dname, loc
  8    from dept;
  9
 10    return retval;
 11  end;
 12  /

Function created.

目标表:

SQL> create table temp_rc as select deptno, dname, loc from dept where 1 = 2;

Table created.

SQL> select * from temp_rc;

no rows selected

从函数中检索数据并将其存储到表中的代码:

SQL> declare
  2    l_deptno dept.deptno%type;
  3    l_dname  dept.dname%type;
  4    l_loc    dept.loc%type;
  5    rc       sys_refcursor;
  6  begin
  7    rc := f_test;
  8    loop
  9      fetch rc into l_deptno, l_dname, l_loc;
 10      exit when rc%notfound;
 11      insert into temp_rc (deptno, dname, loc)
 12        values (l_deptno, l_dname, l_loc);
 13    end loop;
 14    close rc;
 15  end;
 16  /

PL/SQL procedure successfully completed.

SQL> select * from temp_rc;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> truncate table temp_Rc;

Table truncated.

所以,是的-它起作用了。再一次:在我看来,你应该这样做:仅使用函数的第7行和第8行***:

SQL> insert into temp_rc (deptno, dname, loc)
  2    select deptno, dname, loc
  3    from dept;

4 rows created.

SQL> select * from temp_rc;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

你的代码可能没那么简单,但是原则应该是一样的--如果可能的话,使用rr400_generate_sip_movement.get_sip_movement背后的代码并直接将数据插入到表中。如果这不可能(也许那个函数非常复杂),那么......现在你知道怎么做了。

相关问题