У меня есть пакет, который содержит более 2000 строк. Мой вопрос: могу ли я создавать пакеты динамически, используя execute immediate
?Как создать спецификацию пакета и динамически с помощью выполнения немедленного выполнения?
1
A
ответ
1
Вам понадобится использовать ассоциативный массив DBMS_SQL
, предполагая, что «2000 строк» соответствует более чем 32 тыс. Значений текста. Это означает, что вам нужно будет загрузить 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, которое затем выполнило бы.