3

これは私の最初の(編集された)stackoverflowの質問ですので、ご容赦ください。

Oracle 11g では、dblink を介した別のデータベースでのプロシージャ呼び出しから返された参照カーソルの基になる列を記述/問い合わせる必要があります。実際の SQL は常に「明示的」ではなく、動的に生成される場合もあります。

例えば:

declare
    v_ref_cur sys_refcursor;
    v_cur_num number;
    v_col_count number;
    v_col_table dbms_sql.desc_tab3;
begin
    myProc@myDblink(v_ref_cur, 'myvalue');
    v_cur_num := dbms_sql.to_cursor_number(v_ref_cur);
    dbms_sql.describe_columns3(v_cur_num, v_col_count, v_col_table);
    ...
end

他のデータベースの myProc() に次のような「明示的な」SQL ステートメントがある場合:

open cursor for select * from foo where bar = myParam;

カーソルの変換と説明は (まだ) 問題なく動作します。プロシージャによって返される列の名前、型、長さなどを確認できます。

ただし、他のデータベースの myProc() に次のような動的 SQL が含まれている場合:

v_sql := 'select * from foo where bar = ''' || myParam || '''';
open cursor for v_sql;

dbms_sql.to_cursor_number() を呼び出そうとすると、ORA-01001 無効なカーソル エラーが発生します。

リモート プロシージャから呼び出された動的 SQL から派生した参照カーソルを変換/記述する方法はありますか? もしそうなら、どのように?そうでない場合、なぜですか?

あらゆる/すべての支援に感謝します!

4

1 に答える 1

0

データベース リンクで DBMS_SQL を使用すると、さまざまなエラーが発生しますが、少なくともその一部は Oracle のバグです。これらの問題は、リモート サーバーでコンパイルされた関数にすべてのロジックを配置することで回避できます。次に、その関数をリモートで呼び出します。

--Create and test a database link
create database link myself connect to <schema> identified by "<password>"
    using '<connect string or service name>';
select * from dual@myself;

--myProc
create procedure myProc(p_cursor in out sys_refcursor, p_value varchar2) is
begin
    --open p_cursor for select * from dual where dummy = p_value;
    open p_cursor for 'select * from dual where dummy = '''||p_value||'''';
end;
/

--Simple function that counts and displays the columns.  Expected value is 1.
create or replace function count_columns return number is
    v_ref_cur sys_refcursor;
    v_cur_num number;
    v_col_count number;
    v_col_table dbms_sql.desc_tab3;
begin
    --ORA-01001: invalid cursor
    --myProc@myself(v_ref_cur, 'myvalue');
    myProc(v_ref_cur, 'myvalue');
    --ORA-03113: end-of-file on communication channel
    --v_cur_num := dbms_sql.to_cursor_number@myself(v_ref_cur);
    v_cur_num := dbms_sql.to_cursor_number(v_ref_cur);
    --Compilation error: PLS-00306: 
    --    wrong number or types of arguments in call to 'DESCRIBE_COLUMNS3'
    --dbms_sql.describe_columns3@myself(v_cur_num, v_col_count, v_col_table);
    dbms_sql.describe_columns3(v_cur_num, v_col_count, v_col_table);
    return v_col_count;
end;
/

begin
    dbms_output.put_line('Number of columns: '||count_columns@myself());
end;
/

Number of columns: 1
于 2013-09-26T17:55:03.940 に答える