2013-06-06 7 views
7

오라클 저장 절차를 진행하고 있으며 의심의 여지가 있습니다. 하나 이상의 행을 가져 오는 쿼리가 있고 그 모든 3 행의 값을 1 개의 변수에 저장하려고합니다. 누구든지 이걸 도와주세요.다중 행 및 저장을 1 개 가변 - 오라클 저장 프로 시저로 가져 오기

내 쿼리는 다음과 같이 진행됩니다

여기

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

이 쿼리는 3 명

를 가져

잭, 질, 버니

나는 모든 3 이름을 원하는 1 개의 변수, 즉 C_NAMES에 저장됩니다. 그리고 그 후에 나는 그 절차를 진행할 때 그 변수를 사용하고 있습니다.

아무도 도와 주실 수 없습니까?

시간과 노력에 감사드립니다. 사전에

감사합니다,

Vrinda :

+0

어떻게 값을 나중에 사용 하시겠습니까? 참조 커서, PL/SQL 테이블을 볼 수 있습니다 ... 당신이 그들을 전달하거나 참조 할 방법에 따라 다릅니다. –

+0

나는 그 코드를 대체하는 값을 대체하기 위해 clob에서 그 C_NAMES를 사용해야한다. 나는 지금 C_NAMES 변수의 모든 이름을 원한다. – vrindamarfatia

답변

17
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; 
+2

** 'names_t'에 '% TYPE'을 (를) 추가해야 할 필요가 있다고 생각합니다. ** TYPE names_ntt는 names_t; ** – SophisticatedUndoing

+1

입니다. 코드가 100 % 정확하지 않습니다. 위의 사용자에게 오류가 발생합니다. 'TYPE names_ntt IS TABLE OF names_cur % ROWTYPE;' 을 사용하고'names_t names_cur % ROWTYPE;'을 제거해야합니다. – Tenzin

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; 
+0

안녕하세요, 신속한 회신을 보내 주셔서 감사합니다.이 코드와 그 표시를 시도했습니다. --PLS-00302 : 'STUDENT_DETAILS'구성 요소를 선언해야합니다. - PLS-00320 :이 표현식 유형 선언이 불완전하거나 형식이 다릅니다 – vrindamarfatia

3

을 (> = 11G (11.2))을

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

편집 : 오라클 버전이 불량 인 경우 1 LISTAGG을 사용할 수 있습니다 1G (11.2),보고 here

+0

ORA-00923 : FROM keyword not expected where – vrindamarfatia

+0

나는 오라클 버전이 11G보다 열등하다고 가정합니다. 내 편집 좀 봐, 링크가 도움이 될 것 같아요. – Ederson

+0

오라클 11G – vrindamarfatia

0

안녕 모두를 가지고 시간 내 주셔서 감사합니다. 저는 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; 

다시 한번 감사 코드입니다.