2009-06-15 5 views
6

PL/SQL에서지도와 같은 객체 유형을 작성하고 싶습니다. 필자가 의미하는 것은 키 - 값 - 쌍 목록입니다. 여기서 값은 다른 키 - 값 - 쌍 목록이 될 수 있습니다. 단순하거나 그렇게 생각했습니다. 지금은 "닭 또는 계란"-problem을 가지고 있기 때문에 여기에, 어쩌면 그렇게 간단 두 단순화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 

을하지 않습니다. 먼저 TKey를 넣으면 TMap이 정의되지 않았다고 불평 할 것입니다. TMap을 먼저 넣으면 TKey가 정의되지 않았다고 불평 할 것입니다. TKey를 넣고 value_map 행을 제외하고 TMap 유형을 추가 한 다음 TKey 유형을 바꾸려고 시도하면 허용하지 않습니다.

운이 좋지 않습니까? PL/SQL에서 이러한 구문을 사용할 수 있습니까? 사전에

감사

명확한 설명 : 키 A, B 및 C를 포함하는지도 : 내가 원하는 것은 저에게이 줄 수있는 일이다 . a의 값은 varchar "hello"이고 b 값은 varchar "world"이며 c 값은 x 및 y 키가있는 다른 맵이며 x 값은 "what 's"이고 값은 y가 "위로"있다.

이것은 자바처럼 보일 것이다 것입니다 :

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); 

지금 난 아무것도를 저장할 수있는 등 "개체"같은 것이 불가능하다는 것을 알고있다. 필요한 것은이 객체와 같은 유형의 객체 목록을 저장할 수있는 객체입니다. 그래서 기본적으로 나무예요.

답변

4

아마도 선언 컬렉션 유형

예 5-1을하면 더 관계형으로 생각해야 :)

을 대신 TKEY 유형 내부 TMAP (value_map)를 저장하는, 바로 다음 표에 다른 항목을 조회 할 수 있습니다 value_map_name를 저장합니다.

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

그런 다음 연관 배열 (mamboking의 답변에 따라)을 사용하여 저장할 수 있습니다.

+0

나는 네가 옳다고 생각한다. 나는 아마 여기 잘못된 길을 가고있을 것이다. –

11

연관 배열을 사용할 수 있습니다. 는 PL/SQL 사용 설명서에서 :

이해 연관 배열 (색인으로 표)

연관 배열은 각 키가 고유하고에 해당하는 값을 찾는 데 사용되는 키 - 값 쌍의 집합입니다 정렬. 키는 정수 또는 문자열 일 수 있습니다.

처음으로 키를 사용하여 값을 지정하면 해당 키가 연관 배열에 추가됩니다. 같은 키를 사용하는 후속 할당은 동일한 항목을 업데이트합니다. 고유 한 키를 선택하는 것이 중요합니다. 예를 들어 키 값은 데이터베이스 테이블의 기본 키, 숫자 해시 함수 또는 문자열을 연결하여 고유 한 문자열 값을 형성 할 수 있습니다. 예를 들어

, 여기에 문자열 키를 사용하여 연관 배열 타입의 선언 및 해당 형식의 두 배열입니다 :

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

완전히 같은 문제는 아닙니다. 내 문제는 계층 구조입니다. 내가 필요로하는 것은 하나의 고정 값 유형이 아닌 두 가지 중 하나 인지도가 어린이지도 인지도입니다. 즉,지도에지도를 저장하려고합니다. –

+1

@Callash, 나무를 원하세요? – tuinstoel

+0

@tuinstoel 위의 설명을 참조하십시오. –

1

논리적으로 이해가되지 않는 관계형 DBMS에 키 - 값 패러다임을 집어 넣으려고합니다.순수 관계형으로 이동하는 것이 훨씬 쉽습니다.

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 
); 

그리고 그게 전부입니다! 나중에 자식이 많은 부모를 가질 수 있다고 변경하려면 PK 제약 (관계형 DBMS의 아름다움)을 변경하십시오.

+1

당신은 Pb를 얻지 못했고, 그는 테이블이 아니라 타입을 원했습니다. 그는이 구조를 사용하여 예를 들어 SP를 호출 할 수 있습니다. –