Получите НЕСКОЛЬКО рядов и храните в 1 ПЕРЕМЕННОЙ - ПРОЦЕДУРЕ ХРАНЕНИЯ ОРАКУЛОВ

Я работаю над ORACLE STORED PROCEDURES и у меня есть сомнения. У меня есть запрос, который выбирает более 1 строки, и я хочу сохранить все эти 3 строки 's значения в 1 переменной. Кто-нибудь может помочь мне с этим.

Мой запрос выглядит так:

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

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

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

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

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

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

Заранее спасибо,

Вринда :)

 Alex Poole06 июн. 2013 г., 18:58
Как вы собираетесь использовать значения позже? Вы можете посмотреть на курсор ref, таблицу PL / SQL ... зависит от того, как вы хотите передать их и / или сослаться на них.
 vrindamarfatia06 июн. 2013 г., 19:06
Я должен использовать этот C_NAMES в clob, чтобы заменить значения, все, что заменяющий код сделан, я просто хочу все имена в переменной C_NAMES на данный момент.

Ответы на вопрос(4)

Вы'для этого понадобится курсор:

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;
 vrindamarfatia06 июн. 2013 г., 18:40
Эй, спасибо за быстрый ответ, но я попробовал этот код и его отображение --PLS-00302: component 'STUDENT_DETAILS» должен быть объявлен --PLS-00320: объявление типа этого выражения является неполным или имеет неправильный формат

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

Вот решение:

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;

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

В зависимости от вашей версии 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), посмотритеВот

 vrindamarfatia06 июн. 2013 г., 19:07
Я использую ORACLE 11G
 vrindamarfatia07 июн. 2013 г., 17:20
Большое вам спасибо, это сделано с помощью wm_concat (name) .... Большое спасибо !!!!
 Ederson06 июн. 2013 г., 18:49
Для этого я предполагаю, что ваша версия Oracle уступает 11G. Посмотрите на мой РЕДАКТИРОВАТЬ, я думаю, что ссылка поможет вам.
 Ederson06 июн. 2013 г., 20:42
странно, я выполнил точно такой же запрос (за исключением схемы Стьюдента), и он работал как шарм. Это результат: Банни, Джек, Джилл
 Ederson06 июн. 2013 г., 20:00
Это должно быть 11.2G. Та же проблема:stackoverflow.com/questions/5569633/oracle-sql-listagg-function
 vrindamarfatia06 июн. 2013 г., 21:26
О, я должен поставить имя схемы, потому что я выполняю процедуру из другой схемы, которая 'почему ... другое решение, пожалуйста
 vrindamarfatia06 июн. 2013 г., 20:15
да, это 11.2G
 vrindamarfatia06 июн. 2013 г., 18:43
Я работаю над TOAD FOR ORACLE, этот код показывает: ORA-00923: ключевое слово FROM не найдено там, где ожидается
Решение Вопроса
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;
 Tenzin13 нояб. 2015 г., 11:05
Ваш код не на 100% правильный, он выдает ошибку, которую говорит пользователь выше меня. Вам нужно использоватьTYPE names_ntt IS TABLE OF names_cur%ROWTYPE; И удалить.names_t names_cur%ROWTYPE;
 SophisticatedUndoing13 окт. 2015 г., 12:02
Я думаю, что есть необходимость добавить%ТИП' кnames_t»  послеTYPE names_ntt IS TABLE OF names_t;

Ваш ответ на вопрос