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 :

procédure stockée avec dblink ne renvoyant aucune ligne


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut procédure stockée avec dblink ne renvoyant aucune ligne
    bonjour,
    J'écris des procédures stockées qui utilise des database links pour récupérer des données sur des bases distantes. Les procédures stockées prennent en argument la dblink, un mois, une année et souvent d'autres informations. J'appelle ces procédures dans un module Forms et les données sont affichées sur Report.
    J'utilise Forms 6i et les bases sont sur Oracle 10g.
    Je faisais mes développements sur une base de test. Ensuite j'ai transmis mes procédures stockées au DBA pour qu'il les crée sur la base de production avec les droits. Le schéma utilisateur que j'utilise est le même sur la base de test que sur la base de production et ce schéma existe sur les bases distantes.
    Le problème est que je n'ai aucune donnée renvoyée lorsque je lance le module sur la base de production alors que ça marche sur la base de test.

    Voici le code d'une de mes procédures stockées:
    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
    CREATE OR REPLACE PROCEDURE
            remplissage_t_bt (p_base  VARCHAR,
                              p_mois  NUMBER,
                              p_annee NUMBER)
    IS
            v_requette VARCHAR2(2000);
    BEGIN
            v_requette:= 'insert into TABLE_TEMP '
            || '(t_date, t_mois, t_expl, T_EXPL_LIB, t_mnt_bt) '
            || 'SELECT JR_DATE, to_char(JR_DATE,''MM/YYYY'') mois, EXPL, LIBELLE, sum(MT_JRB) + sum(MT_JRC) T_MNT_BT '
            || 'FROM '
            || '(SELECT  JC_EXPL# EXPL, expl_libelle LIBELLE, '
            || 'to_date(to_char(JC_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'') JR_DATE, '
            || 'SUM(JC_MONTANT) MT_JRC, 0 MT_JRB '
            || 'FROM t_jc@'
            ||p_base
            ||', t_expl@'
            ||p_base
            || ' WHERE to_char(to_date(JC_DATE#,''DD/MM/YYYY''),''MM/YYYY'') '
            || '= to_char(to_date(to_char('
            ||p_mois
            ||')||''/''||to_char('
            ||p_annee
            ||'),''MM/YYYY''),''MM/YYYY'') '
            || 'AND  JC_EVT# IN (9,10) '
            || 'AND t_jc.JC_EXPL# = t_expl.expl_code# '
            || 'group by JC_EXPL#,expl_libelle, to_date(to_char(JC_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'') '
            || 'UNION '
            || 'SELECT  JB_EXPL# EXPL, expl_libelle LIBELLE, '
            || 'to_date(to_char(JB_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'') JR_DATE, 0 MT_JRC, '
            || 'SUM(JB_MONTANT) MT_JRB '
            || 'FROM t_jb@'
            ||p_base
            ||', t_expl@'
            ||p_base
            || ' WHERE to_char(to_date(JB_DATE#,''DD/MM/YYYY''),''MM/YYYY'') '
            || '= to_char(to_date(to_char('
            ||p_mois
            ||')||''/''||to_char('
            ||p_annee
            ||'),''MM/YYYY''),''MM/YYYY'') '
            || ' AND  JB_EVT# IN (9,10) '
            || ' AND t_jb.JB_EXPL# = t_expl.expl_code# '
            || ' group by JB_EXPL#, expl_libelle, to_date(to_char(JB_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'')) '
            || 'GROUP BY  JR_DATE,  to_char(JR_DATE,''MM/YYYY''), EXPL, LIBELLE order by 1,2,3';
            EXECUTE immediate v_requette ;
    END;
    Et voici les l'affectation des droits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DROP PUBLIC SYNONYM remplissage_t_bt;
    CREATE PUBLIC SYNONYM remplissage_t_bt FOR GES.remplissage_t_bt
    /
    GRANT  EXECUTE, DEBUG ON remplissage_t_bt TO PUBLIC
    /
    GES est un DBA.
    Voilà mon problème. J'ai fouiner les programmes je n'ai rien trouvé. Je suis un peu débutant. Merci de me guider.

  2. #2
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Est ce que les deux (2) bases ont les mêmes données? il y'a pas de message d'erreur généré?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Pas exactement les mêmes données, mais plûtot les mêmes structures de données. La base de test comporte des données moins récentes que la base de production; mais les données qui sont recuperées ne viennent pas seulement de la base de connexion mais surtout des bases distantes.
    Il n'ya pas de message d'erreur généré.

  4. #4
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    C'est vraiment bizarre que t'aie pas de message d'erreur!!! alors peut être que ta bd de production n'a pas les données repondant aux critères de ta requête

    Essaye d'executer ta procedure stockée directement dans SQL+ (pas dans report ou form) sur ta bd de production pour voir si cela te donne les resultats attendus ou un quelconque message d'erreur.
    Dans ta clause FROM, t_jb et t_expl sont des synonymes de tables ou des noms de tables? il faudrait peut être les preceder du schema dans lequel elles se trouvent.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Oui c'est bizarre mais aucun message d'erreur n'est retourné. En fait la base de test est une copie de la base de production. LEs tables t_jb et t_expl sont bien des synonymes.
    Pour ce qui est de l'exécution sous SQLPLUS, l'exécution de la procédure stockée ne donne aucun resultat(pas d'erreur mais aucune ligne renvoyée). Cependant, lorsque je "deshabille" la procédure stockée laissant seulement la requête et que j'exécute celle-ci sur la base de production, j'ai mes données.
    Mon DBA pense que c'est un problème de paramétrage mais il dis avoir fait le tour des paramètres sans rien trouvé.

  6. #6
    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
    Ca ressemble a un problème d'affectation des droits (directement / via un rôle)
    Les droits donnés via un rôle ne sont pas connu dans une procédure stockée.

    Par contre bizarre que ça ne renvoie pas de message d'erreur, donc c'est peut être pas ça...

    Enfin peut être une piste à fouiller, même si je ne connais pas trop les subtilités de l'utilisation des synonymes.

  7. #7
    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
    Ta requête est fausse, voila tout !

    Quel est le type de JB_DATE# ?

    un coup tu fais un to_date(to_char(JB_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'')
    Un autre, un WHERE to_char(to_date(JB_DATE#,'DD/MM/YYYY')

    pas bien, et pas bon.

  8. #8
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par McM Voir le message
    Ta requête est fausse, voila tout !

    Quel est le type de JB_DATE# ?

    un coup tu fais un to_date(to_char(JB_DATE#,''DD/MM/YYYY''),''DD/MM/YYYY'')
    Un autre, un WHERE to_char(to_date(JB_DATE#,'DD/MM/YYYY')

    pas bien, et pas bon.
    Oui mais le problème c'est qu'il dit que ça marche sur la bd de test.
    Je continue de croire que la bd de production n'a pas des données qui repondent aux critères de sa requete (même si je ne la comprends pas la requete)

  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
    Il y a des casts automatiques lors d'un to_date d'une date.. c'est pas dit que tu ais le même comportement entre 2 bases.

    Avant de réveiller le DBA , faut déjà s'assurer que le requête est correcte.

    Edit :
    Voici le SELECT simplifié, en partant de la forte probabilité que les TO_DATE (TO_CHAR aient été utilisés pour enlever les heures.

    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
    INSERT INTO TABLE_TEMP (t_date, t_mois, t_expl, t_expl_lib, t_mnt_bt) 
     
    SELECT jr_date, TO_CHAR(jr_date,'MM/YYYY') mois, expl, libelle, SUM(mt_jr)  t_mnt_bt
    FROM 
    (	SELECT  jc_expl# expl, expl_libelle libelle, TRUNC(jc_date#) jr_date, SUM(jc_montant) mt_jr
    	FROM T_JC@P_BASE, T_EXPL@P_BASE
    	WHERE TRUNC(jc_date#,'MM') = TO_DATE('01/' || p_mois||'/'||p_annee, 'DD/MM/YYYY')
    	AND jc_evt# IN (9,10)
    	AND t_jc.jc_expl# = t_expl.expl_code#
    	GROUP BY jc_expl#,expl_libelle, TRUNC(jc_date#)
    UNION ALL
    	SELECT  jb_expl# expl, expl_libelle libelle, TRUNC(jb_date#) jr_date, SUM(jb_montant) mt_jr
    	FROM T_JB@P_BASE, T_EXPL@P_BASE
    	WHERE TRUNC(jb_date#,'MM') = TO_DATE('01/' || p_mois||'/'||p_annee, 'DD/MM/YYYY')
    	AND jb_evt# IN (9,10)
    	AND t_jb.jb_expl# = t_expl.expl_code#
    	GROUP BY jb_expl#, expl_libelle, TRUNC(jb_date#) 
    )
    GROUP BY  jr_date, TO_CHAR(jr_date,'MM/YYYY'), expl, libelle 
    ORDER BY 1,2,3

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Effectivement je vois qu'il y a des problèmes au niveau des castings dans la requête d'autant plus que JB_DATE#, JC_DATE# sont de type date. Je note cependant en passant, comme je l'avais signaler que ça marche sur la base de test qui est une copie de la base de production. Je pense bien maintenant que le problème proviendrait des faux castings que j'effectue. Je suis en train d'intégrer les propositions de McM. Je vous ferai donc signe.

    PS: toutes mes excuses pour le retard , ma connexion Internet était tombée.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Encore là.
    Le problème persiste toujours. J'ai pris en compte les suggestions de McM et j'ai obtenu la procédure ci-dessous mais j'ai encore la même situation: A partir de la base de test, j'ai les résultats; mais à partir de la base de production, aucune donnée n'est renvoyée.

    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
    CREATE OR REPLACE PROCEDURE
            remplissage_t_bt (p_base  VARCHAR,
                              p_mois  NUMBER,
                              p_annee NUMBER)
    IS
            v_requette VARCHAR2(2000);
    BEGIN
            v_requette:= 'insert into TABLE_TEMP '
            || '(t_date, t_mois, t_expl, t_EXPL_LIB, t_mnt_bt) '
            || 'SELECT JR_DATE, to_char(JR_DATE,''MM/YYYY'') mois, EXPL, LIBELLE, sum(MT_JRB) + sum(MT_JRC) T_MNT_BT '
            || 'FROM '
            || '(SELECT  JC_EXPL# EXPL, expl_libelle LIBELLE, '
            || 'TRUNC(JC_DATE#) JR_DATE, '
            || 'SUM(JC_MONTANT) MT_JRC, 0 MT_JRB '
            || 'FROM t_jc@'
            ||p_base
            ||', t_expl@'
            ||p_base
            || ' WHERE TRUNC(JC_DATE#,''MM'') '
            || '= to_date(''01/'
            ||p_mois
            ||'/'
            ||p_annee
            ||''',''DD/MM/YYYY'') '
            || 'AND  JC_EVT# IN (108,109) '
            || 'AND t_jc.JC_EXPL# = t_expl.expl_code# '
            || 'group by JC_EXPL#,expl_libelle, TRUNC(JC_DATE#)'
            || 'UNION ALL '
            || 'SELECT  JB_EXPL# EXPL, expl_libelle LIBELLE, '
            || 'TRUNC(JB_DATE#) JR_DATE, 0 MT_JRC, '
            || 'SUM(JB_MONTANT) MT_JRB '
            || 'FROM t_jb@'
            ||p_base
            ||', t_expl@'
            ||p_base
            || ' WHERE TRUNC(JB_DATE#,''MM'')'
            || '= to_date(''01/'
            ||p_mois
            ||'/'
            ||p_annee
            ||''',''DD/MM/YYYY'') '
            || ' AND  JB_EVT# IN (108,109) '
            || ' AND t_jb.JB_EXPL# = t_expl.expl_code# '
            || ' group by JB_EXPL#, expl_libelle, TRUNC(JB_DATE#) ) '
            || 'GROUP BY  JR_DATE,  to_char(JR_DATE,''MM/YYYY''), EXPL, LIBELLE order by 1,2,3';
            EXECUTE immediate v_requette ;
    END;
     
    DROP PUBLIC SYNONYM remplissage_t_bt;
    CREATE PUBLIC SYNONYM remplissage_t_bt FOR GES.remplissage_t_bt
    /
    GRANT EXECUTE, DEBUG ON remplissage_t_bt TO PUBLIC
    /
    Il n'ya aucun message d'erreur signalé non plus.

  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
    Mets une trace pour avoir la requête réellement exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR i IN 1 .. CEIL(LENGTH(v_requette) / 255)
    LOOP
    	DBMS_OUTPUT.PUT_LINE( SUBSTR(v_requette,(i-1)*255 + 1,255));
    END LOOP;
    Ensuite faut voir si sous sql, cette requête ramène des données, ou si c'est un problème de dblink qui utilise un user qui ne lit pas les bonnes tables.
    Bref, élimine la partie SQL DYNAMIQUE pour les tests.

Discussions similaires

  1. Procédure stockée avec retour de curseur
    Par Oufti dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 07/11/2005, 22h40
  2. Procédure stockée avec SELECT UNION
    Par maredami dans le forum Oracle
    Réponses: 4
    Dernier message: 07/11/2005, 11h05
  3. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51
  4. Procédure stockée avec param de sortie:marchepas av ADO
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/10/2004, 12h04

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