#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;