2013-06-06 2 views
7

Я работаю над ORACLE STORED PROCEDURES, и у меня есть сомнения. У меня есть запрос, который извлекает более 1 строки, и я хочу сохранить все эти значения трех строк в 1 переменной. Может ли кто-нибудь помочь мне в этом.Fetch MULTIPLE ROWS and STORE в 1 ПЕРЕМЕННЫЙ - ORACLE ЗАПОМНЕННАЯ ПРОЦЕДУРА

Мой QUERY выглядит следующим образом:

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

Вот этот запрос выбирает 3 имени

Джек, Джилл, Банни

Я хочу, чтобы все эти 3 имена для хранения в 1 переменной, то есть C_NAMES. И после этого я использую эту переменную в дальнейших шагах моей процедуры.

Может кто-нибудь, пожалуйста, помогите мне с этим.

Я был бы очень признателен за ваше время и усилия.

Спасибо заранее,

Vrinda :)

+0

Как вы собираетесь использовать значения позже? Вы можете посмотреть на курсор ref, таблицу PL/SQL ... зависит от того, как вы хотите передать их и/или ссылаться на них. –

+0

Я должен использовать этот C_NAMES в clob для замены значений, все, что заменяет код. Я просто хочу, чтобы все имена в переменной 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

Я думаю, что есть необходимость добавить «% TYPE» в «names_t» после ** TYPE names_ntt IS TABLE OF 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

В зависимости от версии Oracle (> = 11G (11,2)), вам можно использовать LISTAGG:

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

EDIT: Если ваша версия Oracle уступает 1 1G (11,2), посмотрите here

+0

Я работаю над TOAD FOR ORACLE, Этот код показывает: ORA-00923: FROM ключевое слово не найдено, где ожидалось – vrindamarfatia

+0

Для этого я предполагаю, что ваша версия Oracle уступает 11G. Посмотрите на мой EDIT, я считаю, что ссылка вам поможет. – Ederson

+0

Я использую ORACLE 11G – vrindamarfatia

0

Привет всем и спасибо за ваше время. Я решил вопрос и все спасибо Эдерсону.

Вот решение:

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; 

Еще раз спасибо за вашу помощь людям.

 Смежные вопросы

  • Нет связанных вопросов^_^