11 Stimmen

Ist es möglich, einen Oracle assoziativen Array-Typ außerhalb eines Pakets/Verfahrens zu erstellen?

Im Oracle-Datenbank 10g ist es möglich, einen assoziativen Array-Typ außerhalb eines Pakets oder einer Prozedur zu erstellen? Ich würde gerne dazu in der Lage sein, um diesen assoziativen Array-Typ in einem anderen Typ referenzieren zu können. Beispiel:

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 erhalte, lautet:

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:

index by varchar2(10)    

als PL/SQL betrachtet und dies nicht in der Erstellung von SQL-Typen zulässt. Wenn Oracle wirklich nicht zulässt, dass assoziative Arrays außerhalb von Paketen definiert werden, gibt es dann eine gute Alternative? Ist es möglich, Typen zu erstellen, die Oracle-Objekte innerhalb eines Pakets erweitern, sodass alle Typen im selben Paket definiert sind?

Danke, Jeff

Bearbeitet: Codebeispiel korrigiert, Log hinzugefügt, mögliche Alternative als Frage hinzugefügt.

0 Stimmen

Wann tritt der Fehler auf? Ich habe beide oben genannten Typen gerade erstellt, ohne Beanstandung von Oracle, 10gR2. Dein Beispiel sagt INDEX BY VARCHAR2, nicht pls_integer...

0 Stimmen

Hinzugefügt mehr Details und Korrekturen. Danke!

7voto

DCookie Punkte 41310

Die Antwort lautet nein, Sie können nicht das tun, was Sie versuchen zu tun, genauso wenig wie Sie einen Typ erstellen können, um eine BOOLEAN-typisierte Variable zu einem Objekt hinzuzufügen. Die Elemente in einem Objekt müssen Oracle-Typen enthalten, nicht PL/SQL-Typen. Eine etwas umständliche 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 t_aa))
                               NOT INSTANTIABLE NOT FINAL;

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

1 Stimmen

Vielen Dank DCookie. Ich habe mich dagegen entschieden, Oracle-Objekttypen zu verwenden und entscheide mich für reines PL/SQL und Datensatztypen.

1 Stimmen

Ich bin kein großer Fan von Oracle-Objekten - Ich sehe nicht den großen Nutzen und sie sind absolut nicht standardisiert, was Ihre Datenstrukturen nicht portabel macht.

0voto

Jeffrey Kemp Punkte 57542

Dies sind PL/SQL-Typen, wie der Fehler suggeriert. Es hindert Sie nichts daran, sie in der öffentlichen Spezifikation eines Pakets zu deklarieren, dann können Sie auf sie in jedem PL/SQL-Code verweisen, den Sie benötigen.

0 Stimmen

Es scheint, als ob Pakete keine Objekttypdefinitionen zulassen: create or replace package my_package as type my_type_map is table of varchar2(10) index by varchar2(10); type my_other_type as object ( id number(15), member procedure initialize(p_my_type_map number) ) not instantiable not final; end; Fehler(2,1): PLS-00707: Nicht unterstützter Konstrukt oder interner Fehler [2603] Fehler(5,3): PLS-00540: Objekt nicht in diesem Kontext unterstützt. Fehler(5,3): PL/SQL: Deklaration ignoriert Gehe ich das falsch an?

0 Stimmen

Ich glaube, er meint damit, dass du das Objekt und den PL/SQL-Typ getrennt voneinander deklarieren solltest.

0 Stimmen

Leider kann ein außerhalb von PL/SQL definiertes Objekttyp nicht auf etwas in PL/SQL verweisen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X