Mettre le nom d'une table en paramètre dans un script Sql

Mettre le nom d'une table en paramètre dans un script Sql - SQL/NoSQL - Programmation

Marsh Posté le 21-10-2005 à 10:52:16    

Bonjour,
 
J'ai un long script sql faisant référence à une table au moins 40 fois.
Je souhaiterais que cette table soit un paramètre d'entrée dans ce script, puisque je suis amené à lancer ce script plusieurs fois mais avec à chaque fois un nom de table différent
Une solution serait d'ouvrir le script et faire un "Edition" "Remplacer" le nom de la table par le nom souhaité, mais ceci est une manipulation manuelle.
Existe - t -il une syntaxe en SQL pour mettre une table en paramètre ?
 
Je sais que dans un script on peut entrer la valeur d'un attribut par  
select a, b from table
where a=&monchamp;
 
et ceci est valable pour une table aussi
 
select a,b from &table;
where a='unevaleur';
 
mais dans tel cas dans un script il faut rentrer le nom de la table plusieurs fois quand celle-ci apparait plusieurs fois.
 
Donc savez vous s'il est possible d'avoir une table en paramètre dans un script ?
Si vous avez des réponses, cela m'interesserait de savoir....
 
Merci d'avance.


---------------
Tessa
Reply

Marsh Posté le 21-10-2005 à 10:52:16   

Reply

Marsh Posté le 21-10-2005 à 11:02:54    

Quel SGBD ? Que langage de programmation ?
 
Il faut faire du SQL dynamique ...

Reply

Marsh Posté le 21-10-2005 à 11:14:36    

Beegee a écrit :

Quel SGBD ? Que langage de programmation ?
 
Il faut faire du SQL dynamique ...


 
bonjour,
 
mon script est fait en sql (j'ai un script avec des requetes de creation d'une table (create et insert) et un autre script avec des requetes selects sur cette table) ,  
et le sgbd est oracle.
je sais pas ce que c'est du sql dynamique, mais je chercherai.
tu penses sincèrement que c'est possible ?


---------------
Tessa
Reply

Marsh Posté le 21-10-2005 à 11:24:49    

Il suffit de transformer :
 
CREATE TABLE toto (test VARCHAR2(10));
 
En :
 
DECLARE
  tableName VARCHAR2;
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE ' || tableName || ' (test VARCHAR2(10))';
END;
 
(il manque ici la récupération du nom de la table)
 
Tu es sous unix ? windows ?

Reply

Marsh Posté le 21-10-2005 à 11:27:26    

je suis sous windows,
en fait j'utilise toad pour faire ces requetes.


---------------
Tessa
Reply

Marsh Posté le 21-10-2005 à 12:14:16    

Tu peux faire une procédure PL/SQL qui prend en paramètre d'entrée le nom de la table, et ensuite tu appelles cette procédure une fois par table.

Reply

Marsh Posté le 21-10-2005 à 12:16:07    

Encore faut il qu il ait Oracle, Sql Server... mais moi je parierai sur du MySQL donc pas prog SQL avancé...

Reply

Marsh Posté le 21-10-2005 à 12:16:25    

avec toad, t'as un bouton (à côté du bouton executer) qui permet d'éxécuter un bloc de code comme un script.
 
a ce moment, les statement begin et tout ça sont bien pris en compte

Reply

Marsh Posté le 21-10-2005 à 12:17:36    

Oreste a écrit :

Encore faut il qu il ait Oracle, Sql Server... mais moi je parierai sur du MySQL donc pas prog SQL avancé...


bah lis sont second post ;) il est sous Oracle, sous Windows et il utilis TOAD :p

Reply

Marsh Posté le 21-10-2005 à 12:17:41    

Ne pas prendre en compte ma remarque ci dessus j ai pas vu qu il avait Toad :)

Reply

Marsh Posté le 21-10-2005 à 12:17:41   

Reply

Marsh Posté le 21-10-2005 à 12:18:04    

Oui oui desole j ai sauté le post :d

Reply

Marsh Posté le 21-10-2005 à 12:18:44    

faut faire comme moi : toujours lire les topics en partant de la fin, comme ça t'es sûr de pas avoir un wagon de retard ;)

Reply

Marsh Posté le 22-10-2005 à 20:31:12    

Beegee a écrit :

Tu peux faire une procédure PL/SQL qui prend en paramètre d'entrée le nom de la table, et ensuite tu appelles cette procédure une fois par table.


 
Bonjour,
 
Merci pour vos messages, vos réponses, et ces pistes.
Mais ça reste encore un peu confus pour moi.
 
Le mieux est-il de faire du Sql dynamique en utilisant l’instruction suivante ?
 
DECLARE  
  tableName VARCHAR2;  
BEGIN  
  EXECUTE IMMEDIATE 'CREATE TABLE ' || tableName || ' (test VARCHAR2(10))';  
END;
 
 
Ou faut il créer des procédures sql ?
(une procédure pour la création de la table et une autre pour les requêtes selects sur cette table sachant bien que ces requêtes sont très complexes et retournent des tas de chiffres)
 
Ou faut-il utiliser les deux ?
 
Mais je doute bien qu’on puisse créer une procédure pour les requêtes.
 
Je vous confirme que le seul outil que j’ai pour faire mes scripts est toad,
Je n’ai pas sql server, pas d’accès direct à Oracle.
 
Si je n’ai pas été claire sur mon post, voici en gros le contenu de mes scripts :
 
______________________________________
Script 1 :
 
Create table TOTO (
 Attribut 1 type1,
Attribut 2 type2,
...
Attribut n type n )
 
Insert Into TOTO (...)
 
Script 2 :
 
Select ...  from TOTO
Select ...  from TOTO, et d’autres tables
____________________________________


---------------
Tessa
Reply

Marsh Posté le 22-10-2005 à 22:12:23    

Si malgré leur nombre, le nom des tables est fixe, à mon avis, d'un point de vue purement performances, il est mieu de dupliquer les scripts.
 
Ceci dit, tu peux faire un script de ce genre (désolé, il ne fonctionne certainement pas !)
 
create or replace procedure Initilization(MaTable varchar2(50))
is
begin
    EXECUTE IMMEDIATE 'CREATE TABLE ' || tableName || ' (test VARCHAR2(10))';
    EXECUTE IMMEDIATE 'insert into ' || tableName || ' (test) values (''ma valeur'')';
end;
 
Pour les requêtes, idem. Plutôt que de faire des procédures, je te conseille toutefois de créer des vues. Plus souples, elle donnent les mêmes résultats niveau performance.


Message édité par Arjuna le 22-10-2005 à 22:13:28
Reply

Marsh Posté le 22-10-2005 à 22:33:44    

Tout dépend du nombre de tables à traiter.
 
La meilleure solution à mon avis est la procédure PL/SQL avec le nom de table en entrée, comme dit précédemment.
 
Du point de vue perfs à mon avis ça change rien. Le parsing du EXECUTE IMMEDIATE est négligeable par rapport à l'exécution de la requête.
 
Arjuna, je comprends pas trop ta phrase : "Plutôt que de faire des procédures, je te conseille toutefois de créer des vues. Plus souples, elle donnent les mêmes résultats niveau performance". Je ne vois pas le rapport ...

Reply

Marsh Posté le 22-10-2005 à 23:14:36    

La demoiselle parle de faire des requêtes qui retournent plein de données.
 
Plutôt que de faire des procédures stockées, à ce moment, c'est mieu de faire des vues.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed