这是我尝试做的简化版本,但我们要说我想选择其经理在某个部门的所有员工。我可以使用如下的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)。
答案 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;
/