Я пытаюсь создать пакет, который будет принимать таблицу имен таблиц и удалять или удалять эти таблицы. Я использую динамический sql, и удаление или удаление таблиц работает, но мне нужны обе процедуры для циклического перебора всех имен таблиц, переданных обратно.
Я пробовал несколько способов, в том числе пытался создать цикл FOR и курсор. Вот аналогичная функция, которую я написал в PostgreSQL, которая работает, но у меня возникают проблемы с переводом ее в Oracle.
Вот моя функция в PostgreSQL, которая работает:
CREATE OR REPLACE FUNCTION drop_tables_for_stnd_mod_build(tablenames text)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
tab_name RECORD;
BEGIN
FOR tab_name IN EXECUTE 'SELECT table_name FROM ' || tablenames
LOOP
EXECUTE 'DROP TABLE ' || tab_name.table_name || ' CASCADE';
END LOOP;
END;
$function$
;
И процедура, которую я пишу как часть пакета в Oracle
CREATE OR REPLACE PACKAGE BODY stnd_build_table_cleanup
AS
PROCEDURE drop_tables(table_in CLOB)
IS
TYPE cur_type is REF CURSOR;
c cur_type;
query_string VARCHAR(300);
loop_string VARCHAR(300);
table_name VARCHAR(100);
BEGIN
loop_string := 'SELECT tablenames FROM :table';
OPEN c FOR loop_string USING table_in;
LOOP
FETCH c INTO table_name;
query_string := 'DROP TABLE ' || table_name || ' CASCADE CONSTRAINTS';
-- dbms_output.PUT_LINE (query_string);
EXECUTE IMMEDIATE query_string;
EXIT WHEN c%NOTFOUND;
END LOOP ;
CLOSE c;
END drop_tables;
Вот ошибка, которую я получаю, когда пытаюсь вызвать свою функцию: Отчет об ошибке -
ORA-00903: неверное имя таблицы
ORA-06512: в "AMS_NYS.STND_BUILD_TABLE_CLEANUP", строка 13
ORA-06512: в строке 2
00903. 00000 - «неверное имя таблицы»
* Причина:
* Действие:
Спасибо!