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 :

Valeur de retour d'un bloc PL SQL.


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut Valeur de retour d'un bloc PL SQL.
    Bonjour,

    Je génère dynamiquement un bloc PL/SQL de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    [mes variables]
    BEGIN
    ...
    END;
    Dans ce bloc, j'exécute un INSERT sur lequel je souhaiterais retourner certaines données.
    Pour cela j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURNING [les champs] INTO [mes variables]
    dans l'insert.
    Je fais ensuite un UPDATE dans le bloc.

    Jusque là, ca va. Mais le souci c'est que ces données restent cloitré dans le bloc PL/SQL.


    Connaissez vous une méthode pour récupérer des données en dehors du bloc PL/SQL. (pour info, je souhaite les récuperer sur C# mais ce n'est pas important).


    Ce qui m'intéresserait, ce serait de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [mes variables] FROM DUAL;
    Et que ces données soient retournées à l'exécution du bloc PL/SQL.

    Actuellement, l'exécution d'un bloc PL/SQL me retourne rien à part un message me disant que son exécution s'est passée sans erreur.

    Merci par avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Un dbms_output, ou bien utl_file pour écrire dans un fichier?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Il n'est pas possible de demander à ce que la valeur de retour du bloc PL/SQL soit similaire à celle d'un select ? (select que je définirais dans ce meme bloc)

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
    ...
    BEGIN
    ...
    SELECT * FROM table;
    END;
    La valeur de retour du bloc PL/SQL serait la même que si j'avais exécuter la requête SELECT. (un résultat traitable par une quelconque application)

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Tu pourrais utiliser une table de fonction.
    Il s'agit de mettre ton bloc PL/SQL dans une fonction qui te retourne les données que tu souhaites. En suite tu exécutes un
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE(ma_fonction(...));
    C'est dispo à partir de la version 9i.
    Plus d'infos ici :http://sheikyerbouti.developpez.com/pl_sql/?page=Chap4

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Le problème est que le bloc PL/SQL est généré dans une application C#

    Au mieux je peut faire une fonction qui prenne en paramètre le code SQL et l'exécute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FUNCTION MA_FONCTION(BLOC_PLSQL_GENERE VARCHAR2)
     RETURN VARCHAR2
    IS
    BEGIN
       EXECUTE IMMEDIATE BLOC_PLSQL_GENERE;
    END;
    Mais je garde le même problème : comment récupérer des données depuis mon bloc PL/SQL ? D'autant plus que je peux retourner un nombre variable de données

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par Ketsuno Voir le message
    Il n'est pas possible de demander à ce que la valeur de retour du bloc PL/SQL soit similaire à celle d'un select ? (select que je définirais dans ce meme bloc)

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
    ...
    BEGIN
    ...
    SELECT * FROM table;
    END;
    La valeur de retour du bloc PL/SQL serait la même que si j'avais exécuter la requête SELECT. (un résultat traitable par une quelconque application)
    Un bloc PL/SQL n'a pas de valeur de retour. Sauf si c'est une fonction ou si tu envoies explicitement une valeur.
    Cet exemple génèrera une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
    ...
    BEGIN
    ...
    SELECT * FROM table;
    END;
    Le retour du SELECT doit être mis dans une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    ma_variable ....;
    BEGIN
    SELECT colonne1 INTO ma_variable FROM table;
    END;
    Variable que tu manipules ensuite comme tu veux. Tu peux l'afficher, la mettre dans un fichier... Mais sans une action précise sur cette variable, le bloc n'aura pas de valeur de retour.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Je sais bien que l'on puisse récupère une valeur d'une requête grâce a INTO pour les select et RETURNING ... INTO pour les insert/update

    Donc disons que mon application génère un bloc comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    var_1 VARCHAR2;
    BEGIN
    -- > un insert avec un RETURNING mon_champs INTO var_1
    END;
    Donc j'ai bien la valeur que je veux dans var_1. Mais bon problème est de récupérer cette valeur en dehors du bloc. (Que ce soit dans fonction/procédure, ou dans une exécution directe du bloc)

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Il faut voir avec l'appli/le langage qui exécute ce bloc. un dbms_output peut suffire, mais tout dépend de l'appelant.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/06/2008, 13h30
  2. [SQL server 2005][vb.net] procédure stockée, valeur de retour
    Par Ouija33 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2008, 18h33
  3. Réponses: 1
    Dernier message: 16/03/2007, 11h46
  4. Réponses: 5
    Dernier message: 18/09/2006, 14h17
  5. [C#] Requete SQL valeur de retour
    Par diaboloche dans le forum Windows Forms
    Réponses: 8
    Dernier message: 12/03/2006, 22h54

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