我可以通过数据库链接编译大型存储过程吗?

时间:2018-12-13 17:58:34

标签: database oracle plsql dblink

我正在使用Oracle数据库,无法直接访问我们的生产数据库。我确实可以通过数据库链接进行间接访问。该链接与所有自定义代码都在其下运行的用户相同,并且具有相同的权限,就像我直接以该用户身份登录一样。

我的问题是,有了这种访问权限,是否可以通过link /编译大型存储过程或程序包?

我找到了功能

dbms_utility.EXEC_DDL_STATEMENT

我成功地使用它来将过程编译到目标数据库,但是如果该过程很大,超过32k b,则会收到错误消息

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

是否可以将超过32k b的数据发送到目标数据库并让数据库编译代码?这是我要实现的目标的一个片段

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 :(得分:0)

您可能很幸运。

因为Oracle 11g立即执行可以接受CLOB数据。 只需创建一个类似于以下示例的小程序:

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

由于假期,我现在无法测试。

您可能需要此链接overcome 32K limit when inserting oracle clob....中的信息,才能通过DB-Link实际传递CLOB。

但是我希望这样的事情能起作用:

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