包内的 Oracle 游标不起作用 - ORA 06512

Oracle Cursor within a Package not working - ORA 06512

我正在尝试构建一个包含 table 个 table 名称并删除或删除这些 table 的包。我正在使用动态 sql,并删除或删除 tables 作品,但我需要这两个过程来遍历所有传回给它的 table 名称。

我尝试了多种方法 - 包括尝试创建 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: 无效 table 名称 ORA-06512: 在 "AMS_NYS.STND_BUILD_TABLE_CLEANUP",第 13 行 ORA-06512: 在第 2 行 00903.00000 - "invalid table name" *原因:
*行动:

谢谢!

这是一种可能。请注意,为了简单起见,我将其编码为一个独立的过程。

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;