如何使用execute immediate动态创建包规范和主体?

时间:2012-03-03 05:04:42

标签: oracle10g packages dynamic-sql

我有一个包含超过2000行的包。我的问题是我可以使用execute immediate动态创建包吗?

1 个答案:

答案 0 :(得分:1)

您需要使用关联数组DBMS_SQL接口,假设“2000行”相当于超过32k的文本。这意味着在将DDL传递给DBMS_SQL.PARSE方法之前,您需要将DDL加载到关联数组的多个元素中。像这样的东西

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应用程序。