2011-01-04 11 views
2

Es gab ein paar Hinweise, die mich hier näher gebracht haben, aber mit einigen einzigartigen Problemen hoffe ich, dass diese Frage genug genug ist, um ihren eigenen Beitrag zu verdienen .Oracle-Prozedur zum Akzeptieren der Liste der in Select verwendeten Elemente schreiben

Für den Anfang ist hier, was ich habe. Ich habe eine Oracle-Prozedur, die einen Standard REF CURSOR zurückgibt, und dieser REF CURSOR wird an meine Anwendung zurückgegeben. Die REF CURSOR ist eine Liste von Such-IDs.

Ich möchte dann diese Liste und bringen Sie es in einen anderen Datenspeicher und verwenden Sie es in einer Select-Anweisung. Es wird absolut möglich sein, dies zu erreichen, indem man den REF CURSOR durchläuft, aber ich hoffe, das zu vermeiden. Ich würde viel lieber eine SELECT...WHERE lookup_id IN result_ref_cursor OR SELECT...WHERE EXISTS... schreiben

Erstens ist das möglich oder sollte ich nur eine weniger elegante Lösung versuchen? Wenn es möglich ist, irgendwelche Hinweise, wo ich anfangen sollte zu suchen?

Ich bin relativ neu in Oracle, aber ziemlich erfahren in RDBMs im Allgemeinen, so fühlen Sie sich frei, nur durch einige Links bei mir und ich kann studieren. Sehr geschätzt

+0

Erstellen Sie einen Objekttyp, der eine Tabelle Ihres ID-Typs ist, dann können Sie die Funktion TABLE() in der FROM-Klausel einer Unterabfrage verwenden – kurosch

+0

Wenn Sie "einen anderen Datenspeicher" meinen, meinen Sie eine separate physische Datenbank? – APC

Antwort

1

Warum Kurosch seine Antwort nicht als "Antwort" gesetzt habe, werde ich keine Ahnung haben.

Sie definieren also einen SQL-Typ, der eine Zeile der Ausgabe des Ref-Cursors beschreibt, und auch einen SQL-Typ, der eine Tabelle des vorherigen darstellt. Anschließend erstellen Sie eine Pipeline-Funktion, die die vom Ref-Cursor zurückgegebenen Zeilen zurückgibt. Diese Funktion kann dann in einem Standard-SQL verwendet werden. Ich leihe von Ask Tom auf diesem.

create or replace type myLookupId as object (id int) 
/

create or replace type myLookupIdTable as table of myLookupId 
/

create or replace function f return myLookupIdTable PIPELINED is 
    l_data myLookupId; 
    l_id number; 
    p_cursor SYS_REFCURSOR; 
begin 
    p_cursor := function_returning_ref_cursor(); 
    loop 
    fetch p_cursor into l_id; 
    exit when p_cursor%notfound; 
    l_data := myLookupId(l_id); 
    pipe row (l_data); 
    end loop; 
return; 
end; 
/

Und nun eine Beispielabfrage ...

SELECT * 
FROM SOME_TABLE 
WHERE lookup_id in (SELECT ID FROM table(f)); 

Sorry, wenn der Code nicht genau richtig ist, ich habe nicht die DB jetzt zu testen.

+0

Ich habe das auf Ask Tom gesehen und habe damit herumgespielt. Ich konnte es nicht zur Arbeit bringen, aber ich bin sehr zuversichtlich, dass es mein eigener Fehler dafür war. Eine Frage, die ich hatte, ist, kann ich diese Typdefinitionen in mein Paket einfügen? Ich habe irgendwo anders gesehen, dass die Typen auf DB-Ebene definiert werden müssten. – Andrew

+0

Das ist richtig, Sie müssten SQL-Typen machen, nicht Typen in einem Paket. –

0

Es gibt mehrere Richtungen, die Sie mit diesem gehen konnten, aber ich habe eine Suche nach der spezifischen Lösung, die Sie wollen, und es scheint, als ob niemand es oft genug getan hat, um dort zu zeigen. Was Sie tun können, ist die Suche nach dem Orakel Metalink - das ist normalerweise wirklich gut darin, obskure Antworten zu finden. (Auch wenn Sie einen Servicevertrag tun müssen - habe gerade herausgefunden, dass mein abgelaufen :()

Andere mögliche Lösungen:

eine Verbindung zwischen den Datenspeicher erstellen, so dass Sie die Auswahl im plsql tun können direkt

eine Funktion in Java erstellen, die durch sie Loops für Sie die Zeichenfolge für die Abfrage zu erstellen, das ein wenig mehr recht zumindest aussehen

Andernfalls müssen die REF CURSOR hin und her gehen -.. ich glaube nicht, wissen, wie Sie die Ergebnisse des REF CURSOR in einer Verbindung mit der Abfrage in einer anderen leiten können, ohne sich durchzuschleifen es.