2009-07-13 6 views
2

Возможно ли выполнить динамический PL/SQL в удаленной базе данных через ссылку на базу данных?выполнить немедленную ссылку по ссылке базы данных

Я ищу что-то вроде:

l_stmt := 'begin null; end;'; 
execute immediate [email protected]; 

Синтаксис выше, очевидно, неправильно, я получаю PLS-00201: идентификатор 'L_STMT @ DBLink' должен быть объявлен.

Возможно создать процедуру удаленно, а затем выполнить ее. Есть ли способ выполнить код без создания удаленной процедуры?

EDIT: Я пытаюсь работать над передачей типа по ссылке БД. Удаленная процедура требует параметра типа t_id_tab, который определен на удаленном БД, как

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

Что вы пытаетесь достичь? – FerranB

ответ

4

Вы можете выполнить код на произвольном удаленной базы данных, вызвав пакет DBMS_SQL там.

Пример:

set serveroutput on 

create or replace synonym remote_dbms_sql for [email protected]; 

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 является локальным, а не удаленный. Вы не можете ссылаться на удаленные константы пакета, но предположительно фактическое значение этой константы одинаково в обеих базах данных.

0

Я думаю, что вы бы просто квалифицировать имена объектов в порядке, а не квалификации саму процедуру.

+0

вот что я думал. К сожалению, мне приходится использовать удаленные типы в stmt, которые, похоже, не работают без взлома обеих БД, как описано в http://stackoverflow.com/questions/378299/referencing-oracle-user-defined-types-over-dblink – gabor

-1

Вы пытались создать массив на пакете вместо типа? Я имею в виду:

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

Может быть, с работы таким образом, я не пробовал ...

+0

К сожалению, мне нужно вызвать процедуру на удаленной БД, которая принимает T_ID_TAB @ DBLINK как параметр, то есть тип SQL, а не массив PL/SQL. – gabor

Смежные вопросы