0

Oracle 9gで作成されたストアドプロシージャがあり、パラメータに応じて異なる列のカーソルを返します。これは次のようになります。

CREATE OR REPLACE PROCEDURE ASCHEMA.SP_TWOCURSORS
(
    aParam NUMBER,
    P_RETURN OUT SYS_REFCURSOR
)
IS
BEGIN
    IF aParam = 1 THEN
        OPEN P_RETURN FOR
            SELECT
                a.column1, (number)
                a.column2  (varchar2)
            FROM
                table1 a;
    ELSE
        OPEN P_RETURN FOR
            SELECT
                b.column1, (varchar2)
                b.column2, (number)
                b.column3  (number)
            FROM
                table1 b;
    END IF;
END;

PowerBuilderでこのプロシージャを使用し、返されたデータをDataWindow1またはDataWindow2に渡す必要があります。返されたカーソルに応じて、これらのデータウィンドウは、他のソースからの別のプロシージャの実行によって実行時に埋められます。データベースオブジェクトを変更することはできません(spを2つに分割するなど)。PowerBuilderコードだけです。私の問題は、このシナリオをエレガントな方法で処理する方法です。私はいくつかのアイデアを持っていますが、それがうまくいくかどうかわかりません:

  1. spから返された両方のカーソルに関係するすべての列を処理するデータウィンドウオブジェクトを作成し、各行を期待されるデータウィンドウにコピーします。
  2. データストアを作成し、メソッドでspを渡してからCreate、期待されるデータウィンドウの行をコピーします。
  3. プロシージャを動的に実行し、すべての行をフェッチして、各結果を期待されるデータウィンドウの新しい行に追加します。

列が多く、時間がかかるため、最初の列は試していません。2つ目は良さそうですが、データウィンドウオブジェクトのないデータストアを処理する方法がわからず、これが可能かどうかもわかりません(1)。3つ目は、この問題を解決するための最後のオプションです。私はPowerBuilderを初めて使用するため、このソリューションの実装を開始する前に人々に質問したいと思います。また、あまり長く作業しなくても、正しい方法で実行したいと考えています。

助けてくれてありがとう。

(1)カスタムデータストアの使用に関するこの記事を見つけましたが、1つのデータストアしか使用できないのか2を使用する必要があるのか​​わかりません。また、Oracle接続では、SQLCAではなく別のトランザクションオブジェクトを使用するため、これを行う方法がわかりません。

4

1 に答える 1

1

単純にする。

ストアドプロシージャの詳細を知っています。このspをPBから呼び出している場合はaParam、呼び出しの前にすでにそれを知っています。結果のバージョンごとに1つずつ、2つのデータウィンドウを定義してみませんか?

各DWには取得引数(ストアドプロシージャに渡される引数)があり、spから結果を取得します。

実行時に、取得引数に応じて、値を取得する前に、オンになっdataobjectているデータウィンドウオブジェクトに対応するものを割り当てます。つまり、パーツaParam = 1に適したDWまたはelseパーツに適したDWのいずれかです。

于 2012-08-15T20:27:33.527 に答える