2013-10-07 3 views
0

Я пытаюсь найти, есть ли способ в Oracle 11g, чтобы я мог сохранить полученный список из SELECT в переменную (объект), а затем прокрутить этот список, выполняя вторую запрос по результатам?Объект временного списка Oracle 11g из запроса

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

Что-то вроде:

var PRODUCTID_TABLE = SELECT table_name 
         FROM user_tab_columns 
         WHERE column_name = 'PRODUCT_ID' 
         AND table_name NOT LIKE 'BIN%'; 

FOR T IN PRODUCTID_TABLE LOOP 

    DELETE FROM T.TABLE_NAME WHERE PRODUCT_ID = {value}; 

END LOOP; 
COMMIT; 

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

KS

ответ

2

Вы всегда можете генерировать ВЕЬЕТЕ как это:

SELECT 'DELETE FROM ' || table_name || 
     ' WHERE PRODUCT_ID = {value}; ' 
    FROM user_tab_columns 
WHERE column_name = 'PRODUCT_ID' AND table_name NOT LIKE 'BIN%'; 

Или, если с помощью PL/SQL является опцией, вы можете использовать EXECUTE IMMEDIATE внутри блока PL/SQL:

BEGIN 
    FOR v_rec IN (SELECT table_name 
        FROM user_tab_columns 
       WHERE column_name = 'PRODUCT_ID' 
        AND table_name NOT LIKE 'BIN%') 
    LOOP 
    EXECUTE IMMEDIATE 'DELETE FROM ' || v_rec.table_name || 
         ' WHERE PRODUCT_ID = {value}; '; 
    END LOOP; 
END; 
+0

Мне нравится вариант один. Есть ли способ затем запустить эти сгенерированные операторы DELETE сразу после этого, так как они не копируют их и запускают их вручную? – Casper

+0

Не думайте, что это возможно, если вы не напишите хранимую функцию, которая будет запускать запрос, используя EXECUTE IMMEDIATE. Затем вы запустите его в первом запросе, например: 'SELECT run_dynamic_delete (table_name) FROM user_tab_columns WHERE column_name = 'PRODUCT_ID' И имя_таблицы NOT LIKE 'BIN%';' –

+0

Приветствия за это, я превратил его в два шага работу в конце. Разработал этот скрипт для создания сценариев DELETE, а затем скопировал их в .sql и прошел через sqlplus – Casper

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