Oracle 匿名块中的多个结果集

Posted

技术标签:

【中文标题】Oracle 匿名块中的多个结果集【英文标题】:Multiple Result Sets in Oracle Anonymous Block 【发布时间】:2017-01-03 22:20:25 【问题描述】:

是否有任何 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 语句。这是我必须做的。

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 将显示一个对话框,要求我选择两个变量的类型,我选择光标,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;

有什么想法吗?

【问题讨论】:

您使用的是哪个 Oracle 版本?另外:我不使用 TOAD,但大多数 SQL 客户端允许您定义由 SQL 工具而非服务器管理的变量。 【参考方案1】:

据我了解您的要求, 你需要得到purchaseOrderDetailsPurchaseOrders的数据集,通过Maximum PurchaseOrderId过滤,然后将它们一起显示在一个Grid-Like View中。

您不能在 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 将它们显示在终端上。

【讨论】:

感谢您的回答!我真的试图避免两次调用 MAX() ——纯粹是出于纯粹的原因:)——但你是对的,从我所看到的一切来看,这是唯一的选择。它绝对会产生我正在寻找的最终结果,2 个网格。感谢您打破我的狭隘视野!

以上是关于Oracle 匿名块中的多个结果集的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库,通过plsql developer查询出的多个结果集,怎么对结果集重新命名

Oracle :一次数据库连接,返回多个结果集

使用Dapper读取Oracle多个结果集

Java 和数据库:关于使用多个结果集和游标

JAVA获取ORACLE存储过程返回结果集的问题

Oracle 将结果集放入 FORALL 中的变量中