Oracle STORED PROCEDURESに取り組んでいますが、疑問があります。複数の行をフェッチするクエリがあり、これら3つの行の値をすべて1つの変数に格納したい。誰でもこれで私を助けてくれますか?.
私のクエリは次のようになります:
SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
ここで、このクエリは3つの名前を取得します
ジャック、ジル、バニー
これらの3つの名前すべてを1つの変数、つまりC_NAMESに格納する必要があります。そしてその後、手順のさらなるステップでその変数を使用しています。
誰でもこれで私を助けてくれますか?.
あなたの時間と努力を高く評価します。
前もって感謝します、
ヴリンダ:)
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;
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
みなさん、お時間をいただきありがとうございます。私は質問を解決しました、そして、すべてはエダーソンに感謝します。
解決策は次のとおりです。
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;
助けてくれてありがとう。
そのためにはカーソルが必要です。
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;