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