Курсор Oracle в пакете не работает - ORA 06512 - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь создать пакет, который будет принимать таблицу имен таблиц и удалять или удалять эти таблицы. Я использую динамический 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 - «неверное имя таблицы» * Причина:
* Действие:

Спасибо!

1 Ответ

0 голосов
/ 19 июня 2019

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

CREATE OR REPLACE TYPE table_type IS TABLE OF VARCHAR2(128); 

CREATE OR REPLACE PROCEDURE drop_tables(tables_to_drop_in table_type)
IS
BEGIN  
    FOR i IN tables_to_drop_in.FIRST .. tables_to_drop_in.LAST LOOP
        --DBMS_OUTPUT.PUT_LINE(tables_to_drop_in(i));
        EXECUTE IMMEDIATE 'DROP TABLE ' || tables_to_drop_in(i) || ' CASCADE CONSTRAINTS';
    END LOOP;
END drop_tables;

DECLARE
    tables_to_drop table_type;
BEGIN
    tables_to_drop := table_type('TBL1','TBL2', 'TBL3');
    drop_tables(tables_to_drop);
END;
...