【发布时间】: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