[英]Multiple Result Sets in Oracle Anonymous Block
是否有任何Oracle工具可以從匿名塊中輸出多個結果集?
在Sql Server中,我經常運行類似於以下內容的語句集...
DECLARE @MostRecentPurchaseOrderId int;
SELECT @MostRecentPurchaseOrderId = MAX(PurchaseOrderId) FROM dbo.PurchaseOrders;
SELECT * FROM dbo.PurchaseOrders WHERE PurchaseOrderId = @MostRecentPurchaseOrderId;
SELECT * FROM dbo.PurchaseOrderDetails WHERE PurchaseOrderId = @MostRecentPurchaseOrderId;
我運行一些新編寫的C#,然后在ssms中運行這些sql語句,以查看我剛剛編寫的數據。
但是在Oracle中,一切都不同。 如果我只想運行兩個sql語句,大多數工具將允許這樣做。 但是,如果要聲明一個變量,在其中選擇一個值,然后在一個或多個select語句中使用該變量的值,則必須使用一個匿名塊。 而且,您不能只在匿名塊中使用獨立的SELECT語句。 這是我要做的。
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;
OPEN purchaseOrderDetails FOR
SELECT * FROM PurchaseOrderDetails WHERE PURCHASE_ORDER_ID = purchaseOrderId;
END;
問題是如何在網格中顯示兩個引用光標的結果。
在TOAD中,如果我添加幾個未聲明的變量(:purchaseOrdersOutput和:purchaseOrderDetailsOutput),它將使我幾乎到達那里,但並非一路走來。 當我運行它時,TOAD將顯示一個對話框,要求我選擇兩個變量的類型,然后選擇Cursor,TOAD將執行並將第一個參考光標的內容加載到數據網格中。 但是第二個光標沒有輸出。
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;
有任何想法嗎?
當我從你的需求理解,你需要得到的數據集purchaseOrderDetails
和PurchaseOrders
受最大的過濾PurchaseOrderId
,然后在網格狀觀一起顯示出來。
您不能在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即可滿足您的要求(假設我正確理解了您的要求)。
您可以采用的DBMS_OUTPUT
一種方法是將查詢結果放入變量中,並使用DBMS_OUTPUT
將其顯示在終端上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.