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コードだけです。私の問題は、このシナリオをエレガントな方法で処理する方法です。私はいくつかのアイデアを持っていますが、それがうまくいくかどうかわかりません:
- spから返された両方のカーソルに関係するすべての列を処理するデータウィンドウオブジェクトを作成し、各行を期待されるデータウィンドウにコピーします。
- データストアを作成し、メソッドでspを渡してから
Create
、期待されるデータウィンドウの行をコピーします。 - プロシージャを動的に実行し、すべての行をフェッチして、各結果を期待されるデータウィンドウの新しい行に追加します。
列が多く、時間がかかるため、最初の列は試していません。2つ目は良さそうですが、データウィンドウオブジェクトのないデータストアを処理する方法がわからず、これが可能かどうかもわかりません(1)。3つ目は、この問題を解決するための最後のオプションです。私はPowerBuilderを初めて使用するため、このソリューションの実装を開始する前に人々に質問したいと思います。また、あまり長く作業しなくても、正しい方法で実行したいと考えています。
助けてくれてありがとう。
(1)カスタムデータストアの使用に関するこの記事を見つけましたが、1つのデータストアしか使用できないのか2を使用する必要があるのかわかりません。また、Oracle接続では、SQLCAではなく別のトランザクションオブジェクトを使用するため、これを行う方法がわかりません。