Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

execute immediate over database link

Is it possible to execute dynamic PL/SQL on a remote database via a databse link?

I'm looking for something like:

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

The syntax above is obviously wrong, I get PLS-00201: identifier 'L_STMT@DBLINK' must be declared.

It is possible to create a procedure remotely and then execute it. Is there a way to execute code without creating a remote procedure?

EDIT: I'm trying to work around passing a type over DB link. A remote procedure requires a parameter of type t_id_tab which is defined on the remote DB as

CREATE OR REPLACE TYPE T_ID_TAB AS TABLE OF NUMBER(12)
like image 713
gabor Avatar asked Oct 27 '25 14:10

gabor


1 Answers

You can execute arbitary code on the remote database by calling the DBMS_SQL package there.

Sample:

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

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.

like image 132
Dave Costa Avatar answered Oct 30 '25 07:10

Dave Costa



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!