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

Oracle Discussion :

Probléme Insert sql dynamique


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut Probléme Insert sql dynamique
    Bonjour

    J'ais une erreur sur cette insertion mais oracle me met pas le type d'erreur, l'insertion simple sans clause where fonctionne bien mais des que je met ma condition sa plante??
    Je cherche et test différente façon mais la je suis un peu bloquer.

    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
     
    WHILE vNb_Cpt > 0 LOOP
    vNb_Cpt := vNb_Cpt-1 ;
     
    sql_str := 'INSERT INTO DATAMART_NMD.'|| pTable ||'
                  SELECT DATACT, ETANOU ,ETAPDN,IDEVTE,MSI ,IMS,DATMAJDMT 
    FROM ( select ROWNUM r, e.* FROM (select * FROM DATAMAJ_NMD.' || pTablecopie || ' ) e  
    WHERE DATMAJDMT > ADD_MONTHS(sysdate, '||pMonth||' ) and ROWNUM <= '||  vNb_cpt2  ||'  ) f 
    WHERE f.r >= '||  vNb_cpt1 ||' ';
     EXECUTE IMMEDIATE sql_str ;
     
    vNb_cpt1 := vNb_cpt1 + 100001 ;
    vNb_cpt2 := vNb_cpt1 + 100000 ;
     
    COMMIT;
    END LOOP;
    Je débute en sql dynamique mais la je comprend pas l'erreur.

    merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    1/ Utilise dbms_output pour afficher la requête finalement exécuter par l'ordre EXECUTE IMMEDIATE
    2/ Encapsule ton code par un bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN
    ...
    EXCEPTION WHEN ...
    ...
    END;
    et tu obtiendras le code de l'erreur générée.

  3. #3
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Désoler j'avais pas mis tout mon code donc je le remet mais le dbms me sort rien?

    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
     
    BEGIN
     
    -- Initialisation du code d'erreur
    code_erreur:='0';
    vNb_cpt1 :=1 ;
    vNb_cpt2 :=100000 ;
     
    sql_str_copy := 'select comp_tmp  FROM TMP' ;
    EXECUTE IMMEDIATE sql_str_copy INTO vNb_Enreg;
     
     
    vNb_Boucle := CEIL(vNb_Enreg / 100000);
     
    vNb_Cpt := vNb_Boucle;
     
    WHILE vNb_Cpt > 0 LOOP
    vNb_Cpt := vNb_Cpt-1 ;
     
     
     sql_str := 'INSERT DATAMART_NMD.'|| pTable || ' 
    SELECT DATACT, ETANOU ,ETAPDN,IDEVTE, MSI ,IMS, DATMAJDMT 
    FROM ( select ROWNUM r, e.* 
    FROM (select * FROM DATAMAJ_NMD.' || pTablecopie || ' ) e  
    WHERE DATMAJDMT > ADD_MONTHS(sysdate, '||pMonth||' ) and ROWNUM <= '||  vNb_cpt2  ||'  ) f 
    WHERE f.r >= '||  vNb_cpt1 ||' ';
     EXECUTE IMMEDIATE sql_str ;
     
    vNb_cpt1 := vNb_cpt1 + 100001 ;
    vNb_cpt2 := vNb_cpt1 + 100000 ;
     
    COMMIT;
    END LOOP;
     
    EXCEPTION
    		 WHEN OTHERS
    		 THEN
    		 DBMS_OUTPUT.PUT_LINE(sql_str);
    	 	 	 -- On renvoie un code d'erreur
    	 		 code_erreur:='99';
    			 --RAISE;
     
    COMMIT;
    END;

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    J'ai du mal à suivre, d'autant que vous dîtes dans votre 1er message que vous avez une erreur et là vous n'en avez plus

    Mettez des dbms_output avant et après les instructions "critiques" de votre code pour voir au delà de quelle instruction votre code n'est pas exécuté.

  5. #5
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Que donne l'execution de votre programme ? Quel code Erreur ?
    Ou sont les declarations de variables de votre code ?

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    1°) il est où le DECLARE
    2°) le 1° EXECUTE IMMEDIATE ne sert à rien

  7. #7
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Désoler je suis pas tres clair.

    mon code n'est pas executer lors de l' EXECUTE IMMEDIATE sur l' insert

    En mode débug sur toad ma variable sql_str = null est sa plante juste apres sur le execute immediate

    Il n'y a aucun code erreur oracle je le compile bien mais a l'execution il plante

    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
    procedure purge_insert_table(pTable in varchar2,pTablecopie in varchar2,pMonth in NUMBER,code_erreur out char) IS
    file_handle UTL_FILE.FILE_TYPE; -- file handle
    sql_str VARCHAR2(200);
    vNb_Enreg number(22);
    vNb_Boucle number(22);
    vNb_Cpt number(22);
    sql_str_copy VARCHAR2(200);
    vNb_cpt1 number(22);
    vNb_cpt2 number(22);
    
    BEGIN
    
    -- Initialisation du code d'erreur
    code_erreur:='0';
    vNb_cpt1 :=1 ;
    vNb_cpt2 :=100000 ;
    
    sql_str_copy := 'select comp_tmp  FROM TMP' ;
    EXECUTE IMMEDIATE sql_str_copy INTO vNb_Enreg;
    
    
    vNb_Boucle := CEIL(vNb_Enreg / 100000);
    
    vNb_Cpt := vNb_Boucle;
    
    WHILE vNb_Cpt > 0 LOOP
    vNb_Cpt := vNb_Cpt-1 ;
    
    
     sql_str := 'INSERT DATAMART_NMD.'|| pTable || ' 
    SELECT DATACT, ETANOU ,ETAPDN,IDEVTE, MSI ,IMS, DATMAJDMT 
    FROM ( select ROWNUM r, e.* 
    FROM (select * FROM DATAMAJ_NMD.' || pTablecopie || ' ) e  
    WHERE DATMAJDMT > ADD_MONTHS(sysdate, '||pMonth||' ) and ROWNUM <= '||  vNb_cpt2  ||'  ) f 
    WHERE f.r >= '||  vNb_cpt1 ||' ';
     EXECUTE IMMEDIATE sql_str ;
    vNb_cpt1 := vNb_cpt1 + 100001 ;
    vNb_cpt2 := vNb_cpt1 + 100000 ;
    
    COMMIT;
    END LOOP;
    
    EXCEPTION
    		 WHEN OTHERS
    		 THEN
    		 DBMS_OUTPUT.(sql_str);
    	 	 	 -- On renvoie un code d'erreur
    	 		 code_erreur:='99';
    			 --RAISE;
    
    COMMIT;
    END;
    
    ...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    1° votre chaine devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sql_str := 'INSERT INTO DATAMART_NMD.'|| pTable ||
               ' SELECT DATACT, ETANOU, ETAPDN, IDEVTE, MSI ,IMS, DATMAJDMT ' ||
               ' FROM ( select ROWNUM r, e.* FROM (select * FROM DATAMAJ_NMD.' 
               || pTablecopie || ' ) e  WHERE DATMAJDMT > ADD_MONTHS(sysdate, ' 
               || pMonth ||' ) and ROWNUM <= '||  vNb_cpt2  ||'  ) f WHERE f.r >= '||  vNb_cpt1 ||' ';
    2° si l'un des pramaètres est NULL la chaine entière est NULL, il faut donc coalescer avec une valeur définissable. Oracle ne répondant pas à la norme avec la fonction COALESCE il faut utiliser NVL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sql_str := 'INSERT INTO DATAMART_NMD.'|| NVL(pTable, 'toto') ||
               ' SELECT DATACT, ETANOU, ETAPDN, IDEVTE, MSI ,IMS, DATMAJDMT ' ||
               ' FROM ( select ROWNUM r, e.* FROM (select * FROM DATAMAJ_NMD.' 
               || NVL(pTablecopie, 'toto') || ' ) e  WHERE DATMAJDMT > ADD_MONTHS(sysdate, ' 
               || NVL(pMonth, 0) ||' ) and ROWNUM <= '||  NVL(vNb_cpt2, 0)  ||'  ) f WHERE f.r >= '||  NVL(vNb_cpt1, ???) ||' ';
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    sql_str contient plus de 200 caractères à mon avis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème insertion SQL avec Java
    Par lemzo84 dans le forum Persistance des données
    Réponses: 11
    Dernier message: 28/10/2012, 14h58
  2. Problème insertion sql
    Par El-Diablo- dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2009, 14h55
  3. Problème d'insert en SQL dynamique
    Par greg75 dans le forum SQL
    Réponses: 8
    Dernier message: 23/08/2007, 10h46
  4. Problème insertion SQL d'un contenu RichTextBox
    Par Jordel dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/08/2007, 10h04
  5. Réponses: 4
    Dernier message: 30/01/2005, 14h23

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