web-dev-qa-db-ja.com

複数の行を取得して1つの変数に格納-Oracle STORED PROCEDURE

Oracle STORED PROCEDURESに取り組んでいますが、疑問があります。複数の行をフェッチするクエリがあり、これら3つの行の値をすべて1つの変数に格納したい。誰でもこれで私を助けてくれますか?.

私のクエリは次のようになります:

SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

ここで、このクエリは3つの名前を取得します

ジャック、ジル、バニー

これらの3つの名前すべてを1つの変数、つまりC_NAMESに格納する必要があります。そしてその後、手順のさらなるステップでその変数を使用しています。

誰でもこれで私を助けてくれますか?.

あなたの時間と努力を高く評価します。

前もって感謝します、

ヴリンダ:)

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

Oracleバージョン(> = 11G(11.2))に応じて、LISTAGGを使用できます。

SELECT LISTAGG(STUDENT_NAME,',')  WITHIN GROUP (ORDER BY STUDENT_NAME)
FROM STUDENT.STUDENT_DETAILS
WHERE CLASS_ID= 'C';

編集:Oracleのバージョンが11G(11.2)よりも劣っている場合は、ご覧ください here

4
Ederson

みなさん、お時間をいただきありがとうございます。私は質問を解決しました、そして、すべてはエダーソンに感謝します。

解決策は次のとおりです。

SELECT WM_CONCAT(STUDENT_NAME) 
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

これをストアドプロシージャまたはPLSQLで使用している場合は、変数を作成してSELECT INTOを使用して、変数を出力します。

ここにコードがあります

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;

助けてくれてありがとう。

2
vrindamarfatia

そのためにはカーソルが必要です。

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