Ich habe eine Tabelle namens Table1. Es hat viele Spalten, eine davon ist Column1. Ich kenne die anderen Spalten nicht, sie können sich manchmal sogar ändern. Es gibt einen stark typisierten Ref-Cursortyp, der Table1% rowtype mit dem Namen cur_Table1 zurückgibt. Ich habe eine gespeicherte Prozedur namens SP1, die einen out-Parameter vom Typ cur_Table1 hat. Ich rufe diese gespeicherte SP1-Prozedur von einer anderen Datenbank auf, die nur diese gespeicherte Prozedur sieht, aber nicht die Tabelle oder den Typ selbst. Wie wähle ich nur Column1 von dem zurückgegebenen Cursor aus? Ich weiß, dass ich in einen Datensatz oder so viele Variablen holen kann, wie der Cursor Spalten hat, aber ich kenne nur die Existenz einer Spalte, so dass ich den vollständigen Datensatz oder die korrekte Anzahl von Variablen nicht deklarieren kann.
Sie können dies mit DBMS_SQL
machen, aber es ist nicht hübsch.
Tabelle und Beispieldaten (COLUMN1 hat die Nummern 1 - 10):
%Vor%Paket mit einer Prozedur, die einen Ref-Cursor öffnet und alles auswählt:
%Vor%PL / SQL-Block, der COLUMN1-Daten vom ref-Cursor liest:
%Vor%Angesichts der ursprünglichen Frage ist die Antwort von jonearles immer noch korrekt, also lasse ich sie als solche markiert, aber letztendlich habe ich etwas völlig anderes und viel besser gemacht.
Das Problem war / ist, dass ich keine Kontrolle über die SP1-Datenbank habe, ich muss sie nur von irgendwo anders als Drittanbieter-Client aufrufen. Jetzt habe ich die Erlaubnis bekommen, nicht nur SP, sondern auch den Typ des Cursors zu sehen. Ich sehe immer noch nicht den Tisch, aber jetzt gibt es eine viel sauberere Lösung:
In der anderen Datenbank wurde mir der Zugriff auf diesen Typ jetzt gewährt:
%Vor%In meiner Datenbank kann ich das jetzt tun:
%Vor%Siehe, ich brauche immer noch keinen Zugriff auf die Tabelle, ich sehe nur den Cursor. Der Schlüssel ist, dass der magische% rowtype auch für Cursor funktioniert, nicht nur für Tabellen. Es funktioniert nicht auf einem sys_refcursor, aber auf einem stark typisierten. Angesichts dieses Codes muss ich mich nicht darum kümmern, wenn sich auf der anderen Seite etwas ändert, ich muss nicht alle Spalten oder Datensätze definieren, ich gebe nur die eine Spalte an, die mich interessiert.
Ich liebe diese OOP-Haltung gegenüber Oracle wirklich.
Sie wissen nicht, ob es eine Option ist oder nicht, aber wäre es keine bessere Lösung, eine Funktion zu erstellen, die den gewünschten Wert zurückgibt? Das vermeidet den Overhead des Sendens der zusätzlichen Daten. Alternativ könnten Sie einen Cursor mit einer Reihe bekannter Felder definieren, die beiden Parteien bekannt sind.
Tags und Links oracle stored-procedures cursor