如何将一组Oracle子程序中的一组结果返回给另一个子程序?

时间:2017-09-01 16:54:40

标签: sql oracle stored-procedures plsql

这是我尝试做的简化版本,但我们要说我想选择其经理在某个部门的所有员工。我可以使用如下的SQL查询:

SELECT employees.id
  FROM employees
 WHERE employees.manager IN (SELECT managers.id
                               FROM managers
                              WHERE managers.dept = 12)
;

但是,我想说我想将经理子查询抽象为PL / SQL子程序。我该怎么做?
我使用过的存储过程(主要是由其他开发人员编写)往往会有PHP调用代码映射到PHP数组的参数。我没有任何从另一个存储过程中调用存储过程的经验。

我想做的是做这样的事情:

SELECT employees.id
  FROM employees
 WHERE employees.manager IN my_stored_procedure(12)
;

然后my_stored_procedure将输出输入参数的经理ID集(在此示例中为12)。

3 个答案:

答案 0 :(得分:2)

不可能完全按照您的发布做,但如果管理器的选择不简单,您可以通过视图对其进行抽象,或者使用返回表的函数,如下所示:

SELECT employees.id
  FROM employees
 WHERE employees.manager IN (SELECT * from TABLE(get_managers_from_dept(12)));

在此链接中有一个示例: Function or Procedure for an IN clause

答案 1 :(得分:0)

要从另一个存储过程中调用存储过程,您只需从主过程调用它,如下所述。可以通过PHP代码调用/启动此主程序。

PROCEDURE some_sp
       AS
       BEGIN
          some_other_sp('parm1');
       END;

答案 2 :(得分:0)

虽然不那么简单,但您可以使用动态sql完成它。这是存储过程的结构。它返回给定部门的逗号分隔的manager_ids列表。

CREATE OR REPLACE FUNCTION my_stored_procedure(
    p_dept NUMBER)
  RETURN VARCHAR2
IS
  v_manager_list VARCHAR2(1000);
BEGIN
  SELECT m.id INTO v_manager_list FROM managers m WHERE m.dept = p_dept;
  RETURN '('||v_manager_list||')';
EXCEPTION
WHEN NO_DATA_FOUND THEN
  RETURN '(NULL)';
END;
/

现在你不能用它直接查询为...IN my_stored_procedure(12), 相反,你必须使用动态提取到集合中。

SET SERVEROUTPUT ON;
DECLARE
TYPE v_emp_type
IS
  TABLE OF employees.id%TYPE;
  v_emp v_emp_type;
BEGIN
  EXECUTE IMMEDIATE 'SELECT employees.id 
FROM employees 
WHERE employees.id IN '|| my_stored_procedure(100) BULK COLLECT INTO v_emp ;
  FOR i IN v_emp.FIRST..v_emp.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE(v_emp(i));
  END LOOP;
END;
/