Как сохранить несколько строк в переменной в PLSQL

#sql #oracle #stored-procedures #plsql

#sql #Oracle #хранимые процедуры #plsql

Вопрос:

у меня проблема с сохранением выбранных нескольких строк в переменной (или табличной переменной, о которой я не знаю). Я думаю, что это возможно заставить работать. Вот мой код

   SELECT RECIPIENT, COUNT (*) N_CNT
    FROM (SELECT RECIPIENT,
                 SERVICE_TYPE,
                 MPS_SWTCH_CD,
                 MPS_FTR_CD1
            FROM ABA_RM_INB_USAGE
           WHERE SERVICE_TYPE = 100
              OR SERVICE_TYPE = 0
             AND MPS_SWTCH_CD = 'T11'
             AND MPS_FTR_CD1 = 1033)
GROUP BY RECIPIENT
  

Этот запрос показывает отфильтрованные строки, и мне нужно вставить эти строки в другую таблицу. Кстати, извините за плохой английский

Комментарии:

1. Каков ваш контекст для вставки выбранных данных в другую таблицу? Вы можете выполнить поиск по GTT oracle но почему бы вам просто не INSERT INTO another_table(column1, column2) SELECT recipient, COUNT(*) FROM.... ? И в вашем запросе, похоже, тоже есть синтаксическая ошибка.

2. Создайте таблицу object со столбцами, аналогичными столбцам вашего запроса, и сохраните результат вашего запроса, используя переменную to вашего табличного типа.

3. Если вам нужно вставить этот результат в другую таблицу, то просто сделайте это. Переменные не нужны.

4. как? можете ли вы привести мне какой-нибудь пример?

Ответ №1:

Я не совсем уверен, чего вы хотите достичь.

Если вы хотите выбрать из одной таблицы и вставить в другую, вы можете обернуть инструкцию insert вокруг вашего select:

 INSERT INTO TABLE_RECIPIENT_COUNT
      SELECT RECIPIENT, COUNT (*) N_CNT
        FROM (SELECT RECIPIENT,
                     SERVICE_TYPE,
                     MPS_SWTCH_CD,
                     MPS_FTR_CD1
                FROM ABA_RM_INB_USAGE
               WHERE SERVICE_TYPE = 100
                  OR SERVICE_TYPE = 0
                 AND MPS_SWTCH_CD = 'T11'
                 AND MPS_FTR_CD1 = 1033)
    GROUP BY RECIPIENT;
  

Если вы хотите сделать это в plsql-скрипте (или процедуре ..), вы могли бы определить тип или выполнить цикл с помощью курсора. Вот пример, как перебирать курсор и обрабатывать данные:

 DECLARE
    CURSOR cur
    IS
          SELECT RECIPIENT, COUNT (*) N_CNT
            FROM (SELECT RECIPIENT,
                         SERVICE_TYPE,
                         MPS_SWTCH_CD,
                         MPS_FTR_CD1
                    FROM ABA_RM_INB_USAGE
                   WHERE SERVICE_TYPE = 100
                      OR SERVICE_TYPE = 0
                     AND MPS_SWTCH_CD = 'T11'
                     AND MPS_FTR_CD1 = 1033)
        GROUP BY RECIPIENT;
BEGIN
    FOR item IN cur -- if you realy want to insert all results you should read about BULK-COLLECT and FORALL ;-)
    LOOP
        dbms_output.put_line('Result: ' || item.RECIPIENT || ', ' || item.N_CNT);
        INSERT INTO TABLE_RECIPIENT_COUNT
             VALUES (item.RECIPIENT, item.N_CNT);
    END LOOP loop_emp;
END;