2009-06-30 10 views
7

En Oracle Database 10g, ¿es posible crear un tipo de matriz asociativa fuera de un paquete o procedimiento? Me gustaría poder hacer esto para poder hacer referencia a este tipo de matriz asociativa en otro tipo. Por ejemplo:¿Es posible crear un tipo de matriz asociativa de Oracle fuera de un paquete/procedimiento?

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; 

El error que consigo es:

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> 

Parece que Oracle considera:

index by varchar2(10)  

para ser PL/SQL y doens't permitir que en la creación de Tipos SQL Si Oracle realmente no permite que las matrices asociativas se definan fuera de los paquetes, ¿existe una buena alternativa? ¿Es posible crear tipos que extiendan el Objeto de Oracle dentro de un paquete para que todos los tipos estén definidos en el mismo paquete?

Gracias, Jeff

Editar: Se ha corregido ejemplo de código, añaden registro, añaden como posible alternativa cuestión.

+0

¿Cuándo obtiene el error? Acabo de crear los dos tipos anteriores sin queja de Oracle, 10gR2. Su ejemplo dice INDEX BY VARCHAR2, no pls_integer ... – DCookie

+0

Agregó más detalles y correcciones. ¡Gracias! – jlpp

Respuesta

5

La respuesta es no, no se puede hacer lo que se intenta hacer, del mismo modo que no se puede crear un tipo para agregar una variable tipeada BOOLEAN a un objeto. Los elementos en un objeto deben contener tipos Oracle, no tipos PL/SQL. Una alternativa un poco torpe podría ser:

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; 

Almacene sus pares asociados de variables en los dos VARRAY. Deberá conocer el tamaño más grande posible de sus matrices.

+1

Gracias DCookie. He decidido no usar tipos de objetos de Oracle y voy con PL/SQL y tipos de registro. – jlpp

+1

No soy un gran admirador de Oracle Objects: no veo el gran beneficio, y son absolutamente no estándar, lo que hace que sus estructuras de datos no sean portátiles. – DCookie

0

Esos son tipos PL/SQL como sugiere el error. No hay nada que le impida declararlos en la especificación pública de un paquete, luego puede consultarlos en cualquier código PL/SQL que necesite.

+0

No parece que los paquetes permitan definiciones de tipo de objeto: crear o reemplazar el paquete my_package como tipo my_type_map es la tabla de varchar2 (10) index por varchar2 (10); tipo my_other_type como objeto ( id número (15), procedimiento de miembro initialize (p_my_type_map number) ) no instanciable no finalizado; final; Error (2,1): PLS-00707: construcción no admitida o error interno [2603] Error (5,3): PLS-00540: objeto no admitido en este contexto. Error (5,3): PL/SQL: Declaración ignorada ¿Estoy haciendo esto de la manera incorrecta? – jlpp

+0

Creo que lo que está diciendo es que debe declarar el objeto y el tipo pl/sql separados – moleboy

+0

Desafortunadamente, un tipo de objeto definido fuera de PL/SQL no puede hacer referencia a nada en PL/SQL. – jlpp

Cuestiones relacionadas