Oracle 匿名块中的多个结果集
Multiple Result Sets in Oracle Anonymous Block
是否有任何 Oracle 工具可以从匿名块输出多个结果集?
在Sql服务器中我经常运行组类似下面的语句...
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#然后运行这些sqlssms中的语句看看我刚写的数据
但在 Oracle 中,一切都不同了。
如果我只想 运行 两个 sql 语句,大多数工具都允许这样做。
但是,如果我想声明一个变量,select 一个值,然后在一个或多个 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 将显示一个对话框,询问我 select 两个变量的类型,我 select Cursor 和 TOAD 将执行并将第一个 ref 游标的内容加载到数据网格。但是第二个光标没有显示输出。
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;
有什么想法吗?
根据您的要求,我了解到,
您需要获取按最大值 PurchaseOrderId
过滤的 purchaseOrderDetails
和 PurchaseOrders
的数据集,然后将它们一起显示在类似网格的视图中。
您不能直接在 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
.
在终端上显示它们
是否有任何 Oracle 工具可以从匿名块输出多个结果集?
在Sql服务器中我经常运行组类似下面的语句...
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#然后运行这些sqlssms中的语句看看我刚写的数据
但在 Oracle 中,一切都不同了。 如果我只想 运行 两个 sql 语句,大多数工具都允许这样做。 但是,如果我想声明一个变量,select 一个值,然后在一个或多个 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 将显示一个对话框,询问我 select 两个变量的类型,我 select Cursor 和 TOAD 将执行并将第一个 ref 游标的内容加载到数据网格。但是第二个光标没有显示输出。
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;
有什么想法吗?
根据您的要求,我了解到,
您需要获取按最大值 PurchaseOrderId
过滤的 purchaseOrderDetails
和 PurchaseOrders
的数据集,然后将它们一起显示在类似网格的视图中。
您不能直接在 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
.