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 26/08/2008, 14h35   #1
Membre à l'essai
 
Avatar de pascal_T
 
Inscription : avril 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 95
Points : 21
Points : 21
Par défaut Problème avec une requête en SQL dynamique

Bonjour à tous j'ai un souci avec l'exécution de ce code:

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
 
declare
cursor req IS
SELECT table_name,column_name
FROM user_tab_columns
WHERE data_type LIKE '%CHAR%'
AND table_name LIKE 'AGTNAT';
--
nomtable user_tab_columns.table_name%Type ;
colonne  user_tab_columns.column_name%Type ;
resultat integer := 0;
requete varchar(512);
begin
open req;
Loop
fetch req INTO nomtable,colonne;
requete := `select count (*) from` ||  nomtable || `where` || colonne || `like 'TOUJA%'`;
execute immediate requete INTO resultat;
IF resultat > 0 then
   dbms_output.put_line ('table:'||nomtable||' colonne:'||colonne);
end IF;
exit when req%NOTFOUND;
end loop;
close req;
end ;
L'exécution plante sur la déclaration de la requête. Celà me met:

Code :
1
2
3
4
5
6
7
8
9
10
 
ORA-06550: Ligne 16, colonne 12 :
PLS-00103: Symbole "`" rencontré à la place d'un des symboles suivants :
 
   ( - + case mod new not null <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> avg
   count current exists max min prior sql stddev sum variance
   execute forall merge time timestamp interval date
   <a string literal with character set specification>
   <a number> <a single-quoted SQL string> pipe
Qui pourrais m'éclairer?
pascal_T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 14h59   #2
Membre émérite
 
Inscription : août 2008
Messages : 835
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 835
Points : 823
Points : 823
Salut,

Pense aux espaces (après le from, avant et après le where, etc...) lorsque tu crées ta chaine de caractères.

Code :
requete := 'select count (*) from ' ||  nomtable || ' where ' || colonne || ' like ''TOUJA%''';
Autre chose, tu n'utilises pas le bon délimiteur pour tes chaines de caractère. Ce n'est pas ` mais '.
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 15h04   #3
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
La remarque de Snipah sur les espaces me semble pertinente.
De plus,toute quote que tu veux passer en tant que telle dans la chaîne de caractère doit être doublée, donc je pense que tu dois réécrire cette ligne (16) de la façon suivante :
Code :
1
2
 
requete := `select count (*) from` ||  nomtable || `where` || colonne || `like ''TOUJA%''`;
De plus, tu as 2 types de quotes (` et '), il faudrait homogénéiser avec '. Je me demande d'ailleurs si ce n'est pas l'utilisation de ` qui génère le message d'erreur actuel (ligne 16, colonne 12...)
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 15h14   #4
Membre émérite
 
Inscription : août 2008
Messages : 835
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 835
Points : 823
Points : 823
Si, c'est ce caractère qui génère l'erreur. Oracle ne le reconnait pas comme délimiteur de chaîne, j'ai édité mon message pendant que tu écrivais le tien
Je connais pas trop MySQL, mais il me semble que ` est un délimiteur mysql.
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 15h23   #5
Membre à l'essai
 
Avatar de pascal_T
 
Inscription : avril 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 95
Points : 21
Points : 21
Merci Snipah ta syntaxe est la bonne. La raison de la présence des "`" dans ma requête est que je suis allé voir le tutoriel SQL dynamique natif est qu'il y a un exemple de ce type :

Code :
1
2
3
4
 
 
LC$Requete :=SELECT count(*) FROM|| PC$Table ||WHERE|| PC$ClauseWhere ;
  EXECUTE IMMEDIATE LC$Requete INTO LN$Total ;
Du coup ça a mis direct en vrac la requête. Pour l'histoire des quotes ce n'est pas la première fois que j'ai ce souci. mais je confonds avec les " comme solution.

Merci à vous.
pascal_T est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h58.


 
 
 
 
Partenaires

Hébergement Web