Je travaille sur Oracle STORED PROCEDURES et j'ai un doute. J'ai une requête qui récupère plus d'une ligne et je veux stocker toutes les valeurs de ces 3 lignes dans 1 variable. Quelqu'un peut-il m'aider s'il vous plaît?.
Ma QUERY va comme ceci:
SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
Ici, cette requête récupère 3 noms
Jack, Jill, Bunny
Je veux que tous ces 3 noms soient stockés dans 1 variable, c'est-à-dire C_NAMES. Et après cela, j'utilise cette variable dans les étapes suivantes de ma procédure.
Quelqu'un peut-il m'aider s'il vous plaît?.
J'apprécierais grandement votre temps et vos efforts.
Merci d'avance,
Vrinda :)
CREATE PROCEDURE a_proc
AS
CURSOR names_cur IS
SELECT student_name
FROM student.student_details
WHERE class_id = 'C';
names_t names_cur%ROWTYPE;
TYPE names_ntt IS TABLE OF names_t%TYPE; -- must use type
l_names names_ntt;
BEGIN
OPEN names_cur;
FETCH names_cur BULK COLLECT INTO l_names;
CLOSE names_cur;
FOR indx IN 1..l_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(l_names(indx).student_name);
END LOOP;
END a_proc;
Selon votre version Oracle (> = 11G (11.2)), vous pouvez utiliser LISTAGG:
SELECT LISTAGG(STUDENT_NAME,',') WITHIN GROUP (ORDER BY STUDENT_NAME)
FROM STUDENT.STUDENT_DETAILS
WHERE CLASS_ID= 'C';
EDIT: Si votre version Oracle est inférieure à 11G (11.2), jetez un oeil ici
Salut à tous et merci pour votre temps. J'ai résolu la question et merci à Ederson.
Voici la solution:
SELECT WM_CONCAT(STUDENT_NAME)
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
Maintenant, si vous l'utilisez dans une procédure stockée ou PLSQL, il vous suffit de créer une variable et d'utiliser SELECT INTO
avec et imprimer la variable.
Voici le code
DECLARE
C_NAMES VARCHAR2(100);
BEGIN
SELECT WM_CONCAT(STUDENT_NAME) INTO C_NAMES
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
dbms_output.put_line(sname);
END;
Merci encore pour votre aide.
Vous aurez besoin d'un curseur pour cela:
DECLARE
CURSOR stud_cur IS
SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
l_stud STUDENT.STUDENT_DETAILS%ROWTYPE;
BEGIN
OPEN stud_cur;
LOOP
FETCH stud_cur INTO l_stud;
EXIT WHEN stud_cur%NOTFOUND;
/* The first time, stud_cur.STUDENT_NAME will be Jack, then Jill... */
END LOOP;
CLOSE stud_cur;
END;