2009-06-15 50 views
6

Quiero escribir un tipo de objeto tipo mapa en PL/SQL. Lo que quiero decir es una lista de pares clave-valor, donde un valor puede ser otra lista de pares clave-valor. Simple, o eso creía. Éstos son los dos simplificada¿Tipo de objeto tipo mapa en PL/SQL?

CREATE OR REPLACE TYPE TKey AS OBJECT 
(
    name varchar2(240), 
    value_text varchar2(2000), 
    value_map TMap 
) 

CREATE OR REPLACE TYPE TMap AS TABLE OF TKey 

Tal vez no es tan simple, porque ahora tengo un "huevo o la gallina" -problema. Si coloco TKey primero, se quejará de que TMap no está definido. Si pongo TMap primero, se quejará de que TKey no está definido. Si coloco TKey y dejo fuera la línea value_map, agrego el tipo de TMap, luego trato de reemplazar el tipo de TKey, él no lo permitirá.

¿No tengo suerte? ¿Tal construcción no es posible en PL/SQL?

Gracias de antemano

Aclaración: Lo que quiero es algo, que me puede dar esto: Un mapa que contiene las teclas a, b y c. El valor de a es varchar "hello", el valor de b es varchar "world", y el valor de c es otro mapa, con las teclas x e y, y el valor de x es "what's" y el valor de y estar "arriba".

Esto es lo que se vería en Java:

Map<String, Object> map = new HashMap<String, Object>(); 
map.set("a", "Hello"); 
map.set("b", "World"); 
Map<String, Object> child = new HashMap<String, Object>(); 
child.set("x", "What's"); 
child.set("y", "up"); 
map.set("c", child); 

Ahora sé que algo como "objeto" como ser capaz de almacenar cualquier cosa que no es posible. Lo que necesito es un objeto que pueda almacenar una lista de objetos del mismo tipo que este objeto. Entonces, básicamente, un árbol, sí.

Respuesta

4

Tal vez necesita pensar más relacionalmente :)

En lugar de almacenar un TMap (value_map) dentro del tipo TKey, solo almacene value_map_name, que luego se puede utilizar para buscar otra entrada en la tabla.

CREATE OR REPLACE TYPE TKey AS OBJECT(
name varchar2(240), 
value_text varchar2(2000), 
value_map_name varchar2(240)); 

Luego puede usar matrices asociativas (según la respuesta de mamboking) para almacenarlas.

+0

Creo que tienes razón, probablemente estoy en el camino equivocado aquí, en conjunto. –

11

Puede usar matrices asociativas. Desde el PL/SQL Guía del usuario:

matrices asociativas entendimiento (Índice-Por Tablas)

matrices asociativas son conjuntos de pares clave-valor, donde cada tecla es único y se utiliza para localizar un valor correspondiente en el formación. La clave puede ser un entero o una cadena.

La asignación de un valor con una tecla por primera vez agrega esa clave a la matriz asociativa. Las asignaciones posteriores que usan la misma clave actualizan la misma entrada. Es importante elegir una clave que sea única. Por ejemplo, los valores clave pueden provenir de la clave primaria de una tabla de base de datos, de una función de hash numérica o de cadenas concatenantes para formar un valor de cadena único.

Por ejemplo, aquí es la declaración de un tipo de matriz asociativa, y dos matrices de este tipo, utilizando las teclas que son cadenas:

Ejemplo 5-1 Tipos Declarar Collection

DECLARE TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64); 
    country_population population_type; 
    continent_population population_type; 
    howmany NUMBER; 
    which VARCHAR2(64); 
BEGIN 
    country_population('Greenland') := 100000; -- Creates new entry 
    country_population('Iceland') := 750000; -- Creates new entry 
-- Looks up value associated with a string 
    howmany := country_population('Greenland'); 
    continent_population('Australia') := 30000000; 
    continent_population('Antarctica') := 1000; -- Creates new entry 
    continent_population('Antarctica') := 1001; -- Replaces previous value 
-- Returns 'Antarctica' as that comes first alphabetically. 
    which := continent_population.FIRST; 
-- Returns 'Australia' as that comes last alphabetically. which := continent_population.LAST; 
-- Returns the value corresponding to the last key, in this 
-- case the population of Australia. 
    howmany := continent_population(continent_population.LAST); 
END; 
/
+0

No es exactamente el mismo problema. Mi problema es la estructura jerárquica. Lo que necesito es un mapa que no tenga un tipo de valor fijo sino dos, uno de los cuales son mapas secundarios. En otras palabras, quiero almacenar un mapa en un mapa. –

+1

@Callash, ¿quieres un árbol? – tuinstoel

+0

@tuinstoel ver la aclaración anterior. –

1

Está tratando de exprimir un paradigma clave-valor en un DBMS relacional que no tiene sentido lógico.Sería mucho más fácil ir puramente relacional:

CREATE TABLE key_value AS 
(
    key varchar2(240),  -- PRIMARY KEY 
    value_text varchar2(2000) 
); 

CREATE TABLE key_hierarchy AS 
(
    child_key varchar2(240), -- PRIMARY KEY, FOREIGN KEY to key_value.key 
    parent_key varchar2(240) -- FOREIGN KEY to key_value.key 
); 

Y eso es todo! Si desea cambiar más adelante que un hijo puede tener muchos padres, simplemente cambie la restricción PK (belleza de los DBMS relacionales)

+1

No obtuvo el PB, quiere un tipo, no tablas. Él podría usar esta estructura para llamar a un SP por ejemplo. –

Cuestiones relacionadas