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 :

Utilisation d'une variable dans une procédure PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut Utilisation d'une variable dans une procédure PL/SQL
    Bonjour,

    je n'arrive pas à exécuter une 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
    declare
    v_nombre integer := 5 ;
     
    begin
     
         select sysdate + R.i
         from 
         (
              select 0 as i from dual
              union
              select 1 from dual
              union
              select 2 from dual
              union
              select 3 from dual
              union
              select 4 from dual
              union
              select 5 from dual
              union
              select 6 from dual
         ) R
         where rownum > v_nombre;
    end;
    je reçois le message :

    ERROR at line 6:
    ORA-06550: line 6, column 6:
    PLS-00428: an INTO clause is expected in this SELECT statement
    Quelqu'un a-t-il une idée ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    C'est l'utilisation de rownum qui n'est pas bonne. Pour plus d'info :
    ROWNUM Pseudocolumn

    [edit]
    Oups en fait le code n'est pas bon non plus..
    SELECT INTO
    Il faut utiliser un curseur :
    FOR (curseur)

    Mais l'utilisation de rownum est également fausse

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Un curseur ! que pour cela ?
    Et si j'ai une requête qui a besoin d'un paramètre qui doit être calculé bien avant, je fais comment ?

    Merci, je vais y jeter un coup d'oeil.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    C'est quoi le but de ce select et de cette procédure ?

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    C'est un exemple didactique simplement,
    le but est d'utiliser la variable plutôt que de coder en dur la valeur. Je fais mes premiers pas en PL/SQL les amis.
    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
     
    --declare
    --v_nombre integer := 5 ;
     
    --begin
         SELECT sysdate + R.i
         FROM 
         (
              SELECT 0 AS i FROM dual
              union
              SELECT 1 FROM dual
              union
              SELECT 2 FROM dual
              union
              SELECT 3 FROM dual
              union
              SELECT 4 FROM dual
              union
              SELECT 5 FROM dual
              union
              SELECT 6 FROM dual
         ) R
         WHERE rownum < 5;
    --end;

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Ce que ta base te signale, c'est que faire un select sans utiliser la ou les valeur(s) retournée(s), ça ne sert à rien, donc il refuse de compiler.

    En l'occurrence, qu'est-ce que tu veux faire de tes valeurs "sysdate + R.i" ?

    Si tu veux les afficher, tu peux passer par un curseur, puis boucler et afficher la valeur avec DBMS_OUTPUT.

    Tu peux aussi faire un OPEN (ref_cursor) FOR et retourner un SYS_REFCURSOR ... Bref, il faut savoir ce que tu veux faire de tes résultats

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Un curseur ! que pour cela ?
    Ben l'un dans l'autre, quand on y reflechis un peu ca se comprend qu'il faille un curseur non?

    Si le select renvoie 4 lignes, comment le PLSQL devine quel résultat il doit mettre dans la variable ? Le premier, le dernier, le plus grand ? Il ne peut pas. Donc il faut un curseur, ou bien ramasser tous les résultats.

    Mais, c'est vrai qu'utiliser un curseur pour ça c'est un peu pénible. Et pas optimisé du tout car tu alternes en permanence le PLSQL et le SQL.
    Du coup, tu as la clause BULK COLLECT INTO

    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
    TMP@minilhc >create table tmp as select level as n from dual connect by level<10;
     
    Table created.
     
    TMP@minilhc >declare
      2  type tmp_type is table of tmp.n%type;
      3  l_var tmp_type;
      4  begin
      5  select n bulk collect into l_var from tmp;
      6  dbms_output.put_line(l_var.count);
      7  end;
      8  /
     
     
    9
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:00:00.02
    TMP@minilhc >select * from tmp;
     
             N
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9
     
    9 rows selected.
     
    Elapsed: 00:00:00.01
    TMP@minilhc >
    Sur des gros gros enregistrements tu as une clause limite qui peut être utile.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2011, 15h30
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  5. Réponses: 1
    Dernier message: 15/02/2007, 00h24

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