【问题标题】:Can I compile a large stored procedure over a database link?我可以通过数据库链接编译大型存储过程吗?
【发布时间】:2018-12-13 17:58:34
【问题描述】:

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

我的问题是,鉴于此访问权限,是否可以通过链接/编译大型存储过程或包?

我找到了函数

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 的数据发送到目标数据库并让数据库编译代码?这是我想要实现的目标的 sn-p

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;

【问题讨论】:

  • EXEC_DDL_STATEMENT 采用 varchar2 参数,而不是 CLOB,因此该错误是有道理的。但是您的代码看起来像是在尝试在本地编译远程过程的源代码,而不是通过链接。如果您实际上是在远程调用dbms_utility,如果您使用的是当前定义,那么为什么-您只是重新编译而不做任何更改? (我仍然想知道为什么;以及为什么你要针对生产数据库做任何特别的事情......)
  • 你是对的@AlexPoole,我在函数调用中遗漏了链接名称,但在我的 TOAD 窗口中保留了它。尽管如此,在链接设置正确并使用varchar的情况下,有没有办法做到这一点? varchar 不能容纳我需要的大字符串。你知道其他方法吗?
  • 第 1 行错误 ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:第 14 行
  • 出于某种原因,我仍然不清楚您是否只是使用现有代码重新编译该过程;或者正在尝试编译远程数据库上尚不存在的新代码。
  • 有趣的想法。您对 Oracle 版本有什么特殊要求吗?

标签: database oracle plsql dblink


【解决方案1】:

你可能很幸运。

由于 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;
/

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

您可能需要来自此链接 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;
/

【讨论】:

  • 这看起来很有希望。我会在今晚晚些时候试一试。感谢您的意见!
  • 这是一个相当大的安全风险... ;)
猜你喜欢
  • 2015-09-24
  • 2020-09-24
  • 2017-02-08
  • 2010-09-19
  • 2023-04-11
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多