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 :

Stocker le résultat d'une requête en SQL dynamique [Fait]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut Stocker le résultat d'une requête en SQL dynamique
    Bonjour à tous, j'ai le souci suivant: je n'arrive pas à récupérer le résultat (à l'écran ou en spool) produit par un execute immediate au sein d'un bloc PL/SQL.

    Pourtant si elle est exécutée directement sous SQL, alors j'ai bien un résultat.
    Mais en passant par le sql dynamique aucun retour. Soit la partie appelant
    ma requête (la fonction f_trace me permet d'afficher l'ordre avant éxécution)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if ( '&mode' in ('O','o') ) then
    dbms_output.put_line ('On passe dans la requete 1');
    f_trace (requete1);
    execute immediate requete1 ;
    else 
    dbms_output.put_line ('On passe dans la requete 2');
    f_trace (requete2);
    execute immediate requete2;
    end if;
    Y aurait-il une option à activer?

  2. #2
    Expert confirmé
    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
    Par défaut
    ...je n'arrive pas à récupérer le résultat...
    c'est quoi la requête, un curseur ?

  3. #3
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Mes requêtes sont construites de cette manière:

    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
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,  '
    ||to_number(to_char(date_travail,'YYYY'))||'-to_number(to_char(ide.dat_naissance,''YYYY'')) AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from rh.agtpai)
    AND   nat.cod_coll =''toto''
    AND '|| to_number( to_char(date_travail,'YYYY' ))|| ' - to_number(to_char(ide.dat_naissance,''YYYY'')) = 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <='''||to_char(date_travail,'DD/MM/YYYY')||
    ''' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '''   ||to_char(date_travail,'DD/MM/YYYY')||'''
    ORDER BY MATRICULE ';
     
    requete2 := '
    SELECT nat.idf_agent                                             MATRICULE ,
           his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
           to_char(sysdate,''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
           to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from rh.agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char(to_date('''|| date_travail|| ''',''DD/MM/YY''),''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= 65
    AND to_number(to_char(to_date('''||date_travail||''',''DD/MM/YY''),''MM'')) = to_number(to_char(ide.dat_naissance,''MM''))
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '''||date_travail||'''
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '''||date_travail||'''
    ORDER BY MATRICULE ';
    Donc à priori ce ne sont pas des curseurs (si j'ai tout bien compris).
    Au passage, ta fonction est nickel!

  4. #4
    Expert confirmé
    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
    Par défaut
    Si c'est un ordre Select, c'est forcément un curseur.
    Voyez le tuto sur le SQL dynamique, particlièrement le traitement des collections (BULK COLLECT)

  5. #5
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Après avoir lu ton tuto j'ai bien avancé et j'obtiens ce que je veux sur mon client Windows . Mais ça plante quand je l'exécute sur mon client solaris ça me génère 1 ORA-01843.

    Soit la déclaration de mes types pour la collection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type T_idf_agent is table of rh.agtnat.idf_agent%type;
    type T_nom_prenom is table of varchar2(45);
    type T_age is table of number(2);
    type T_naissance is table of date;
     
    ident_agent T_idf_agent;
    nom T_nom_prenom ;
    age T_age;
    naissance T_naissance;
    Voici là ou j'ai mon plantage (cas requête 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate requete1 BULK COLLECT INTO ident_agent, nom,age,naissance;
    Si je désactive la collection en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate requete1;
    alors pas d'erreur de plantage de ce type.

    Pour info voici ce que me donne sur mon client solaris les affichages suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dbms_output.put_line('Date travail courante: ' ||to_char(date_travail,'DD/MM/YYYY'));
    dbms_output.put_line('Date travail courante: ' ||to_char(date_travail));
    J'ai respectivement:

    Date travail courante: 22/10/2008
    Date travail courante: 22-OCT-08
    Ou faut-il que j'intervienne pour qu'il remplisse la collection sans plantage?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type T_naissance IS TABLE of date;
    naissance T_naissance;
    ...
    to_char(ide.dat_naissance,''DD/MM/YYYY'') DATE_NAISSANCE
    Essaie sans le to_char.

    Pour essayer de comprendre la différence entre le client windows et le client solaris regarde les paramètres NLS de session:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from nls_session_parameters;
    Le NLS_DATE_FORMAT du client windows doit permettre une conversion implicite du char en date.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/03/2011, 19h38
  2. Stocker le résultat d'une requête
    Par decourtb dans le forum Deski
    Réponses: 2
    Dernier message: 12/04/2010, 13h58
  3. Stocker les résultats d'une requête
    Par dam28800 dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2010, 14h29
  4. Cmt stocker le résultat d'une requête dans une variable ?
    Par innova dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 07/02/2007, 09h41
  5. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18

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