通过数据库链接立即执行

gab*_*bor 2 oracle oracle10g

是否可以通过数据库链接在远程数据库上执行动态 PL/SQL?

我正在寻找类似的东西:

l_stmt := 'begin null; end;';
execute immediate l_stmt@dblink;
Run Code Online (Sandbox Code Playgroud)

上面的语法显然是错误的,我得到PLS-00201: identifier 'L_STMT@DBLINK' must be denied

可以远程创建一个过程然后执行它。有没有办法在不创建远程过程的情况下执行代码?

编辑:我正在尝试解决通过数据库链接传递类型的问题。远程过程需要一个类型为 t_id_tab 的参数,该参数在远程 DB 上定义为

CREATE OR REPLACE TYPE T_ID_TAB AS TABLE OF NUMBER(12)
Run Code Online (Sandbox Code Playgroud)

Dav*_*sta 5

您可以通过调用那里的 DBMS_SQL 包在远程数据库上执行任意代码。

样本:

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;
/
Run Code Online (Sandbox Code Playgroud)

Note that the reference to DBMS_SQL.NATIVE is local, not remote. You can't reference remote package constants, but presumably the actual value of this constant is the same in both databases.