【问题标题】:How to insert result set returned by an oracle stored procedure into another table using second stored procedure?如何使用第二个存储过程将 oracle 存储过程返回的结果集插入到另一个表中?
【发布时间】:2012-09-16 17:00:34
【问题描述】:

我在 oracle 中有两个存储过程。

第一个存储过程proc1,从表emp 返回一些行。

在另一个存储过程proc2 中,我需要调用proc1 并将其结果集插入另一个表。

是否有可能做到这一点,或者有没有其他更好的方法来做到这一点?

-- this is proce_2
create or replace PROCEDURE FIND_EMPLOYEES 
(
  IN_REGION_ID IN NUMBER, 
  << more params >> ,   
  employee_cursor OUT SYS_REFCURSOR
) 
IS 

BEGIN    

    open employee_cursor for 

    select * from employee where <<some conditions>> ;  

END;    

【问题讨论】:

  • 你的prrc1存储过程的定义是什么?
  • @Nicholas Krasnov。请检查我是否更新了我的问题。

标签: oracle stored-procedures


【解决方案1】:

您可以将REF CURSOR 用作常规explicit cursor

SQL> CREATE TABLE employee AS
  2  SELECT rownum id, 'XXX' name
  3    FROM DUAL CONNECT BY level <= 10;
Table created.

SQL> CREATE OR REPLACE PROCEDURE find_employees (
  2    emp_id NUMBER,
  3    employee_cursor OUT SYS_REFCURSOR
  4  ) IS
  5  BEGIN
  6      open employee_cursor for
  7      select * from employee WHERE id = emp_id;
  8  END;
  9  /

Procedure created.

SQL> CREATE OR REPLACE PROCEDURE do_something IS
  2     cc sys_refcursor;
  3     l employee%rowtype;
  4  BEGIN
  5     find_employees(1, cc);
  6     LOOP
  7        FETCH cc INTO l;
  8        EXIT WHEN cc%NOTFOUND;
  9        dbms_output.put_line(l.id||'-'||l.name);
 10     END LOOP;
 11  END;
 12  /
Procedure created.

SQL> EXEC do_something;
1-XXX

【讨论】:

    【解决方案2】:

    下面有两个示例将一行从EMPLOYEES 复制到EMPLOYEES_COPY。 希望对你有帮助。

    你可以使用cursorspackages

    DROP TABLE EMPLOYEES;
    /
    DROP TABLE EMPLOYEES_COPY; 
    /
    CREATE TABLE EMPLOYEES
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    
    insert into EMPLOYEES values(1,'AA','BBB');
    insert into EMPLOYEES values(2,'CC','GGG');
    insert into EMPLOYEES values(3,'EEE','MMM');
    insert into EMPLOYEES values(4,'FFF','ZZZ');
    /
    CREATE TABLE EMPLOYEES_COPY 
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    /
    CREATE OR REPLACE PACKAGE EMPLOYEE as 
    type t_cursor is ref cursor;
    procedure FIND(id_emp int, curEMPLOYEE out t_cursor);
    procedure INSERT_COPY(id_emp int);
    end EMPLOYEE;
    /
    CREATE OR REPLACE PACKAGE BODY EMPLOYEE as
      ---------------------------------------------
     procedure FIND(id_emp int,curEMPLOYEE out t_cursor) as
       begin
          open curEMPLOYEE  for SELECT id, FIRST_NAME, LAST_NAME
                               FROM   EMPLOYEES
                               WHERE id= id_emp;    
       end FIND;
     ---------------------------------------------
     procedure INSERT_COPY(id_emp int) as
       cur t_cursor;
       emp employees%rowtype;
       begin
          FIND(id_emp=>id_emp,curEMPLOYEE=>cur);
            LOOP
        FETCH cur INTO emp;
           EXIT WHEN cur%NOTFOUND;
           insert into EMPLOYEES_COPY
           values(emp.id,emp.FIRST_NAME,emp.LAST_NAME);
       END LOOP;
       end INSERT_COPY;   
    end EMPLOYEE;
    /
    

    包非常有用,因为您可以对单个实体的功能进行分组。例如,我将针对员工的职能分组。

    更多信息

    您还可以使用视图:

    DROP TABLE tempEMPLOYEES;
    /
    DROP TABLE EMPLOYEES;
    /
    DROP TABLE EMPLOYEES_COPY; 
    /
    CREATE TABLE EMPLOYEES
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    
    insert into EMPLOYEES
    values(1,'AA','BBB');
    
    insert into EMPLOYEES
    values(2,'CC','GGG');
    
    insert into EMPLOYEES
    values(3,'EEE','MMM');
    
    insert into EMPLOYEES
    values(4,'FFF','ZZZ');
    /
    
    CREATE TABLE EMPLOYEES_COPY 
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    /
    CREATE GLOBAL TEMPORARY TABLE tempEMPLOYEES (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    ) ON COMMIT DELETE ROWS;
    /
    
    CREATE OR REPLACE PACKAGE EMPLOYEE as 
    procedure INSERT_COPY(id_emp int);
    end EMPLOYEE;
    /
    CREATE OR REPLACE PACKAGE BODY EMPLOYEE as
    ---------------------------------------------
     procedure COPY_TO_TEMP(id_emp int) as
       begin
         insert into tempEMPLOYEES
         SELECT id, FIRST_NAME, LAST_NAME
         FROM   EMPLOYEES
         WHERE id= id_emp;    
       end COPY_TO_TEMP;
     ---------------------------------------------
     procedure INSERT_COPY(id_emp int) as  
       begin
           COPY_TO_TEMP(id_emp);
    
           insert into EMPLOYEES_COPY
           SELECT id, FIRST_NAME, LAST_NAME
           FROM   tempEMPLOYEES;
           --WHERE id= id_emp;  <---You can add this If you need.
    
       end INSERT_COPY;
    
    end EMPLOYEE;
    /
    

    Here 是关于视图的更多信息。

    您可以使用以下方法测试这两个示例:

    DECLARE
      ID_EMP NUMBER;    
    BEGIN
      ID_EMP := 4;
      EMPLOYEE.INSERT_COPY (  ID_EMP => ID_EMP) ;  
      commit;      
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多