Могу ли я скомпилировать большую хранимую процедуру по ссылке в базе данных? - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю в базе данных Oracle и не имею прямого доступа к нашей производственной базе данных.У меня есть косвенный доступ через ссылку на базу данных.Ссылка с тем же пользователем, под которым запускается весь пользовательский код, и имеет те же разрешения, как если бы я должен был войти в систему непосредственно как этот пользователь.

Мой вопрос: при таком доступе можно ли скомпилировать большую хранимую процедуру или пакет по ссылке /?

Я нашел функцию

dbms_utility.EXEC_DDL_STATEMENT

Я успешно использую ее для компиляции процедуры в целевой базе данных, однако, если процедура велика, более 32 КБ, я получаю ошибку

[Error] Execution (1: 1): ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 21

Можно ли отправить более 32 тыс. Байт в целевую базу данных и заставить базу данных скомпилировать код?Вот фрагмент того, чего я пытаюсь достичь

declare vsql  NCLOB ;
i   NUMBER := 0;

begin

FOR rec IN (
            select * from all_source@dblink
              where owner = :schema_owner
              and name = :procedure_name
            order by  line asc
            )
    LOOP

        vsql := vsql ||  rec.text;
        --this outputs fine
        DBMS_OUTPUT.put_line ('Record ' || i || ': ' || rec.text);

    END LOOP;
--line errors with  ORA-06502
dbms_utility.EXEC_DDL_STATEMENT@dblink(vsql);

end;

1 Ответ

0 голосов
/ 28 декабря 2018

Вам, наверное, повезло.

Поскольку Oracle 11g Execute Immediate может принимать данные CLOB.Просто создайте небольшую процедуру, как в этом примере:

CREATE OR REPLACE PROCEDURE generate_from_clob( p_source IN OUT CLOB )
    AUTHID CURRENT_USER
IS
BEGIN
    EXECUTE IMMEDIATE p_source;
END;
/

Из-за праздников я не могу проверить это сейчас.

Вам может понадобиться информация по этой ссылке преодолеть ограничение в 32 КБ при вставкеoracle clob .... для фактической передачи CLOB через DB-Link.

Однако я ожидаю, что что-то подобное будет работать:

DECLARE
   l_source  CLOB := 'create or replace Package very_long is
  .
  .
  .
  end very_long;';
BEGIN
   generate_clob@remote_DB_Link( l_source );
END;
/
...