1

スクリプト内にデータベース リンクを作成し、リンクされたデータベースからすべてのテーブル名を取得したいと考えています。私が正しければ、使用するにはデータベース リンクを作成する必要がありますが、Oracle では、my_fnセクションまたはDECLAREセクション内にそのようなものを作成することは許可されていません。なにか提案を?

DECLARE

TYPE tp_col_array IS TABLE OF varchar2(1000);
FUNCTION my_fn( 
    p_in_dblink_name IN VARCHAR2,       
    p_in_schema_name IN VARCHAR2)
    RETURN varchar2 AS
        vr_coll_table tp_col_array;
        vr_coll_owner tp_col_array;

    BEGIN            
        create database link "database1"
        connect to my_name
        identified by "my_password"
        using 'database1';    

        SELECT owner, table_name
        bulk collect into vr_coll_owner, vr_coll_table
        FROM all_tables@database1
        WHERE OWNER NOT IN ('SYS'); 

    RETURN TO_CHAR(vr_coll_owner(1));      //just for temporary
END my_fn;

BEGIN

    DBMS_OUTPUT.PUT_LINE(my_fn('link1','schema1'));

END;

編集 次のことも試しましたが、運がありません:(

Execute immediate q'[create database link "database1"
        connect to my_name
        identified by "my_password"
        using 'database1']';
4

2 に答える 2

0

PL/SQL ブロックでデータベース リンクを動的に作成する場合、そのデータベース リンクへのすべての参照でも動的 SQL を使用する必要があります。そうしないと、ブロックがコンパイルされません。SELECT ステートメントでは、EXECUTE IMMEDIATE も使用する必要があります。一歩下がって、実行時にデータベース リンクを作成することは、一般的に不適切な方法です。

ジャスティン・ケイブのコメントによると

于 2014-11-24T21:33:08.650 に答える
-1

definer-schema に「データベース リンクの作成」権限が付与されていることを確認してください。

これは機能しています:

me@XE> execute execute immediate 'create database link superlink connect to a identified by b using ''TNSALIAS''';

PL/SQL procedure successfully completed.

me@XE> @mylinks

DB_LINK         USERNAME        PASSWORD        HOST                      CREATED
--------------- --------------- --------------- ------------------------- --------------------
SUPERLINK       A                               TNSALIAS                  22.10.2014 22:42:19
于 2014-10-22T20:39:11.013 に答える