1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
DROP TABLE tmp;
DROP TABLE tmp2;
--Log table
CREATE TABLE tmp (p1 number);
--Table pour lancer plusieurs fois la function
CREATE TABLE tmp2 (n) AS SELECT rownum FROM all_tables WHERE rownum<500;
--Fonction a lancer
CREATE OR REPLACE FUNCTION PARA_TEST RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DBMS_OUTPUT.PUT_LINE('a');
INSERT INTO TMP (P1) VALUES (12);
COMMIT;
RETURN 42;
END PARA_TEST;
/
CREATE OR REPLACE PROCEDURE MY_PROC1 IS
BEGIN
EXECUTE IMMEDIATE 'SELECT /*+ PARALLEL (P 4) */ PARA_TEST FROM (SELECT n FROM tmp2 WHERE rownum <= 8 )';
END MY_PROC1;
/
CREATE OR REPLACE PROCEDURE MY_PROC2 IS
text varchar2(1000);
BEGIN
text:= 'SELECT /*+ PARALLEL (P 4) */ PARA_TEST FROM (SELECT n FROM tmp2 WHERE rownum <= 8 )';
dbms_output.put_line(text);
execute immediate text;
END MY_PROC2;
/
CREATE OR REPLACE PROCEDURE MY_PROC3 IS
text varchar2(1000);
BEGIN
text:= 'SELECT --+ PARALLEL (P 4)
PARA_TEST FROM (SELECT n FROM tmp2 WHERE rownum <= 8 )';
dbms_output.put_line(text);
execute immediate text;
END MY_PROC3;
/
CREATE OR REPLACE PROCEDURE MY_PROC4 IS
text varchar2(1000);
type t_num is table of number;
N t_num;
BEGIN
text:= 'SELECT --+ PARALLEL (P 4)
PARA_TEST FROM (SELECT n FROM tmp2 WHERE rownum <= 8 )';
dbms_output.put_line(text);
execute immediate text BULK COLLECT INTO N;
END MY_PROC4;
/
CREATE OR REPLACE PROCEDURE MY_PROC5 IS
text varchar2(1000);
type t_num is table of number;
N t_num;
BEGIN
text:= 'SELECT /*+ PARALLEL (P 4) 40*/ PARA_TEST FROM (SELECT n FROM tmp2 WHERE rownum <= 8 )';
dbms_output.put_line(text);
execute immediate text BULK COLLECT INTO N;
END MY_PROC5;
/
SET serveroutput ON
SELECT /*+ PARALLEL (P 4) 40 */ para_test FROM tmp2 P WHERE rownum<=8;
SELECT * FROM tmp;
DELETE FROM tmp;
prompt =============
prompt execute immediate:
exec my_proc1;
SELECT * FROM tmp;
DELETE FROM tmp;
prompt =============
prompt avec text:=
exec my_proc2
SELECT * FROM tmp;
DELETE FROM tmp;
prompt =============
prompt avec text:= et hint --+
exec my_proc3
SELECT * FROM tmp;
DELETE FROM tmp;
prompt =============
prompt avec text:= et hint --+ avec into
exec my_proc4
SELECT * FROM tmp;
DELETE FROM tmp;
prompt =============
prompt avec text:= et hint /*+ avec into */
exec my_proc5
SELECT * FROM tmp;
DELETE FROM tmp; |