web-dev-qa-db-fra.com

Récupérez plusieurs lignes et stockez-les en une seule variable - Oracle STORED PROCEDURE

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 :)

9
vrindamarfatia
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;
21
the_slk

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

4
Ederson

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.

2
vrindamarfatia

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;
2
vc 74