3

PL / SQLでカーソルを定義していますが、ProCでカーソルを使用するのに最適な方法は何でしょうか。通常、Pro Cで定義されたカーソルの場合、次のようにします。

EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;

同じ(または同様の)構文がパッケージ化されたカーソルで機能することを期待していました。たとえば、宣言付きのパッケージMyPackがあります

type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;

これで、Pro * Cコードに、最初のスタイルの構文を機能させることができなかったため、カーソルを開いたり、フェッチを実行したりする、かなり満足のいく埋め込みPL/SQLがありません。例を使用する

EXEC SQL EXECUTE
  DECLARE
    XTable is table of MyPack.MyType;
  BEGIN
    OPEN MyPack.MyCurs(:param);
    FETCH MyPack.MyCurs INTO XTable;
    CLOSE MyPack.MyCurs;
  END;
END-EXEC;

もっと「純粋な」Pro*Cアプローチがあるかどうか誰かが知っていますか?

4

2 に答える 2

1

実際には、最初の例と大差ありません。カーソル定義がパッケージ本体ではなくパッケージ仕様に含まれていることを確認してください。それを「宣言」するのではなく、次のようなものを使用してください。

データベースオブジェクト:

create or replace package mypkg as 
  cursor mycur is 
    SELECT 1 FROM DUAL; 
end;

pro * cの場合:

EXEC SQL OPEN schema.mypkg.mycur; 
EXEC SQL FETCH schema.mypkg.mycur INTO :foo; 
EXEC SQL CLOSE schema.mypkg.mycur; 

もちろん、接続しているoracleユーザーなどがパッケージにアクセスできる必要があります。接続しているユーザーがパッケージを所有している場合、または同義語が存在する場合は、「スキーマ」。pro*c呼び出しでは必要ありません。

于 2010-06-28T06:11:07.273 に答える
0

はい。REF CURSORという用語でグーグル検索を実行すると、実行したいことの例が表示されます。

于 2010-06-11T15:56:26.663 に答える