Ich möchte eine speicherinterne Array-Variable erstellen, die in meinem PL / SQL-Code verwendet werden kann. Ich kann in Oracle PL / SQL keine Sammlungen finden, die reinen Speicher verwenden. Alle scheinen mit Tabellen verknüpft zu sein. Ich möchte in meinem PL / SQL (C # -Syntax) so etwas tun:
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};
Bearbeiten: Oracle: 9i
Antworten:
Sie können VARRAY für ein Array mit fester Größe verwenden:
Oder TABELLE für ein unbegrenztes Array:
Das Wort "Tabelle" hat hier verwirrenderweise nichts mit Datenbanktabellen zu tun. Beide Methoden erstellen In-Memory-Arrays.
In beiden Fällen müssen Sie die Sammlung initialisieren und erweitern, bevor Sie Elemente hinzufügen:
Der erste Index ist 1 nicht 0.
quelle
my_array(0) := 'some string';
array.extend();
fügt EXTEND einem regulären begrenzten Array einen Slot hinzu? In diesem Fall ist die Größe bereits dynamisch, sodass keine Tabelle (unbegrenztes Array) benötigt wird.varray(3)
4-fachen zu verlängern. Es wird der Fehler "Index außerhalb des Grenzwerts" angezeigt.array.extend()
. Jeder Ort, an dem ich nachgesehen habe, hat dies nicht gezeigt, und es war der wichtigste Teil, mehr als ein Element hinzufügen zu können (nach meinem Verständnis noch neu für Arrays in SQL).Sie können einfach eine DBMS_SQL.VARCHAR2_TABLE deklarieren, die ein speicherinternes Array mit variabler Länge enthält, das von einem BINARY_INTEGER indiziert wird:
Sie können ein assoziatives Array (früher PL / SQL-Tabellen genannt) verwenden, da es sich um ein speicherinternes Array handelt.
Das assoziative Array kann eine beliebige Zusammensetzung von Datensatztypen enthalten.
Hoffe es hilft, Ollie.
quelle
VALUE_ERROR
wenn die Sammlung leer ist. Ich würde vorschlagen,FOR i IN 1 .. employee_array.COUNT
in diesem Fall lieber zu verwendensys.odcivarchar2list
unten basiert, hat den Vorteil, dass Sie auch einen Konstruktor zur Hand haben, z. B. für die Standardinitialisierung von Funktionsparametern:sys.odcivarchar2list('val1','val2')
Eine andere Lösung besteht darin, eine Oracle-Sammlung als Hashmap zu verwenden:
quelle
Sie können auch eine verwenden
oracle defined collection
Ich würde In-Memory-Array verwenden. Aber mit der
.COUNT
von Uziberia vorgeschlagenen Verbesserung:Eine andere Lösung wäre, eine Hashmap zu verwenden, wie es @Jchomel hier getan hat .
NB:
Mit Oracle 12c können Sie jetzt sogar Arrays direkt abfragen !
quelle
Beispielprogramme wie folgt und auf dem Link auch https://oracle-concepts-learning.blogspot.com/ bereitgestellt
plsql-Tabelle oder zugehöriges Array.
quelle