2009-07-13 12 views
2

Est-il possible d'exécuter PL/SQL dynamique sur une base de données distante via une liaison de base de données?Exécuter immédiatement sur le lien de la base de données

Je cherche quelque chose comme:

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

La syntaxe est au-dessus de toute évidence mal, je reçois PLS-00201: identifiant 'L_STMT @ dbLink' doit être déclarée.

Il est possible de créer une procédure à distance, puis de l'exécuter. Existe-t-il un moyen d'exécuter du code sans créer de procédure distante? J'essaie de contourner le passage d'un type sur un lien DB. Une procédure distante nécessite un paramètre de type t_id_tab qui est défini sur la base de données à distance comme

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

Qu'essayez-vous d'accomplir? – FerranB

Répondre

4

Vous pouvez exécuter du code sur la base de données arbitraire à distance en appelant le package DBMS_SQL là.

Exemple:

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

Notez que la référence à DBMS_SQL.NATIVE est local, et non à distance. Vous ne pouvez pas référencer les constantes de package à distance, mais la valeur réelle de cette constante est vraisemblablement la même dans les deux bases de données.

0

Je pense que vous simplement qualifier les noms d'objets dans la procédure, au lieu de qualifier la procédure elle-même.

+0

c'est ce que je pensais. Malheureusement, je dois utiliser des types distants dans le stmt, ce qui ne semble pas fonctionner sans piratage des deux DB comme décrit dans http://stackoverflow.com/questions/378299/referencing-oracle-user-defined-types-over-dblink – gabor

-1

Avez-vous essayé de créer le tableau sur un package au lieu d'un type? Je veux dire:

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

Peut être, avec cette façon de travailler, je ne l'ai pas essayé ...

+0

Malheureusement, je dois appeler la procédure sur la base de données distante qui prend T_ID_TAB @ DBLINK comme paramètre, c'est-à-dire le type SQL par opposition au tableau PL/SQL. – gabor

Questions connexes