2017-01-03 1 views
0

匿名ブロックから複数の結果セットを出力するOracleツールはありますか?私は頻繁に次のようなステートメントのセットを実行するSQL ServerではOracleの匿名ブロックの複数の結果セット

...

DECLARE @MostRecentPurchaseOrderId int; 
SELECT @MostRecentPurchaseOrderId = MAX(PurchaseOrderId) FROM dbo.PurchaseOrders; 
SELECT * FROM dbo.PurchaseOrders WHERE PurchaseOrderId = @MostRecentPurchaseOrderId; 
SELECT * FROM dbo.PurchaseOrderDetails WHERE PurchaseOrderId = @MostRecentPurchaseOrderId; 

私はデータだけで私を見ているためにSSMSでこれらのSQL文を実行し、いくつかの新たに書かれたC#]を実行します書きました。

しかし、Oracleではすべてが異なります。 2つのSQL文を実行したければ、ほとんどのツールで可能です。 しかし、変数を宣言したい場合は、値を選択してから、その変数の値を1つ以上のselectステートメントで使用し、匿名ブロックを使用する必要があります。また、匿名ブロックでスタンドアロンのSELECT文を使用することはできません。ここに私がしなければならないことがあります。

質問は、2つのREFカーソルの結果をグリッドに表示する方法です。

TOADでは、宣言されていない変数 (:purchaseOrdersOutputと:purchaseOrderDetailsOutput)をいくつか追加すると、それはほとんどすべてではありません。 TOADを実行すると、2つの変数のタイプを選択するダイアログが表示され、カーソルを選択するとTOADが実行され、最初の参照カーソルの内容がデータグリッドに読み込まれます。しかし、2番目のカーソルからの出力は表示されません。

DECLARE purchaseOrderId NUMBER(16); 
     TYPE RefCursor IS REF CURSOR; 
     purchaseOrders RefCursor; 
     purchaseOrderDetails RefCursor; 
BEGIN 
    SELECT MAX(PurchaseOrderId) INTO purchaseOrderId FROM PurchaseOrders; 

    OPEN purchaseOrders FOR 
     SELECT * FROM PurchaseOrders WHERE PURCHASE_ORDER_ID = purchaseOrderId; 
    :purchaseOrdersOutput := purchaseOrders; 

    OPEN purchaseOrderDetails FOR 
     SELECT * FROM PurchaseOrderDetails WHERE PURCHASE_ORDER_ID = purchaseOrderId; 
    :purchaseOrderDetailsOutput := purchaseOrderDetails; 
END; 

私はあなたの条件から理解したよう

+0

使用しているOracleのバージョンはどれですか?また、TOADは使用しませんが、ほとんどのSQLクライアントでは、サーバーではなくSQLツールによって管理される変数を定義できます。 –

答えて

0

、あなたがpurchaseOrderDetailsと最大PurchaseOrderIdによってフィルタリングPurchaseOrdersのデータセットを取得する必要があり 、その後、格子状のビューでそれらを一緒に表示します。

カーソルの結果をPL/SQLブロックに直接表示することはできません。 SQLとは異なり、PL/SQLはIDEで直接クエリの結果を表示するようには設計されていません。あなたは何ができるか

があからさま以下のクエリを使用してSQL文を記述して実行することです:

SELECT po.* 
    , pod.* 
FROM PurchaseOrders po 
    , PurchaseOrderDetails pod 
WHERE po.PURCHASE_ORDER_ID = pod.PURCHASE_ORDER_ID 
and  po.PURCHASE_ORDER_ID = (SELECT MAX(PurchaseOrderId) 
           from PurchaseOrders); 

これは何のPL/SQL、唯一の純粋なSQLを必要とせず、あなたの要件に対応(私はあなたの条件を理解仮定正しく)。

もう1つのアプローチは、クエリの結果を変数に入れて、DBMS_OUTPUTを使用して端末に表示することです。

+1

答えをありがとう!私は実際にMAX()コールを避けるために、単純に2つの理由で使用しました。しかし、これは唯一のオプションです。そして、それは絶対に私が探している最終結果、2つのグリッドを生成します。私のトンネルビジョンから私を壊してくれてありがとう! – Carney

関連する問題