2009-06-30 6 views
7

In Oracle Database 10g ist es möglich, einen assoziativen Array-Typ außerhalb eines Pakets oder einer Prozedur zu erstellen? Ich würde gerne in der Lage sein, dies zu tun, so dass ich diesen assoziativen Array-Typ in einem anderen Typ referenzieren kann. Zum Beispiel:Ist es möglich, einen Oracle-assoziativen Array-Typ außerhalb eines Pakets/einer Prozedur zu erstellen?

create type my_type_map is table of varchar2(10) index by varchar2(10); 

create type my_other_type as object ( 
    id number(15), 
    member procedure initialize(p_my_type_map my_type_map) 
) not instantiable not final; 

Der Fehler, den ich bekommen ist:

SQL> create type my_type_map is table of varchar2(20) index by varchar2(10); 
    2/

Warning: Type created with compilation errors. 

SQL> show errors; 
Errors for TYPE MY_TYPE_MAP: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/21  PLS-00355: use of pl/sql table not allowed in this context 
SQL> 

Es scheint, dass Oracle hält:

index by varchar2(10)  

PL/SQL zu sein und es in der Schaffung erlauben doens't SQL-Typen Wenn Oracle wirklich nicht erlaubt assoziative Arrays außerhalb von Paketen zu definieren, gibt es dann eine gute Alternative? Ist es möglich, Typen zu erstellen, die Oracles Objekt innerhalb eines Pakets erweitern, so dass alle Typen in demselben Paket definiert sind?

Danke, Jeff

Edit: Korrigierte Codebeispiel hinzugefügt Protokoll aufgenommen mögliche Alternative als Frage.

+0

Wann erhalten Sie den Fehler? Ich habe gerade beide oben genannten Arten ohne Beschwerde von Orakel, 10gR2 erstellt. Ihr Beispiel sagt INDEX BY VARCHAR2, nicht pls_integer ... – DCookie

+0

Weitere Details und Korrekturen hinzugefügt. Vielen Dank! – jlpp

Antwort

5

Die Antwort ist nein, Sie können nicht tun, was Sie versuchen zu tun, mehr als Sie einen Typ erstellen können, um eine BOOLEAN typisierte Variable zu einem Objekt hinzuzufügen. Die Objekte in einem Objekt müssen Oracle-Typen enthalten, keine PL/SQL-Typen. Eine etwas klobige Alternative könnte sein:

CREATE TYPE t_aa AS VARRAY(10) OF VARCHAR2(10); 

CREATE OR REPLACE TYPE t_ua AS OBJECT (ID NUMBER(15) 
            , MEMBER PROCEDURE initialize(p_aa t_aa) 
            , MEMBER PROCEDURE initialize(p_aa_i taa)) 
           NOT INSTANTIABLE NOT FINAL; 

Speichern Sie Ihre zugeordneten Variablenpaare in den beiden VARRAYs. Sie müssen die größtmögliche Größe Ihrer Arrays kennen.

+1

Danke DCookie. Ich habe mich gegen die Verwendung von Oracle-Objekttypen entschieden und gehe direkt mit PL/SQL und Record-Typen. – jlpp

+1

Ich bin kein großer Fan von Oracle Objects - ich sehe nicht den großen Vorteil, und sie sind absolut nicht standardisiert, so dass Ihre Datenstrukturen nicht tragbar sind. – DCookie

0

Dies sind PL/SQL-Typen, wie der Fehler vermuten lässt. Es gibt nichts, was Sie davon abhält, sie in der öffentlichen Spezifikation eines Pakets zu deklarieren, dann können Sie in jedem PL/SQL-Code, den Sie benötigen, auf sie verweisen.

+0

Sieht nicht so aus, als ob Pakete Objekttypdefinitionen zulassen: erstellen oder ersetzen Paket my_package als Typ my_type_map ist Tabelle von varchar2 (10) index by varchar2 (10); Typ my_other_type als Objekt ( ID-Nummer (15), Elementprozedur initialisieren (p_my_type_map-Nummer) ) nicht instanziierbar nicht final; Ende; Fehler (2,1): PLS-00707: nicht unterstützter Konstrukt oder interner Fehler [2603] Fehler (5,3): PLS-00540: Objekt wird in diesem Kontext nicht unterstützt. Fehler (5,3): PL/SQL: Deklaration ignoriert Gehe ich in die falsche Richtung? – jlpp

+0

Ich denke, was er sagt ist, dass Sie das Objekt und den pl/sql-Typ voneinander getrennt deklarieren sollten. – moleboy

+0

Leider kann ein Objekttyp, der außerhalb von PL/SQL definiert ist, in PL/SQL nichts referenzieren. – jlpp

Verwandte Themen