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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    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

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

    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
    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;

  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
    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 expérimenté 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
    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 Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    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

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

    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
    Billets dans le blog
    4
    Par défaut
    redonne la version débugguée de ta fonction stp.

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