2009-07-13 55 views
2

是否可以通過數據庫鏈接在遠程數據庫上執行動態PL/SQL?通過數據庫鏈接立即執行

我在尋找類似:

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

上面的語法顯然是錯誤的,我得到PLS-00201:標識符 'L_STMT @ DBLINK' 必須聲明爲

可以遠程創建過程然後執行它。有沒有辦法在不創建遠程過程的情況下執行代碼?

編輯: 我試圖解決通過數據庫鏈接傳遞類型。遠程過程需要類型t_id_tab的參數,這是對遠程數據庫定義爲

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

你想完成什麼? – FerranB 2009-07-13 13:54:29

回答

4

可以通過調用DBMS_SQL包有遠程數據庫上執行arbitary代碼。

樣品:

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 2009-07-13 13:28:33

-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 2009-07-13 14:36:28