簡體   English   中英

Oracle匿名塊中的多個結果集

[英]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;

有任何想法嗎?

當我從你的需求理解,你需要得到的數據集purchaseOrderDetailsPurchaseOrders受最大的過濾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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM