Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/10/2011, 19h24   #1
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

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

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Par défaut Utilisation d'une variable dans une procédure PL/SQL

Bonjour,

je n'arrive pas à exécuter une procédure

Code :
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 :

Citation:
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 !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 19h49   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 20h38   #3
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

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

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
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 !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 00h03   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
C'est quoi le but de ce select et de cette procédure ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 18h51   #5
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

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

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
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 :
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 !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 10h22   #6
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
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
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h00   #7
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 536
Points : 536
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 :
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h21.


 
 
 
 
Partenaires

Hébergement Web