------------------------------------------------------------------------------- -- ex_pl_sqldyn.sql (extraits) -- derniere modif le 29 mai 2018 -- bloc 8b ------------------------------------------------------------------------------- -- ecrire proc p2 qui prend nom fonction et l'applique sur 14 create or replace procedure p2(f varchar2) is texte_ordre varchar2(100); y int; begin -- texte_ordre := 'begin ? := f(14); end;'; -- rappel : approche JDBC texte_ordre := 'begin :1 := '||f||'(14); end;'; dbms_output.put_line(texte_ordre); execute immediate texte_ordre using out y; -- : en utilisant la variable y du programme -- pour y mettre la valeur de retour dbms_output.put_line(y); end; / -- ecrire proc p3 qui prend nom procedure et l'applique sur 14 create or replace procedure p3(p varchar2) is texte_ordre varchar2(100); y int; -- z int si deux variables out begin -- texte_ordre := 'begin p(14, ?); end;'; -- rappel : approche JDBC texte_ordre := 'begin '||p||'(14, :z); end;'; -- si p2(14, :1, :2) dbms_output.put_line(texte_ordre); execute immediate texte_ordre using out y; -- alors using out y, out z dbms_output.put_line(y); end; / create or replace procedure oiseau(x int, y out int) is begin y := x + 1 ; end; / set serveroutput on declare y integer; begin oiseau(14, y); dbms_output.put_line(y); end; / execute p3('oiseau'); ------------------------------------------------------------------------------- create or replace procedure p631(t varchar2) is texte_ordre varchar2(100); x int; y int; begin texte_ordre := 'insert into '||t||' values (:1, :2)'; x := 1; y := 2; execute immediate texte_ordre using x, y; x := 3; y := 4; execute immediate texte_ordre using x, y; execute immediate texte_ordre using 5, 6; end; / execute p631('t'); select * from t; ------------------------------------------------------------------------------- create or replace procedure p632(f varchar2, p varchar2) -- f : int -> int is texte_ordre varchar2(100); x int; y int; begin texte_ordre := 'begin :1 := '||f||'(:2); end;'; execute immediate texte_ordre using out x, 14; dbms_output.put_line(x); execute immediate texte_ordre using out x, -22; dbms_output.put_line(x); texte_ordre := 'begin '||p||'(:1, :2); end;'; execute immediate texte_ordre using 14, out x; dbms_output.put_line(x); execute immediate texte_ordre using -22, out x; dbms_output.put_line(x); end; / execute p632('f1', 'p2'); select * from t; ------------------------------------------------------------------------------- -- ecrire une proc qui prend en entree un login oracle et appelle la fonction -- f de cet utilisateur : create or replace procedure p632(utilisateur varchar2) is texte_ordre varchar2(100); y int; begin -- si p632 recoit 'ewaller_a' -- je veux constuire : 'begin :1 := ewaller_a.f(14); end;'; texte_ordre := 'begin :1 := c##'||utilisateur||'.f(14); end;'; dbms_output.put_line(texte_ordre); execute immediate texte_ordre using out y; dbms_output.put_line(y); end; / exec p632('ewaller_a'); -------------------------------------------------------------------------------