【发布时间】: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 工具而非服务器管理的变量。