IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

procedure execute immediate problème plantage


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut procedure execute immediate problème plantage
    Bonjour,

    J'essaye de créer une fonction générique que je dois appeler souvent
    dans le coeur de mon programme .
    function lookup-generique(nomdetable,colonne,erreur0,erreur1)

    bref voici le prog
    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
    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
     
       FUNCTION lookup_generique (
          p_table VARCHAR2,
          p_colonne VARCHAR2,
          p_var varchar2,
    	  p_error_0   IN INTEGER,
    	  p_error_1   IN INTEGER
       )
       RETURN BOOLEAN
       IS
          myquery   VARCHAR2 (4000);
          istrue    BOOLEAN  default TRUE;
       BEGIN
          myquery := 'CREATE OR REPLACE FUNCTION proc_gen RETURN BOOLEAN IS';
          myquery := myquery || 'local_gen ' || p_table || '.' || p_colonne || '%TYPE;';
          myquery := myquery || 'cursor  cursor_gen is select distinct '|| p_colonne||' from '|| p_table|| ';';
          myquery := myquery || 'type tref_gen is table of '|| p_table||'.'|| p_colonne||'%type;';
          myquery := myquery || 'var_gen tref_gen;';
    	  myquery := myquery || 'istrue boolean := true;';
    	  myquery := myquery || 'begin';
    	  myquery := myquery || 'if local_apprenti.'||p_colonne||'is null then';
    	  myquery := myquery || 'insert into apprenti_upload_error(ara_apprenti_pk,numero_uai,'||p_colonne||')';
    	  myquery := myquery || 'values(local_apprenti.apprenti_pk,apprenti.numero_uai,local_apprenti.'||p_var
    	  		  	 		 || '(select from description from apprenti_type_error where type_error_pk='||p_error_0||';';
    	  myquery := myquery || 'return false;';
    	  myquery := myquery || 'else';
    	  myquery := myquery || 'open cursor_gen;';
    	  myquery := myquery || 'fetch cursor_gen bulk collect into var_gen;';
    	  myquery := myquery || 'close cursor_gen;';
    	  myquery := myquery || 'for i in var_gen.FIRST .. var_gen.LAST';
    	  myquery := myquery || 'loop';
    	  myquery := myquery || ' if local_apprenti.'||p_colonne||'=var_gen(i) then';
    	  myquery := myquery || '   return true;';
    	  myquery := myquery || ' end if;';
    	  myquery := myquery || 'end loop;';
    	  myquery := myquery || 'insert into apprenti_upload_error(apprenti_pk,numero_uai,'||p_colonne||')';
    	  myquery := myquery || 'values(local_apprenti.apprenti_pk,local_apprenti.numero_uai,local_apprenti.'||p_var
    	  		  	 		 || '(select from description from apprenti_type_error where type_error_pk='||p_error_1||';';
    	  myquery := myquery || 'return false;';
    	  myquery := myquery || 'end if;';
    	  myquery := myquery || 'end proc_gen';
     
     
    	  execute immediate 'begin'||myquery||'(:1,:2,:3,:4);end;'
    	  		  into istrue
    	  		  using p_table,p_colonne,p_error_0,p_error_1 
    			  ;
     
    	  return istrue;
       END lookup_generique;
    mais tout plante quand je fais un appel ???????

    l'appel en question ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (NOT lookup_generique('N_STATUT','CODE',12,15)) then ....
    et là impossible de prendre la main sous Toad.
    Je teste les SetBreakpoints mais sans succès.

    Ah oui l'erreur : ORA-03113: fin de fichier sur canal de communication


    Par contre impossible d'afficher myquery dans une sortie DBMS_OUTPUT m'affiche une erreur de taille .
    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pour débugguer de l'exécute immediate, fais un DBMS_OUTPUT (faudra découper la chaine)

    Edit : J'avais pas vu la dernière ligne :
    Fais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE
    	v_chaine VARCHAR2(500) := LPAD('a', 500, 'A');
    	v_c VARCHAR2(500);
    BEGIN
    	v_c := v_chaine;
    	WHILE v_c IS NOT NULL
    	LOOP
    		DBMS_OUTPUT.PUT_LINE(SUBSTR(v_c,1,255));
    		v_c := SUBSTR(v_c, 256);
    	END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Le Error Messages dit:

    ORA-03113: end-of-file on communication channel
    Cause: The connection between Client and Server process was broken.
    Action: There was a communication error that requires further investigation. First, check for network problems and review the SQL*Net setup. Also, look in the alert.log file for any errors. Finally, test to see whether the server process is dead and whether a trace file was generated at failure time
    En pratique, ORA-03113 est souvent lié à un bug côté serveur: voir le fichier alert.log de l'instance et vérifiez s'il n'y pas une erreur du type ORA-07445 et un fichier trace généré côté serveur.

    PS: précisez votre version Oracle.

  4. #4
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Il faut rajouter un espace après le IS du Create or replace function ...
    Il faut rajouter un espace après le begin
    Il faut rajouter un espace après le Local_Apprenti.Colonne
    Il faut rajouter un espace après le then
    donc, il faut rajouter un espace après chaque chaine de caractère pour éviter ce genre de désagrément

    Tu fais un insert dans la table APPRENTI_UPLOAD_ERROR pour 3 champs (ara_apprenti_pk, numero_uai , p_colonne) mais tu définis 4 valeurs apparemment (local_apprenti.apprenti_pk, apprenti.numero_uai, local_apprenti.p_var, et le select)
    Dans le select depuis ta table description, il n'y a pas de définition de la ou les colonnes à ramener

    Pour revoir ton code, j'ai fait:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    DECLARE
    myquery VARCHAR2(4000);
    p_table VARCHAR2(25):='TABLE';
    p_colonne VARCHAR2(25):='COLONNE';
    p_var VARCHAR2(25) := 'VAR';
    p_error_1 VARCHAR2(25) := 'ERROR1';
    p_error_0 VARCHAR2(25) := 'ERROR0';
    BEGIN
     
     myquery := 'CREATE OR REPLACE FUNCTION proc_gen RETURN BOOLEAN IS';
          myquery := myquery || 'local_gen ' || p_table || '.' || p_colonne || '%TYPE;';
          myquery := myquery || 'cursor  cursor_gen is select distinct '|| p_colonne||' from '|| p_table|| ';';
          myquery := myquery || 'type tref_gen is table of '|| p_table||'.'|| p_colonne||'%type;';
          myquery := myquery || 'var_gen tref_gen;';
          myquery := myquery || 'istrue boolean := true;';
          myquery := myquery || 'begin';
          myquery := myquery || 'if local_apprenti.'||p_colonne||'is null then';
          myquery := myquery || 'insert into apprenti_upload_error(ara_apprenti_pk,numero_uai,'||p_colonne||')';
          myquery := myquery || 'values(local_apprenti.apprenti_pk,apprenti.numero_uai,local_apprenti.'||p_var
                                  || '(select from description from apprenti_type_error where type_error_pk='||p_error_0||';';
          myquery := myquery || 'return false;';
          myquery := myquery || 'else';
          myquery := myquery || 'open cursor_gen;';
          myquery := myquery || 'fetch cursor_gen bulk collect into var_gen;';
          myquery := myquery || 'close cursor_gen;';
          myquery := myquery || 'for i in var_gen.FIRST .. var_gen.LAST';
          myquery := myquery || 'loop';
          myquery := myquery || ' if local_apprenti.'||p_colonne||'=var_gen(i) then';
          myquery := myquery || '   return true;';
          myquery := myquery || ' end if;';
          myquery := myquery || 'end loop;';
          myquery := myquery || 'insert into apprenti_upload_error(apprenti_pk,numero_uai,'||p_colonne||')';
          myquery := myquery || 'values(local_apprenti.apprenti_pk,local_apprenti.numero_uai,local_apprenti.'||p_var
                                  || '(select from description from apprenti_type_error where type_error_pk='||p_error_1||';';
          myquery := myquery || 'return false;';
          myquery := myquery || 'end if;';
          myquery := myquery || 'end proc_gen';
    dbms_output.put_line(myquery);
    END;
    ensuite, je l'ai passé dans un outil permettant la mise en forme du code (Toad, PLSQL Developper ...)

  5. #5
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut pb de package
    bonjour,

    Vous aviez raison, j'ai enfin l'affichage qui marche
    par contre cela plante toujours après.

    Je traine toujours d'autres pb, je pense avoir mis le doigt sur un bug.
    Error ORA-07445
    j'attends une réponse de mon admin
    Ma procédure crée une autre procèdure dans le schéma de base
    et pas dans pon package GESTION

    create or replace myproc ....

    faudrait que je la crée dans le meme package ...?

    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    redonne la version débugguée de ta fonction stp.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut ok voici mon code débuggué
    Version N+1

    En fait je désirais que la procédure se crée dans la package GESTION et pas ailleurs ...



    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
    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
     
    create or replace package GESTION.....
     
     
         /*****************************************************************
       Procedure genérique pour leq gestion des erreurs
       ******************************************************************/
       function lookup_generique(p_table VARCHAR2,p_colonne VARCHAR2,p_var varchar2,p_error_0 IN INTEGER,p_error_1 IN INTEGER)
       RETURN BOOLEAN
       IS
          myquery   VARCHAR2 (4000);
          istrue    BOOLEAN  default TRUE;
    	  v_c VARCHAR2(4000);
     
       BEGIN
     
     
    	  myquery := 'CREATE OR REPLACE FUNCTION proc_gen RETURN BOOLEAN IS ';
          myquery := myquery || 'local_gen ' || p_table || '.' || p_colonne || '%TYPE; ';
          myquery := myquery || 'cursor  cursor_gen is select distinct '|| p_colonne||' from '|| p_table|| ' ; ';
          myquery := myquery || 'type tref_gen is table of '|| p_table||'.'|| p_colonne||'%type; ';
          myquery := myquery || 'var_gen tref_gen; ';
    	  myquery := myquery || 'istrue boolean := true; ';
    	  myquery := myquery || 'begin ';
    	  myquery := myquery || 'if local_apprenti.'||p_colonne||' is null then ';
    	  myquery := myquery || 'insert into apprenti_upload_error(apprenti_pk,numero_uai,'||p_var||') ';
    	  myquery := myquery || 'values (local_apprenti.apprenti_pk,local_apprenti.numero_uai,'
    	  		  	 		 || '(select from description from apprenti_type_error where type_error_pk='||p_error_0||'));';
    	  myquery := myquery || 'return false; ';
    	  myquery := myquery || 'else ';
    	  myquery := myquery || 'open cursor_gen; ';
    	  myquery := myquery || 'fetch cursor_gen bulk collect into var_gen; ';
    	  myquery := myquery || 'close cursor_gen; ';
    	  myquery := myquery || 'for i in var_gen.FIRST .. var_gen.LAST ';
    	  myquery := myquery || 'loop ';
    	  myquery := myquery || ' if local_apprenti.'||p_colonne||'=var_gen(i) then ';
    	  myquery := myquery || '   return true; ';
    	  myquery := myquery || ' end if; ';
    	  myquery := myquery || 'end loop; ';
    	  myquery := myquery || 'insert into apprenti_upload_error(apprenti_pk,numero_uai,'||p_var||') ';
    	  myquery := myquery || 'values (local_apprenti.apprenti_pk,local_apprenti.numero_uai,'
    	  		  	 		 || '(select from description from apprenti_type_error where type_error_pk='||p_error_1||'));';
    	  myquery := myquery || 'return false; ';
    	  myquery := myquery || 'end if; ';
    	  myquery := myquery || 'end proc_gen; ';
     
     
    	  v_c := myquery;
    	  while v_c is not null
    	  loop
    	  	  dbms_output.put_line(substr(v_c,1,255));
    		  v_c := substr(v_c,255);
    	  end loop;
     
      	  execute immediate 'begin'||myquery||'(:1,:2,:3,:4,:5);end;'
      	  		  into istrue
      	  		  using p_table,p_colonne,p_var,p_error_0,p_error_1 
      			  ;
     
    	  return istrue;
       END lookup_generique;

    En plus c'est plutot violent, j'ai sous Toad des erreurs 007445 bref après meme quand je désactive le execute immediate , l'affichage ne fonctionne plus toad est dans les choux.

    bref je rame..

    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  8. #8
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut ouille j'ai un doute
    j'ai un doute sur la structure de mon execute immediate
    le nombre de paramètres

    merci olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Myquery est un ordre de CREATION de fonction, pas d'EXECUTION
    Donc déjà ça marchera jamais.

    Il faut faire un execute immediate de l'ordre,
    puis refaire un execute immediate de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	EXECUTE IMMEDIATE myquery;
    	EXECUTE IMMEDIATE 'begin :1 := proc_gen; end;' USING OUT istrue;
    Bon, il y a peut être plus simple sans créer de fonction, je regarde

    EDIT : Correction de l'appel de la fonction par execute
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut mode natif essai
    bonjour,
    je viens de tenter en mode natif et la ...
    SQL> ed
    écrit file afiedt.buf

    1 BEGIN
    2 SIFAGESTION.MAINARA();
    3* END;
    SQL> /
    BEGIN
    *
    ERREUR à la ligne 1 :
    ORA-04068: état de packages existant rejetés
    ORA-04061: état existant de package body "SIFA2.SIFAGESTION" invalidé
    ORA-04065: package body "SIFA2.SIFAGESTION" a été modifié ou abandonné - non
    exécuté
    ORA-06508: PL/SQL : Impossible de trouver unité de programme appelé
    ORA-06512: à ligne 2

    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    vérifie ton package, il doit être compilé avec erreurs.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait je désirais que la procédure se crée dans la package GESTION et pas ailleurs
    C'est pas possible, tu peux pas recréer un package à partir de ce même package !
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  13. #13
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Citation Envoyé par nathieb Voir le message
    ERREUR à la ligne 1 :
    ORA-04068: état de packages existant rejetés
    ORA-04061: état existant de package body "SIFA2.SIFAGESTION" invalidé
    ORA-04065: package body "SIFA2.SIFAGESTION" a été modifié ou abandonné - non
    exécuté
    ORA-06508: PL/SQL : Impossible de trouver unité de programme appelé
    ORA-06512: à ligne 2

    olivier
    Ces erreurs peuvent être dues au fait que le package a des variables globales qui sont des variables de session (voir la discussion ) . Si vous relancez le même code, l'erreur devrait disparaître.

  14. #14
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par McM Voir le message
    C'est pas possible, tu peux pas recréer un package à partir de ce même package !
    Alors à quoi sert le execute immediate ?

    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
    24
    25
    26
    27
     
    CREATE OR REPLACE PACKAGE LOYD_TST AS
    PROCEDURE CREATE_FUNC;
    END loyd_tst;
    /
    > Package Créé
     
    CREATE OR REPLACE PACKAGE BODY loyd_tst AS
    PROCEDURE CREATE_FUNC IS
    sql_stmt VARCHAR2(255) := 'CREATE OR REPLACE FUNCTION HeyWord RETURN VARCHAR2 IS BEGIN RETURN ''HeyWord''; End HeyWord;';
    BEGIN
    EXECUTE IMMEDIATE sql_stmt;
    END create_func;
    END loyd_tst;
    /
    > Corps de package Créé
     
    BEGIN
    loyd_tst.CREATE_func;
    END;
    /
    > Procedure exécutée
     
    SELECT heyword FROM dual
     
    >HeyWord
    /

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Cette fonction n'est pas créée DANS le package, c'est une fonction simple.
    Nathieb veux la créer dans le package pour quelle puisse lire les infos locales au package il me semble.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  16. #16
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par McM Voir le message
    Cette fonction n'est pas créée DANS le package, c'est une fonction simple.
    Nathieb veux la créer dans le package pour quelle puisse lire les infos locales au package il me semble.
    Effectivement, tu as raison.

    Par contre, j'ai relu (rapidement, j'avoue) son code, il ne me semble pas qu'il utilise des infos locales, et le but semble de créer une fonction externe au package. Pourrais-tu nous confirmer cela Nathieb ?

  17. #17
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    il me semble que ceci est une variable locale
    if local_apprenti.'||p_colonne
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  18. #18
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par McM Voir le message
    il me semble que ceci est une variable locale
    C'est la valeur contenu dans p_colonne qui est utilisée pour construire la chaîne de caractère qui servira à créer la fonction. p_colonne ne sera plus utilisé par la suite.

    Si il avait écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'if local_apprenti.p_colonne ...'
    Dans ce cas là, il aurait tenté d'utiliser une variable en dehors de sa portée

    Par contre, Mea Culpa, je n'avais pas bien lu le message où il disait :
    En fait je désirais que la procédure se crée dans la package GESTION et pas ailleurs
    Tu avais raison, ce point là est impossible

  19. #19
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut MCM a raison c'est ce que je tente
    Bonjour,

    effectivement je tente de créer la rocédure dans le package user.GESTION.maprocedure

    A mon sens pas trouver encore ....

    olivier
    si cc'est possible des réponses ....
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  20. #20
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par nathieb Voir le message
    Bonjour,

    effectivement je tente de créer la rocédure dans le package user.GESTION.maprocedure

    A mon sens pas trouver encore ....

    olivier
    si cc'est possible des réponses ....
    Non, ce n'est pas possible de modifier ton package comme cela. Il n'y a pas d'option ajouter un bout de code dans mon package déjà créé. Quand on modifie un package, il est obligatoire de repasser par l'ordre CREATE OR REPLACE PACKAGE ...

    Tu devras créer ta procédure comme une procédure autonome. Je ne vois pas où cela pourrais poser problème ?

    Autre chose, je ne vois pas du tout l'intérêt de créer cette fonction en dynamique, tu peux surement faire du code standard et n'avoir qu'un curseur dynamique ?

Discussions similaires

  1. Problème execute immediate dans boucle
    Par jea00 dans le forum Oracle
    Réponses: 1
    Dernier message: 12/05/2011, 09h11
  2. Problème avec execute immediate
    Par jojo280 dans le forum SQL
    Réponses: 7
    Dernier message: 05/07/2008, 18h25
  3. Equivalents de EXECUTE IMMEDIATE ... RETURNING INTO ... ?
    Par swirtel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2005, 10h21
  4. [pl/sql] execute immediate
    Par Nadine dans le forum Oracle
    Réponses: 16
    Dernier message: 23/02/2005, 17h37
  5. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo