0

パッケージ本体を作成するときに、パッケージ本体内の別のデータベース リンクから選択することはできませんか? 以前のdblink名の値がわからないので

Create or replace package body sth as 
 procedure getvalues(linkname in char)
 is
 begin
 select col1 from table1@linkname;
end getvalues;
end sth;

これを作成すると、テーブルまたはビューが存在しないことがわかります..リンク名は、以前からそれを知らないため、次のように使用されるパラメーターで使用されます。

getvalues(linkname => dbname);

パッケージ本体内にこれらの値をどのように含めることができますか?

4

1 に答える 1

4

コンパイル時にデータベース リンクの名前がわからない場合は、動的 SQL を使用する必要があります。ただし、動的 ​​SQL を使用しているか静的 SQL を使用しているかに関係なく、プロシージャーは単に SQL ステートメントを実行することはできません。その結果で何かをしなければならないでしょう。sys_refcursorをローカル変数またはパラメータとして開くことができOUTます。結果を反復処理して、データを取得し、結果に対して何かを行うことができます。関数ではなくプロシージャを宣言したという事実は、単純にsys_refcursor. しかし、プロシージャの名前は、sys_refcursor.

を返す関数が本当に必要な場合sys_refcursor

CREATE OR REPLACE FUNCTION getValues( p_dblink IN VARCHAR2 )
  RETURN SYS_REFCURSOR
IS
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc FOR 'SELECT col1 FROM table1@' || p_dblink;
  RETURN l_rc;
END;
于 2014-04-02T21:10:58.920 に答える