执行对数据库的链接直接(execute immediate over database link)

2019-07-30 02:21发布

是否有可能通过DATABSE连接远程数据库上执行动态PL / SQL?

我在寻找类似:

l_stmt := 'begin null; end;';
execute immediate l_stmt@dblink;

上面的语法显然是错误的,我得到的PLS-00201:标识符“L_STMT @ DBLINK”必须申报

它可以远程创建一个程序,然后执行它。 有没有建立一个远程过程来执行代码的方法吗?

编辑:我试图解决传递型过DB链接。 远程过程需要类型t_id_tab的参数,其在远程DB定义为

CREATE OR REPLACE TYPE T_ID_TAB AS TABLE OF NUMBER(12)

Answer 1:

你可以通过调用DBMS_SQL包有执行远程数据库上arbitary代码。

样品:

set serveroutput on

create or replace synonym remote_dbms_sql for dbms_sql@core;

declare
  c  number;
  l_global_name  varchar2(200);
begin
  c := remote_dbms_sql.open_cursor();
  remote_dbms_sql.parse( c, 'select global_name from global_name', dbms_sql.native );
  remote_dbms_sql.define_column( c, 1, l_global_name, 200 );
  dbms_output.put_line( remote_dbms_sql.execute_and_fetch( c ) );
  remote_dbms_sql.column_value( c, 1, l_global_name );
  dbms_output.put_line( l_global_name );
  remote_dbms_sql.close_cursor( c );
end;
/

需要注意的是,参考DBMS_SQL.NATIVE是局部的,并不遥远。 你不能引用远程包常量,但据推测这个常数的实际值是在两个数据库是相同的。



Answer 2:

我会认为你只是限定对象名称中的过程,而不是排位赛过程本身。



Answer 3:

这是因为丢失上面的例子执行英寸 请看下面:

ret := DBMS_SQL.EXECUTE(c);


Answer 4:

你有没有尝试创建一个包,而不是一个类型的数组? 我的意思是:

CREATE OR REPLACE PACKAGE the_package AS
  TYPE T_ID_TAB AS TABLE OF NUMBER(12);
END the_package;

可能是,这种方式工作,我还没有尝试...



文章来源: execute immediate over database link