如何使用第二个存储过程将oracle存储过程返回的结果集插入到另一个表中?

如何使用第二个存储过程将oracle存储过程返回的结果集插入到另一个表中?,oracle,stored-procedures,Oracle,Stored Procedures,我在oracle中有两个存储过程 第一个存储过程proc1返回表emp中的一些行 在另一个存储过程proc2中,我需要调用proc1并将其结果集插入另一个表中 有没有可能做到这一点,或者有没有其他更好的方法来做到这一点 -- this is proce_2 create or replace PROCEDURE FIND_EMPLOYEES ( IN_REGION_ID IN NUMBER, << more params >> , employee_

我在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;    
您将使用作为常规:

您将使用作为常规:


下面有两个示例可以将一行从EMPLOYEES复制到EMPLOYEES\u copy。 我希望它能帮助你

您可以使用游标和包: 包非常有用,因为您可以将单个实体的函数分组。在这个例子中,我对员工进行了分组

更多信息

您还可以使用以下视图:
下面有两个示例可以将一行从EMPLOYEES复制到EMPLOYEES\u copy。 我希望它能帮助你

您可以使用游标和包: 包非常有用,因为您可以将单个实体的函数分组。在这个例子中,我对员工进行了分组

更多信息

您还可以使用以下视图:
prrc1存储过程的定义是什么?@Nicholas Krasnov。请检查我是否更新了我的问题。prrc1存储过程的定义是什么?@Nicholas Krasnov。请检查我是否已更新我的问题。
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
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;
/
DECLARE
  ID_EMP NUMBER;    
BEGIN
  ID_EMP := 4;
  EMPLOYEE.INSERT_COPY (  ID_EMP => ID_EMP) ;  
  commit;      
END;