我正在研究ORACLE STORED PROCEDURES,我有一个疑问。 我有一个查询,它获取超过1行,我想将所有这3行的值存储在1个变量中。 任何人都可以帮助我。
我的QUERY是这样的:
SELECT STUDENT_NAME
FROM STUDENT.STUDENT_DETAILS
WHERE CLASS_ID= 'C';
此查询提取3个名称
杰克, 吉尔, 兔子
我希望所有这3个名字都存储在1个变量中,即C_NAMES。 之后我在我的程序的后续步骤中使用该变量。
任何人都可以帮助我。
我非常感谢您的时间和精力。
提前致谢,
Vrinda:)
答案 0 :(得分:20)
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;
答案 1 :(得分:4)
根据您的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
答案 2 :(得分:2)
你需要一个光标:
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;
答案 3 :(得分:1)
大家好,谢谢你的时间。 我已经解决了这个问题,并感谢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;
再次感谢您的帮助。