rowtype

___ tag123oracle ___ Oracle Database ist ein Datenbankmanagementsystem mit mehreren Modellen, das von Oracle Corporation erstellt wurde. Verwenden Sie dieses Tag NICHT für andere Produkte von Oracle wie Java und MySQL. ___ tag123storedprocedures ___ Eine Subroutine, die für Anwendungen verfügbar ist, die auf ein relationales Datenbanksystem zugreifen. ___ tag123plsql ___ PL / SQL (prozedurale Sprache / strukturierte Abfragesprache) ist die prozedurale Spracherweiterung der Oracle Corporation für SQL. Fragen zu PL / SQL sollten wahrscheinlich auch mit "oracle" getaggt werden. Fragen mit regulären DML- oder DDL-Anweisungen sollten mit "sql" und "oracle", NICHT mit "plsql" markiert werden. ___ qstnhdr ___ Wie deklariert% ROWTYPE einer Variablen, die ein schwach typisiertes SYS_REFCURSOR ist? ___ tag123sysrefcursor ___ Ein vordefinierter Oracle-Cursor-Variablentyp. ___ qstntxt ___

Wrt-Code unten Ich kann den Typ von Fetch-in-Variable nicht als den% ROWTYPE der zugrunde liegenden Tabelle deklarieren, da sich SYS_REFCURSOR auf einer Auswahl befindet, die zwei Tabellen verbindet und auch einige Funktionen auswählt, die für die Attribute der zugrundeliegenden zwei Tabellen aufgerufen werden ; Ich kann nicht als L_RECORD T% ROWTYPE

deklarieren %Vor%

Natürlich möchte ich keine statische Tabelle R mit Spalten definieren, die in der SYS_REFCURSOR zurückgegeben werden und dann als L_RECORD R% ROWTYPE deklarieren.

Und damit die Frage: Wie deklariert% ROWTYPE einer Variablen, die eine schwach typisierte SYS_REFCURSOR?

ist     
___ tag123rowtyp ___ hilf uns dieses Wiki zu bearbeiten ___ answer11233929 ___

Die kurze Antwort lautet: Sie können nicht. Sie müssten eine Variable für jede Spalte definieren, die zurückgegeben wird.

%Vor%

Und dann in die Liste der Spalten holen:

%Vor%

Dies ist schmerzhaft, aber überschaubar, solange Sie wissen, was Sie im Ref-Cursor erwarten. Die Verwendung von %code% in Ihrer Prozedur macht dies jedoch fragil, da das Hinzufügen einer Spalte zur Tabelle den Code unterbricht, der denkt, dass er weiß, welche Spalten es gibt und in welcher Reihenfolge sie sich befinden werden nicht konsistent erstellt - ich habe Orte gesehen, an denen die Reihenfolge der Spalten in verschiedenen Umgebungen unterschiedlich ist. Sie werden wahrscheinlich sicherstellen wollen, dass Sie nur die Spalten auswählen, die Ihnen wirklich wichtig sind, damit Sie keine Variablen für Dinge definieren müssen, die Sie nie lesen werden.

Ab 11g können Sie das %code% Paket zum Konvertieren Ihrer %code% in einen %code% Cursor, und Sie können dies abfragen, um die Spalten zu bestimmen. Als Beispiel für das, was Sie tun können, wird der Wert jeder Spalte in jeder Zeile mit dem Spaltennamen ausgedruckt:

%Vor%

Das ist nicht von praktischem Nutzen, und aus Gründen der Kürze behandle ich jeden Wert als eine Zeichenkette, da ich sie sowieso nur ausdrucken möchte. Sehen Sie sich die Dokumentation an und suchen Sie nach Beispielen für praktische Anwendungen.

Wenn Sie nur ein paar Spalten von Ihrem Ref-Cursor haben möchten, könnten Sie, wie ich vermute, eine Schleife um %code% machen und die Position, an der %code% steht, als eine numerische Variable aufzeichnen. Sie könnten später auf die Spalte durch diese Variable verweisen, wo Sie normalerweise den Namen in einer Cursorschleife verwenden würden. Hängt davon ab, was Sie mit den Daten machen.

Aber es sei denn, Sie erwarten die Spaltenreihenfolge nicht zu kennen, die Sie erhalten, was unwahrscheinlich ist, da Sie die Prozedur zu kontrollieren scheinen - und davon ausgehen, dass Sie %code% s loswerden - Sie sind wahrscheinlich besser dran, reduzieren die zurückgegebenen Spalten auf das Minimum, das Sie brauchen, und deklarieren sie alle einzeln.

    
___
1
Antwort

Wie deklariert% ROWTYPE einer Variablen, die ein schwach typisiertes SYS_REFCURSOR ist?

Wrt-Code unten Ich kann den Typ von Fetch-in-Variable nicht als den% ROWTYPE der zugrunde liegenden Tabelle deklarieren, da sich SYS_REFCURSOR auf einer Auswahl befindet, die zwei Tabellen verbindet und auch einige Funktionen auswählt, die für d...
25.06.2012, 10:16