通过数据库链接立即执行

时间:2009-07-13 13:00:38

标签: oracle oracle10g

是否可以通过数据库链接在远程数据库上执行动态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)

4 个答案:

答案 0 :(得分:4)

您可以通过在那里调用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;
/

请注意,对DBMS_SQL.NATIVE的引用是本地的,而不是远程的。您不能引用远程包常量,但可能两个数据库中此常量的实际值相同。

答案 1 :(得分:0)

我认为你只需要在程序中限定对象名称,而不是限定程序本身。

答案 2 :(得分:0)

在上面的示例中,您缺少执行。请看下面:

ret := DBMS_SQL.EXECUTE(c);

答案 3 :(得分:-1)

您是否尝试在包而不是类型上创建数组?我的意思是:

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

可能,这种方式有效,我没试过......