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



我在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的数据发送到目标数据库并让数据库编译代码?以下是我试图实现的一个片段

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;

你可能很幸运。

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

由于假期的原因,我现在不能测试这个。

当插入oracle clob时,您可能需要此链接中的信息克服32K的限制。。。。通过DB链路实际传递CLOB。

然而,我希望这样的东西能起作用:

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

最新更新