2017-01-03 1 views
0

Gibt es Oracle-Tools, die mehrere Ergebnissätze aus einem anonymen Block ausgeben?Mehrere Resultsets in Oracle Anonymous Block

in SQL Server ich häufig Sätze von Anweisungen ähnlich wie im folgenden ausgeführt ...

DECLARE @MostRecentPurchaseOrderId int; 
SELECT @MostRecentPurchaseOrderId = MAX(PurchaseOrderId) FROM dbo.PurchaseOrders; 
SELECT * FROM dbo.PurchaseOrders WHERE PurchaseOrderId = @MostRecentPurchaseOrderId; 
SELECT * FROM dbo.PurchaseOrderDetails WHERE PurchaseOrderId = @MostRecentPurchaseOrderId; 

ich laufen einige frisch geschrieben C# dann diese SQL-Anweisungen in SSMS ausführen einen Blick auf die Daten habe ich nur schrieb.

Aber in Oracle ist alles anders. Wenn ich nur zwei SQL-Anweisungen ausführen wollte, erlauben die meisten Tools das. Aber wenn ich eine Variable deklarieren möchte, wählen Sie einen Wert hinein und verwenden Sie den Wert dieser Variablen in einer oder mehreren SELECT-Anweisungen, ich muss einen anonymen Block verwenden. Und Sie können nicht nur eine eigenständige SELECT-Anweisung in einem anonymen Block haben. Hier ist was ich tun muss.

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; 

Die Frage ist, wie die Ergebnisse der beiden Ref-Cursor in einem Raster angezeigt werden.

In TOAD, wenn ich ein paar nicht deklarierte Variablen hinzufügen (: purchaseOrdersOutput und: purchaseOrderDetailsOutput) es bringt mich fast dort, aber nicht den ganzen Weg. Wenn ich es ausführe, erscheint ein Dialog, der mich auffordert, den Typ der zwei Variablen auszuwählen, ich wähle Cursor und TOAD wird ausgeführt und lade den Inhalt des ersten Ref-Cursors in das Datenraster. Aber vom zweiten Cursor wird keine Ausgabe angezeigt.

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; 

Irgendwelche Ideen?

+0

Welche Oracle-Version verwenden Sie? Außerdem: Ich benutze nicht TOAD, aber die meisten SQL-Clients erlauben es Ihnen, Variablen zu definieren, die vom SQL-Tool verwaltet werden, nicht vom Server. –

Antwort

0

Wie ich von Ihrer Anforderung verstehen, Sie die Datensätze von purchaseOrderDetails und PurchaseOrders durch das Maximum PurchaseOrderId gefiltert erhalten müssen, so dass sie dann in einer Grid-Like-Ansicht angezeigt werden zusammen.

Sie können nicht direkt Ergebnisse eines Cursors in einem PL/SQL-Block angezeigt werden soll. Im Gegensatz zu SQL ist PL/SQL nicht dafür ausgelegt, Ergebnisse einer Abfrage direkt in der IDE anzuzeigen.

Was können Sie tun, ist nur komplett zu einer SQL-Anweisung mit der folgenden Abfrage schreiben und ausführen:

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); 

Dies keine PL/SQL erfordert, nur reine SQL und Adressen Ihre Anforderung (vorausgesetzt, ich Ihre Anforderung verstanden korrekt).

Ein weiterer Ansatz, den Sie machen können, ist, die Ergebnisse Ihrer Abfrage in Variablen zu setzen und sie auf dem Endgerät DBMS_OUTPUT mit angezeigt werden soll.

+1

Danke für die Antwort! Ich habe wirklich versucht, den MAX() -Aufruf zweimal zu vermeiden - allein aus puristischen Gründen :) - aber du hast recht, von allem, was ich gesehen habe, ist das die einzige Option. Und es produziert absolut das Endergebnis, das ich suche, 2 Gitter. Danke, dass du mich aus meiner Tunnelvision befreit hast! – Carney