是否有任何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语句来查看我刚写的数据。
但在甲骨文,一切都不同。 如果我只想运行两个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;
问题是如何在网格中显示两个ref游标的结果。
在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;
有什么想法吗?
答案 0 :(得分:0)
据我了解你的要求,
您需要将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
在终端上显示。