包内的 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;
我正在尝试构建一个包含 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;