Oracle - wählen Sie eine bestimmte Spalte von ref cursor
Ich habe eine Tabelle mit dem Namen Table1. Es hat viele Spalten, eine davon ist " Column1. Ich weiß nicht, die anderen Spalten, die Sie möglicherweise ändern sich sogar manchmal. Es ist eine stark typisierte ref cursor-Typ, die Renditen der Table1-Tabelle%rowtype, benannt cur_Table1. Ich habe eine gespeicherte Prozedur mit dem Namen SP1, die hat einen parameter vom Typ cur_Table1. Ich rufe dieses SP1 gespeicherte Prozedur aus einer anderen Datenbank, die nur sieht, wie Sie diese gespeicherte Prozedur, aber nicht die Tabelle oder der Typ selbst. Wie wähle ich nur spalte1 aus der zurückgegebene cursor? Ich weiß, ich kann Holen, die in einem Datensatz oder in so viele Variablen wie die cursor-Spalten, aber ich kenne nur eine Spalte für die Existenz, also kann ich nicht erklären, das komplette Album oder die korrekte Anzahl von Variablen.
- Bitte erläutern Sie, wie Sie vorschlagen, zum Aufruf einer Prozedur in einer anderen Datenbank (oder eine beliebige Datenbank, für diese Angelegenheit), ohne in der Lage zu sehen, die Typen der Argumente.
- Ich habe ein "grant execute on SP zu einem anderen", aber nicht gewähren, nichts anderes, nicht auf die Tabelle oder die Typen, die Paket. Und es funktioniert.
- Oh, und auf die aufrufende Seite, lege ich den out-parameter der SP in eine sys_refcursor, natürlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies mit
DBMS_SQL
, aber es ist nicht schön.Tisch-und sample-Daten (SPALTE 1 die Nummern 1 - 10):
Paket mit einem Verfahren, das öffnet einen ref-cursor und wählt alles:
PL/SQL-block, der liest COLUMN1 Daten aus dem ref cursor:
Angesichts der ursprünglichen Frage, jonearles Antwort noch richtig ist, also lasse ich es, als solche gekennzeichnet, aber ich landete etwas völlig anders und viel besser.
Das problem war/ist, dass ich keine Kontrolle über SP1, Datenbank, ich muss nur rufen Sie es von irgendwo anders als 3rd-party-client. Jetzt habe ich es geschafft die Erlaubnis zu sehen, nicht nur SP, sondern auch die Art des Cursors. Ich verstehe immer noch nicht den Tisch, aber jetzt gibt es eine viel sauberere Lösung:
In der anderen Datenbank die ich Zugriff haben, um zu sehen, diese Art jetzt:
So, in meiner Datenbank kann ich dies jetzt zu tun:
Sehen, ich habe immer noch keine Zugriff auf die Tabelle, sehe ich den cursor nur. Der Schlüssel ist, dass die Magie, %rowtype Werke für Cursor als auch, nicht nur Tabellen. Es funktioniert nicht auf einem sys_refcursor, aber es hat auf ein stark typisiertes ein. Angesichts dieser code, ich habe nicht zu kümmern, wenn sich etwas ändert auf der anderen Seite, ich nicht haben, definieren Sie die Spalten oder Datensätze an alle, ich geben Sie einfach die eine Spalte, die mich interessieren.
Liebe ich diesen OOP-Haltung zu Oracle.
Weiß nicht, ob es eine option ist oder nicht, aber wäre es nicht eine bessere Lösung zu erstellen, die eine Funktion zurückgibt, die einen bestimmten Wert nach der Sie suchen? Das vermeidet den Aufwand für die Zusendung der zusätzlichen Daten. Alternativ könnten Sie einen cursor mit einer Reihe von bekannten it-Bereiche, die beide Parteien kennen.