繁体   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