Oracle Lab.
Welcome : you are not logged in.
 
fr
en
zh-cn
 Forum Index >  Oracle > SQL & PL/SQL > Concatenation de chaine de caractere en tant que variable
Baptiste Sorrentino 
Title : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum]
New poster

Posts: 13
Joined: 12-December-2006
Member N°: 2729


Bonjour tout le monde.
Je voudrais savoir s'il était possible d'utiliser une chaîne de caractère concaténer, en tant que variable
Je m'explique par un exemple:

Code

CREATE OR REPLACE PROCEDURE add_data (d1 VARCHAR2, d2 VARCHAR2, d3 VARCHAR2) IS
req VARCHAR2(250) := 'SELECT last_name FROM employees WHERE first_name =';

i NUMBER := 2;

BEGIN

req = req || CONCAT('d',i);  -- Je voudrais que CONCAT('d',i) => la variable d1

EXECUTE IMMEDIATE req;

END add_data;
/

Voila, donc je sais que ça n'a pas trop de sens, mais je l'ai trouvé
Sat 22/03/2008 14:39:44
offSend a private message to this user
Go on the top of the page
Pascal Graziani 
Title : RE : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum][forum][forum][forum][forum]
Administrator

Posts: 52
Joined: 14-December-2005
Member N°: 1669


Salut Baptiste,
 
Normalement ton bloc est bon si ce n'est :
req = req || CONCAT('d',i);
 
c'est :=
 
Par contre, Oracle n'est pas capable de remplacé la string d2 générée par le contenu de la varaible.
 
Je pense qu'il serait plus simple que tu généres le contenu de d2 avant d'appeler add_data.
 
Bonne journée.

Pascal GRAZIANI
Directeur du Laboratoire SUPINFO des Technologies Oracle
SUPINFO Certified Trainer
Tue 25/03/2008 10:16:42
offSend a private message to this user
Go on the top of the page
Baptiste Sorrentino 
Title : RE : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum]
New poster

Posts: 13
Joined: 12-December-2006
Member N°: 2729


Salut Pascal,
Merci de ta réponse.
Pour le := c'est juste une erreur de recopie.

Je ne pense pas que je puisse générer le contenu avant d'appeler ma procédure.
Voici en fait ce que je veux faire.
J'ai un package qui gère mes dml, et mes ddl.
Et dans ce package, je vais avoir une procédure qui ajoute des données avec l'otre insert.
Alors comme je veux pouvoir l'utiliser via iSQL*Plus, l'utilisateur final va faire un:

EXECUTE add_data(nom_table, valeur1,valeur2,valeur3..).

Cependant, pour éviter de faire plusieurs surcharges de procédure ( autant de procédure que de table avec un nombre de colonne différents ), je voudrai faire une seule procédure qui puisse s'adapter si l'user met 1 donnée ou 10 (en fonction de la table qu'il appelle).
Voici ma procédure:

Code

CREATE OR REPLACE PROCEDURE add_data (tablename VARCHAR2, d1 VARCHAR2, d2 VARCHAR2 DEFAULT 1, d3 VARCHAR2 DEFAULT 1, d4 VARCHAR2 DEFAULT 1, d5 VARCHAR2 DEFAULT 1, d6 VARCHAR2 DEFAULT 1, d7 VARCHAR2 DEFAULT 1, d8 VARCHAR2 DEFAULT 1, d9 VARCHAR2 DEFAULT 1) IS

req VARCHAR2(250) := 'INSERT INTO ' || tablename || ' VALUES ('; --Debut de ma requete insert

i NUMBER := 2;

nb_column NUMBER;

BEGIN

SELECT COUNT(*) INTO nb_column FROM user_tab_columns WHERE table_name = tablename; --compte le nombre de colonne de la table

req := req || '''' || d1 || ''''; --

IF nb_column > 1 THEN

LOOP

req := req || || concat('d',i) || ''''; --Ajoute la valeur pour le insert

i := i + 1;

EXIT WHEN i = nb_column -1;

END LOOP;
END IF;

req := req || ')'; --Ajoute ' ) ' à la fin de la requete

EXECUTE IMMEDIATE req;

END add_data;
/


Voila, j'espère que je suis clair :s
Wed 26/03/2008 09:42:59
offSend a private message to this user
Go on the top of the page
Xavier Goeminne 
Title : RE : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum][forum]
Invited

Posts: 20
Joined: 11-December-2005
Member N°: 1651


Bonjour,
 
Je vais peut-être dire une bétise, mais pourquoi ne pas passer seulement 2 paramètres ?
 
Le deuxième paramètre étant un VARCHAR2 regroupant tous les autres paramètres :
 
Code
CREATE OR REPLACE PROCEDURE add_data (tablename VARCHAR2, d1 VARCHAR2) IS

req VARCHAR2(250) := 'INSERT INTO ' || tablename || ' VALUES (';

BEGIN

req := req || d1 || ')';

EXECUTE IMMEDIATE req;

END add_data;
/
Ainsi tu peux insérer dans n'importe quelle table.
 
Mais le problème est que dans ce cas-là, l'utilisateur de la procédure devra faire attention aux virgules et aux guillemets lors de l'appel.
 
Exemple d'appel :
 
Code
execute add_data(toto, "100, ""Xavier"", ""Goeminne"", ""dis des bétises""")

SCT Oracle Lille et Valenciennes
OCA Developer
Stagiaire DBA Cap Gemini
Thu 27/03/2008 14:34:32
offSend a private message to this user
Go on the top of the page
Baptiste Sorrentino 
Title : RE : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum]
New poster

Posts: 13
Joined: 12-December-2006
Member N°: 2729


En effet Xavier,
Ta méthode est beaucoup plus simple!
Je vais faire comme ça, merci!
Mon 31/03/2008 11:07:01
offSend a private message to this user
Go on the top of the page
Baptiste Sorrentino 
Title : RE : Concatenation de chaine de caractere en tant que variable
Show the link to this postAlert moderator about this topic 
[forum]
New poster

Posts: 13
Joined: 12-December-2006
Member N°: 2729


Et sinon, est-ce qu'il est possible de faire un FOR ou un WHILE sur tous les arguments de la procédure ?
Tue 01/04/2008 20:33:47
offSend a private message to this user
Go on the top of the page
 Forum Index >  Oracle > SQL & PL/SQL > Concatenation de chaine de caractere en tant que variable
 0 user(s) are browsing this forum (1 Anonymous)
 0 member(s):
Time is now : 28 August 2008 08:15:53Lite Version
Powered by Helyos v0.6.4 © 2007

© Copyright SUPINFO - The International Institute of Information Technology
Conditions of Use & Copyright - Respect of Private Life

Build in: 53ms