Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
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 29/09/2011, 09h50   #1
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 23
Points : 4
Points : 4
Par défaut Requête select avec variable

Bonjour,

Je débute en PL/SQL et j'ai accès à une base oracle en lecture seule et je n'ai pas accès au serveur de la base.
J'essaie de faire une requête simple avec variable du type
Code :
1
2
3
4
5
declare
var  integer;
begin
:var:=1;
SELECT champ1 FROM TABLE WHERE champ2=:var;
Mais j'ai une erreur m'indiquant que je dois faire un select into.
Cela implique que je mette le résultat dans des variables et que je récupère ces variables soit avec utl_file ou DBMS_OUTPUT
Mais n'ayant pas accès au serveur je ne peux pas utiliser utl_file et ne voulant pas me limiter à 32767 octets pour le résultat, je souhaite trouver une autre solution.
N'est-il pas possible de faire un simple select pour avoir ce résultat.

Merci d'avance pour vos réponses.

katwes
katwes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 10h50   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Citation:
Mais j'ai une erreur m'indiquant que je dois faire un select into.
et en effet :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
declare
var integer;
var2 TABLE.champ1%TYPE;
begin
     var:=1;
 
     SELECT champ1 
     INTO  var2
     FROM TABLE 
     WHERE champ2 = var;
 
     DBMS_OUTPUT.PUT_LINE ( champ1  );
 
END;
/
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h27   #3
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 23
Points : 4
Points : 4
Merci pour cette réponse,

Mais je ne souhaite pas afficher mon résultat via dsmb_output ni utl_file.

Sur sql server
il est possible de faire :

Code :
SELECT champ1 FROM TABLE WHERE champ2=var
Cela affiche directement le résultat de la requête.
Est-ce possible en PL/SQL ?
katwes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h37   #4
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
Bonjour,

Citation:
[...]ne voulant pas me limiter à 32767 octets pour le résultat, je souhaite trouver une autre solution.[...]
Je pense que katwes ne veut pas utiliser de DBMS_OUTPUT justement.

Cela étant dit, sans éléments de contexte, difficile de trouver une solution. Quel est le but de l'opération? Effectuer une série de select avec des filtres différents et afficher la sortie? Comment ce script serait-il exécuté? Est-ce une fonction/proc en base? Un script SQL*Plus est-il envisageable?

Par ailleurs katwes, attention à la différence entre ":var1" et "var1":


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SQL> SET serveroutput ON
SQL> declare
  2  var1 number := 5;
  3  begin
  4  :var1 := 3;
  5  dbms_output.put_line('var1 = '||var1);
  6  dbms_output.put_line(':var1 = '||:var1);
  7  end;
  8  /
 
SP2-0552: Variable de lien "VAR1" non déclarée.
 
SQL> variable var1 number;
SQL> /
var1 = 5
:var1 = 3
 
Procédure PL/SQL terminée avec succès.
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h37   #5
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
En SQL directement, pas en PL/SQL.

Le PL/SQL c'est brutal est lent par rapport au SQL, sans compter que ca ajoute un langage a apprendre avec tout ce que ca implique quand on part de zero.

Evitez le autant que possible, l'hyper-majorite du temps le SQL fonctionne tres bien.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h39   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
De la même façon, mais faites du SQL (langage d'interrogation des bases de données) et pas du PL/SQL (langage de développement procédural exécuté sur le serveur - spécifique à Oracle).

Dès que vous voyez un BEGIN, vous faites du PL/SQL et plus du SQL.

Quel est votre client SQL ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h58   #7
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 23
Points : 4
Points : 4
J'utilise un requeteur gratuit WinSQL Lite et un driver odbc datadirect 6.1 wire protocol
En fait je suis confronté à plusieurs problèmes, j'ai simplifié au minimum la requête juste pour illustrer le problème de variable
mais mes requêtes ont beaucoup plus de champs dont des clobdata, certaines contiennent des curseurs.
J'ai eu des messages d'erreus m'indiquant que je dépassait la limite des 32767 octets.
C'est pourquoi j'essaie de ne pas utiliser DBMS_OUTPUT.
katwes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 12h18   #8
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
Citation:
Envoyé par katwes Voir le message
J'ai eu des messages d'erreus m'indiquant que je dépassait la limite des 32767 octets.
C'est pourquoi j'essaie de ne pas utiliser DBMS_OUTPUT.
pour ton information le buffer de DBMS_OUTPUT varie entre 2000 et 1000000 bytes.

pour lire plus..



http://docstore.mik.ua/orelly/oracle/bipack/ch06_01.htm
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h00   #9
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 23
Points : 4
Points : 4
Merci pour l'info,

la limite en question est sur la ligne
Citation:
Line length overflow, limit is 32767 bytes per line
katwes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h10   #10
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
pour benificier de la taille maximale du buffer, il faut mattre
Code :
DBMS_OUTPUT.ENABLE(1000000);
avant l'affichage.
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 15h16   #11
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 23
Points : 4
Points : 4
C'est ce que j'avais fait mais il n'est pas possible d'aller au delà de 32767 octet par ligne.
katwes 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 20h46.


 
 
 
 
Partenaires

Hébergement Web