Bonjour,
Est-il possible d'écrire et compiler une procédure stockée à l'intérieur d'une procédure stockée ?
Merci pour votre réponse,
Bonjour,
Est-il possible d'écrire et compiler une procédure stockée à l'intérieur d'une procédure stockée ?
Merci pour votre réponse,
Vous voulez parler des procédures locales déclarées au sein d'une procédure et visible uniquement de cette procédure ?
Bonjour,
Je ne connais pas le nom en particulier. Pouvez-vous me pointer vers un lien me donnant la syntaxe pour déclarer de telles procédures locales s'il vous plaît ?
En fait j'ai un script scriptA qui appelle un très grand nombre de fois une procédure stockée procB. Et j'ai besoin d'une petite procédure stockée de log (qui fait une insertion dans une table) qui sera utilisée à la fois dans scriptA et dans procB. Ce scriptA ne sera utilisé que très peu de fois et je ne veux donc pas créer de manière prolongée une procédure de log qui ne sert qu'à ce cas.
Je cherche à savoir où et comment je peux déclarer la procédure insert_log afin d'y avoir accès dans scriptA et dans procB mais qu'il ne reste rien d'autre après l'appel de sciptA dans la base que ma procédure stockée procB.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 scriptA: declare res number; errorText varchar2(32767); begin if (exists(select 1 from ALL_OBJECTS where object_type = 'TABLE' and OBJECT_NAME='logs')) begin drop table logs; else create table logs (id number not null, texte varchar2(4000)); end if; procB(1, 'toto', res, errorText); if res != 0 then insert_log('UPDID ' || To_Char(1) || ' - ' || 'An error occured : ''' || errorText || ''''); else insert_log('UPDID ' || To_Char(1) || ' - ' || 'DONE'); end if; --100.000 times the same piece of code repeated calling procB and analysing its result select * from logs drop table logs; end;
Merci pour votre retour,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 create sequence sLogId nocache; create table logs (id number not null, texte varchar2(4000)); create or replace procedure insert_log (vLog IN VARCHAR2) as PRAGMA AUTONOMOUS_TRANSACTION; begin insert into logs values (sLogId.nextval, vLog); commit; end;
Voici un exemple de procédure locale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 DECLARE -- declare variables and subprograms fname VARCHAR2(20) := 'randall'; lname VARCHAR2(25) := 'dexter'; -- declare a local procedure which can only be used in this block PROCEDURE upper_name ( v1 IN OUT VARCHAR2, v2 IN OUT VARCHAR2) AS BEGIN v1 := UPPER(v1); -- change the string to uppercase v2 := UPPER(v2); -- change the string to uppercase END upper_name; -- start of executable part of block BEGIN DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display initial values upper_name (fname, lname); -- call the procedure with parameters DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display new values END; /
Merci. En reprenant votre exemple où j'ai rajouté l'appel à une procédure stockée procB, est-ce que procB peut utiliser également la procédure upper_name ? Et si ce n'est pas le cas, y a-t-il un moyen d'arriver à faire cela ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 DECLARE -- declare variables and subprograms fname VARCHAR2(20) := 'randall'; lname VARCHAR2(25) := 'dexter'; -- declare a local procedure which can only be used in this block PROCEDURE upper_name ( v1 IN OUT VARCHAR2, v2 IN OUT VARCHAR2) AS BEGIN v1 := UPPER(v1); -- change the string to uppercase v2 := UPPER(v2); -- change the string to uppercase END upper_name; -- start of executable part of block BEGIN DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display initial values upper_name (fname, lname); -- call the procedure with parameters procB();--is there a way procB can use upper_name(...,...) ? DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display new values END; /
Non, la procédure "upper_name" n'est visible que dans le bloc DECLARE et aucunement d'autres procédures externes à ce bloc.
Sinon vous créez un package avec votre procédure de trace et votre script A en rendant visibles les deux des objets externes (Packages, procédures, fonctions, triggers, etc...)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager