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

PL/SQL Oracle Discussion :

Une procédure qui passe mais sans rien faire


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut Une procédure qui passe mais sans rien faire
    Bonjour,
    j'ai un problème avec une procédure qui s'exécute sans retour d'erreurs mais qui en fait ne fait rien ...

    Il s'agit de cette procédure :

    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
    CREATE OR REPLACE PROCEDURE Script_chargement_ODS_1Bis IS
     
    CURSOR c_table IS
    SELECT vsource.view_name, tcible.table_name
    FROM SYS.ALL_TABLES tcible,  SYS.ALL_VIEWS vsource
    WHERE tcible.OWNER = 'IHR'  and vsource.OWNER = 'IHR'
    and tcible.table_name like 'HRA_%' and tcible.table_name not like 'HRA_ZX%'
    and tcible.table_name not like 'HRA_ZY%' and vsource.view_name like 'ODS_%'
    and vsource.view_name not like 'ODS_ZX%' and vsource.view_name not like 'ODS_ZY%'
    and rtrim(substr(tcible.table_name,4,25)) = rtrim(substr(vsource.view_name,4,25))
    and tcible.table_name  not in (SELECT substr ( tcible.table_name , 1 , INSTR(tcible.table_name,'TMP',1) - 2 )
    					   	   	   FROM SYS.ALL_TABLES tcible
    							   WHERE tcible.table_name like 'HRA_%'
    							   AND tcible.table_name  like '%TMP') ;
    i c_table%ROWTYPE;
     
    BEGIN
     
    FOR i IN c_table LOOP
    	EXECUTE IMMEDIATE 'truncate table IHR.' || i.table_name ;
    	EXECUTE IMMEDIATE 'Insert into IHR.' || i.table_name || ' select * from IHR.' || i.view_name ;
    	commit;
    END LOOP;
     
    END;
    Son but est tout simple, copier les données des vues dans des tables correspondantes ! La procédure est sur un schéma (SUNOPSIS) et les données cible/source sont sur un autre schéma (IHR).

    Lorsque je l'exécute cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
    SUNOPSIS.Script_chargement_ODS_1Bis() ;
    end ;
    J'ai ce retour : PL/SQL procedure successfully completed

    Or mes tables cibles restent vides ! (alors qu'il y a bien des données dans les vues sources)

    Comme autre test, j'ai exécuter la requête de mon curseur pour voir si le problème ne venait pas de là mais il me retourne bien les noms des tables et vues ... Je décide alors de copie la première occurrence de cette liste :
    View name : ODS_FNB00_ALL
    Table name : HRA_FNB00_ALL
    Et je remplace dans les EXECUTE IMMEDIATE pour ensuite essayer cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN
     
    EXECUTE IMMEDIATE 'truncate table IHR.HRA_FNB00_ALL' ;
    EXECUTE IMMEDIATE 'Insert into IHR.HRA_FNB00_ALL select * from IHR.ODS_FNB00_ALL' ;
    commit;
     
    END;
    Et lorsque je fais cela, même code de retour, cette fois-ci avec la table cible qui est correctement remplie !!!

    Je ne m'explique vraiment pas le problème que j'ai avec la procédure qui n'exécute rien ....

    HELP ME PLEASE !!!!!

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Exécutes la requête de ton curseur sous SQL*Plus, elle ne ramène peut-être rien.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Je te remercie de ton intervention mais dans mon premier message j'ai bien spécifié que j'avais essayé d'exécuter la requête de mon curseur et qu'elle me retourne bien des résultats ! (93 pour être précis)

    Citation Envoyé par Bizoo Voir le message
    Comme autre test, j'ai exécuter la requête de mon curseur pour voir si le problème ne venait pas de là mais il me retourne bien les noms des tables et vues ...

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Pas les yeux en face des trous ce matin moi

    As-tu essayé de mettre des dbms_output pour afficher les requêtes que tu exécutes ?

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Je me trompe peut-être dans les syntaxes mais j'ai essayer ça :

    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
    CREATE OR REPLACE PROCEDURE Script_chargement_ODS_1Bis IS
     
    CURSOR c_table IS
    SELECT vsource.view_name, tcible.table_name
    FROM SYS.ALL_TABLES tcible,  SYS.ALL_VIEWS vsource
    WHERE tcible.OWNER = 'IHR'  and vsource.OWNER = 'IHR'
    and tcible.table_name like 'HRA_%' and tcible.table_name not like 'HRA_ZX%'
    and tcible.table_name not like 'HRA_ZY%' and vsource.view_name like 'ODS_%'
    and vsource.view_name not like 'ODS_ZX%' and vsource.view_name not like 'ODS_ZY%'
    and rtrim(substr(tcible.table_name,4,25)) = rtrim(substr(vsource.view_name,4,25))
    and tcible.table_name  not in (SELECT substr ( tcible.table_name , 1 , INSTR(tcible.table_name,'TMP',1) - 2 )
    					   	   	   FROM SYS.ALL_TABLES tcible
    							   WHERE tcible.table_name like 'HRA_%'
    							   AND tcible.table_name  like '%TMP') ;
    i c_table%ROWTYPE;
     
    BEGIN
     
    dbms_output.enable(9999999);
    dbms_output.put_line ('Test avec dbms_output');
     
    FOR i IN c_table LOOP
    	dbms_output.put_line (i.table_name);
    	dbms_output.put_line (i.view_name);
    	dbms_output.put_line ('truncate table IHR.' || i.table_name);
    	dbms_output.put_line ('Insert into IHR.' || i.table_name || ' select * from IHR.' || i.view_name);
    	EXECUTE IMMEDIATE 'truncate table IHR.' || i.table_name ;
    	EXECUTE IMMEDIATE 'Insert into IHR.' || i.table_name || ' select * from IHR.' || i.view_name ;
    	commit;
    END LOOP;
     
    END;
    Et lors de l'exécution sous TOAD :

    Dans l'onglet en bas Script Output :
    begin
    SUNOPSIS.Script_chargement_ODS_1Bis() ;
    end ;
    PL/SQL procedure successfully completed


    Et rien dans l'onglet DBMS Output...

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Sous toad il faut que tu actives le dbms_output (icone rouge dans l'onglet DBMS output)

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Ok merci !
    Bien dans ce cas je n'ai la trace que de mon :
    dbms_output.put_line ('Test avec dbms_output');

    C'est comme si on ne passait pas dans la boucle, comme si elle était vide !

    Pourtant quand je sélectionne la requête du curseur et que je n'exécute que cette dernière j'ai bien en retour :

    93 rows selected

    C'est à rien n'y comprendre

  8. #8
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    il faut peut etre enlever de la boucle
    execute immediate 'truncate...

    et mettre plus au dessus

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par fatsora Voir le message
    il faut peut etre enlever de la boucle
    execute immediate 'truncate...

    et mettre plus au dessus
    +1

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Si j'enlève la boucle alors seulement le premier élément de ma liste sera traiter ! (ou une erreur si il voit que je ne fais pas de boucle sur une liste)



    Je ne comprends pas pourquoi il faudrait l'enlever !

    Une précision que je n'ai pas apporté et qui, je viens de réaliser, pourrait avoir de l'importance :

    Ce même traitement exécuté en recette (Base différente mais même noms pour les schémas, tables, vues ...) fonctionne correctement et rempli bien mes tables ...

  11. #11
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Citation Envoyé par Bizoo Voir le message
    Si j'enlève la boucle alors seulement le premier élément de ma liste sera traiter ! (ou une erreur si il voit que je ne fais pas de boucle sur une liste)



    Je ne comprends pas pourquoi il faudrait l'enlever !

    Une précision que je n'ai pas apporté et qui, je viens de réaliser, pourrait avoir de l'importance :

    Ce même traitement exécuté en recette (Base différente mais même noms pour les schémas, tables, vues ...) fonctionne correctement et rempli bien mes tables ...

    ==> c'est pas enlever la boucle

    c'est passer la commande
    execute truncate en dehors de la boucle

    au lieu de for truncate

    c'est truncate
    for

    c'est pas pareil !!!

    ceci dit , c'est il y a autre chose en + si en recette c'est OK

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il faut enlever le TRUNCATE de la boucle, parce qu'à chaque passage, vous videz la table...

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Si j’ai bien compris à l’exécution de la procédure ton curseur ne ramène aucun enregistrement. Est-ce que l’utilisateur qui exécute la procédure et celui avec lequel tu as testé le select c’est le même ?

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Le curseur me ramène une liste de correspondance tables/vues :

    VIEW_NAME TABLE_NAME
    ------------------------------ ------------------------------
    ODS_FNB00_ALL HRA_FNB00_ALL
    ODS_FNF00_ALL HRA_FNF00_ALL
    ODS_FNK00_ALL HRA_FNK00_ALL
    ODS_FNQ00_ALL HRA_FNQ00_ALL
    .........
    ODS_ZV3A HRA_ZV3A
    ODS_ZVW1 HRA_ZVW1
    93 rows selected

    Pour chaque occurrence il vide la table et remplis avec la vue, ensuite la boucle fait passer à l'occurrence suivante, vide la table suivante et la remplis avec sa vue correspondante ! Il ne faut surtout pas enlever le TRUNCATE de la boucle !!! (J'ai du mal expliquer ce que cela faisait au départ dsl)

    Comme la procédure fonctionne en recette, c'est que ce n'est peut-être pas un problème à ce niveau là mais un problème au niveau de la structure de la base ? Pourtant la base de prod est censé être une copie de la base de recette ....

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Si j’ai bien compris à l’exécution de la procédure ton curseur ne ramène aucun enregistrement. Est-ce que l’utilisateur qui exécute la procédure et celui avec lequel tu as testé le select c’est le même ?
    Oui, il s'agit effectivement du même utilisateur ...

  16. #16
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Désolé, j'avais mal lu

  17. #17
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Est ce que les droits sur le schema IHR ont été donnés à SUNOPSIS via un rôle ?

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 167
    Points : 112
    Points
    112
    Par défaut
    Ça je ne saurais pas te dire !
    Il faudrait que je demande à nos DBA...

    C'est quoi exactement un rôle ? Si l'utilisateur connecté n'a pas les droits cela devrait produire une erreur "Insuffisant Privileges" non ?

  19. #19
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Bizoo Voir le message
    Si l'utilisateur connecté n'a pas les droits cela devrait produire une erreur "Insuffisant Privileges" non ?
    Oui mais là tu interroges all_tables et donc sans droit directement grant sur les tables du schéma ton curseur reste vide (même si l'execution de la requête directement en sql ou dans un bloc anonyme renvoie les tables.)

    Bon c'est une idée, je ne suis pas sûr que ce soit la solution.

    Pour des infos sur les rôles :
    http://oracle.developpez.com/guide/a...ion/adminrole/

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2006, 15h32
  2. appel d'une procédure qui renvoie le résultat d'une requete
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2006, 15h02
  3. Une DLL qui existe mais VB ne la trouve pas...
    Par Lawari dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/12/2005, 00h16
  4. Root qui ne peux plus rien faire :'(
    Par Smortex dans le forum Administration
    Réponses: 2
    Dernier message: 27/09/2004, 21h13
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 12h47

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