2013-06-06 7 views
7

Pracuję nad PROCEDURAMI ORACLE STORED i mam wątpliwości. Mam kwerendę, która pobiera więcej niż 1 wiersz i chcę przechowywać wszystkie te 3 wiersze wartości w 1 zmiennej. Czy ktokolwiek może mi w tym pomóc.Zdobądź WIELE WIERSZY i SKLEPÓW w 1 WARIANCJI - ORACLE PRZECHOWYWANA PROCEDURA

moje pytanie brzmi tak:

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

Tutaj ta kwerenda pobiera 3 nazwy

Jack Jill Bunny

chcę wszystkie te 3 nazwiska być przechowywane w 1 zmiennej tj. C_NAMES. A potem używam tej zmiennej w dalszych krokach mojej procedury.

Czy ktoś może mi pomóc z tym.

Będę bardzo wdzięczny za poświęcony czas i wysiłek.

Dzięki z góry,

Vrinda :)

+0

Jak zamierzasz używać wartości później? Możesz spojrzeć na kursor ref, tabelę PL/SQL ... zależy od tego, jak chcesz je przekazać i/lub odnieść do nich. –

+0

Muszę użyć tego C_NAMES w clob, aby zastąpić wartości, wszystko, co zrobił kod zastępczy Chcę po prostu wszystkie nazwy w zmiennej C_NAMES od teraz. – vrindamarfatia

Odpowiedz

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

Myślę, że istnieje potrzeba dodania "% TYPE" do "names_t" po ** TYPE names_ntt IS TABLE OF names_t; ** – SophisticatedUndoing

+1

Twój kod nie jest w 100% poprawny, ponieważ podaje błąd, o którym mówi powyżej. Musisz użyć 'TYPE names_ntt IS TABLE OF names_cur% ROWTYPE;' I usunąć 'names_t names_cur% ROWTYPE;'. – Tenzin

2

Musisz kursor na to:

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

Hej Dzięki za szybką odpowiedź, ale próbowałem ten kod i jego pokazując --PLS-00302: komponent „STUDENT_DETAILS” należy uznać za --PLS-00320: oświadczenie o rodzaju tego wyrażenia jest niekompletna lub zniekształcone – vrindamarfatia

3

zależności od wersji Oracle (> = 11G (11,2)), was można użyć LISTAGG:

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

EDIT: Jeśli wersja Oracle jest gorszy do 1 1G (11,2), przyjrzeć here

+0

Pracuję nad TOAD FOR ORACLE, Ten kod jest wyświetlany: ORA-00923: FROM nie znaleziono słowa kluczowego gdzie oczekiwano – vrindamarfatia

+0

Zakładam, że twoja wersja Oracle jest gorsza od 11G. Spójrz na moją EDYCJĘ, wierzę, że link ci pomoże. – Ederson

+0

Używam ORACLE 11G – vrindamarfatia

0

Witam wszystkich i dziękuję za rozmowę. Rozwiązałem to pytanie i wszystko dzięki Edersonowi.

Oto rozwiązanie:

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

Teraz, jeśli używasz to w procedurze przechowywanej lub plsql po prostu trzeba utworzyć zmienną i używać SELECT INTO z nim i drukować zmienną.

Oto kod

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; 

Jeszcze raz dziękuję za pomoc ludzi.

Powiązane problemy