如何将参数传递给Oracle存储过程,该存储过程将确定要打开的并行从属进程数

时间:2017-06-19 16:38:02

标签: oracle stored-procedures parallel-processing

在我的存储过程中,我希望Oracle打开的从属进程数是动态的,但每当我执行以下过程时:

CREATE OR REPLACE PROCEDURE PROCEDURE_TEST(Text_Sample VARCHAR2, parallelNumber NUMBER) AS
BEGIN

    DBMS_OUTPUT.PUT_LINE('Hello World!');
    DBMS_OUTPUT.PUT_LINE(Text_Sample);
    DBMS_OUTPUT.PUT_LINE(parallelNumber);
    UPDATE  /*+ parallel(parallelNumber) */  EMPLOYEE SET ID = NULL; 
    ROLLBACK;
END;
/

set serveroutput on;

exec PROCEDURE_TEST('Test', 10);

这个被触发的查询(从历史记录中检查)

UPDATE /*+ parallel(parallelNumber) */ EMPLOYEE SET ID = NULL

因此变量parallelNumber不会在并行提示中被替换。

有没有办法让这个变量通过我提示的一部分?

1 个答案:

答案 0 :(得分:2)

您必须使用动态SQL注入可变程度的并行度:

CREATE OR REPLACE PROCEDURE PROCEDURE_TEST(Text_Sample VARCHAR2, parallelNumber NUMBER) AS
BEGIN

    DBMS_OUTPUT.PUT_LINE('Hello World!');
    DBMS_OUTPUT.PUT_LINE(Text_Sample);
    DBMS_OUTPUT.PUT_LINE(parallelNumber);
    execute immediate
              'UPDATE /*+ parallel(' || parallelNumber || ') */ EMPLOYEE SET ID = NULL'; 
    ROLLBACK;
END;
/

但你不想在现实生活中这样做。大多数情况下,优化器在决定最佳并行度值方面比我们更好。