我有一个包含2000多行的包。我的问题是,我可以使用execute immediate
动态创建包吗?
假设"2000行"相当于超过32k的文本,则需要使用关联数组DBMS_SQL
接口。这意味着您需要将DDL加载到关联数组的多个元素中,然后再将其传递给DBMS_SQL.PARSE
方法。像这样的东西可以
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_sql dbms_sql.varchar2a;
3 c integer;
4 begin
5 l_sql(1) := 'CREATE OR REPLACE PACKAGE pkg_dynamic ';
6 l_sql(2) := 'AS ';
7 l_sql(3) := ' PROCEDURE my_proc;';
8 l_sql(4) := 'END;';
9 c := dbms_sql.open_cursor;
10 dbms_sql.parse( c, l_sql, 1, 4, true, dbms_sql.native );
11* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> desc pkg_dynamic;
PROCEDURE MY_PROC
但我强烈质疑您为什么首先尝试使用动态SQL来创建包。通常情况下,编写一段能够转换并生成更多代码的代码是没有意义的。例如,您通常不想编写一个Java应用程序,该应用程序会反过来编写并编译另一个Java程序,然后由他人运行。