2017-01-02 1 views
1

У меня проблема с использованием Oracle SQL для циклического завершения набора результатов дважды.Сохранение набора результатов в переменной с помощью курсора

Проблема

У меня есть курсор, который получает мне все внешние ключи к заданному имени таблицы. Используя результат, создайте этот курсор, я пройду через все ограничения и отключу их. Затем я выполняю импорт данных, а затем мне нужно перебрать один и тот же набор результатов и включить их.

CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
    SELECT table_name,constraint_name, status 
    FROM user_constraints 
    WHERE (r_constraint_name,r_owner) IN 
    (SELECT constraint_name, owner 
    FROM user_constraints 
    WHERE owner ='POP' 
    AND table_name=upper(tabellnavn) 
) 
    AND STATUS = 'ENABLED'; 

То, что я хотел бы сделать

Мой мозг переходит непосредственно к переменной. Я хотел бы выполнить курсор только один раз, а затем сохранить результат от курсора к переменной.

Возможно ли это или есть что-нибудь, что я делаю, чтобы сохранить результат от курсора и цикла дважды?

ответ

2

Пожалуйста, попробуйте этот код. Я видоизменил ваш код, чтобы просто отображать имена таблиц ограничения. Вы можете изменить конечную часть plsql в соответствии с вашим требованием. Прошу прокомментировать, если вы столкнулись с любыми ошибками или проблемами, спасибо.

CREATE or replace PROCEDURE a_proc(name_table varchar) 
AS 
CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
SELECT table_name,constraint_name, status 
FROM user_constraints 
WHERE STATUS = 'ENABLED' 
AND TABLE_NAME=tabellnavn; 

names_t c_fkeys_inn%ROWTYPE; 
TYPE c_fkeys IS TABLE OF names_t%TYPE; 
fkeys c_fkeys; 
BEGIN 
OPEN c_fkeys_inn(name_table); 
FETCH c_fkeys_inn BULK COLLECT INTO fkeys; 
CLOSE c_fkeys_inn; 

FOR indx IN 1..fkeys.COUNT LOOP 
DBMS_OUTPUT.PUT_LINE(fkeys(indx).table_name); 
END LOOP; 
END a_proc; 

Чтобы запустить код, выполните отдельный блок plsql. Пожалуйста, найдите простой и примерный блок plsql, указанный ниже.

begin 
a_proc('SUPPLIER'); 
END; 
+0

Да. Это прекрасно работает. Не возражаете ли вы объяснить, как вы создаете переменную? – Stene

+1

Вам необходимо создать тип таблицы, соответствующий указанному выше курсору. После того, как вы создадите тип u, вам нужно сохранить все записи курсора в тип за один проход, который может быть достигнут с помощью Bulk collect. Массовый сбор извлекает все строки и загружает их в коллекцию и переключается обратно в механизм PL/SQL. После того, как все строки будут сохранены, мы можем использовать концепцию цикла для перемещения по типу и отображению или выполнять необходимые операции. Извините за поздний ответ (из-за нехватки времени :)) –

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