在我的存储过程中,我希望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不会在并行提示中被替换。
有没有办法让这个变量通过我提示的一部分?
答案 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;
/
但你不想在现实生活中这样做。大多数情况下,优化器在决定最佳并行度值方面比我们更好。