2017-03-21 1 views
0

account_table 행에 대한 참조 목록 (중첩 테이블)을 포함하는 테이블 customer_table이 있습니다. 여기 중첩 테이블에 여러 참조 삽입

내 선언은 다음과 같습니다

고객 유형 :

CREATE TYPE customer as object(
    custid integer, 
    infos ref type_person, 
    accounts accounts_list 
); 

accounts_list 유형 :

CREATE TYPE accounts_list AS table of ref account; 

테이블 :

CREATE TABLE customer_table OF customer(
    custid primary key, 
    constraint c_inf check(infos is not null), 
    constraint c_acc check(accounts is not null) 
) 
NESTED TABLE accounts STORE AS accounts_refs_nt_table; 

그래서 나는 여러 심판을 삽입 할 ~ 안에 계정을 공유 할 수 있으므로 고객을 만들 때 내 중첩 테이블.

나는 그 방법을 찾을 수 없습니다.

내가 시도 :

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    accounts_list(
     SELECT ref(a) FROM account_table a WHERE a.accid = 0 
     UNION ALL 
     SELECT ref(a) FROM account_table a WHERE a.accid = 1 
    ) 
    FROM DUAL 
    FROM person_table p 
    WHERE p.personid = 0 
); 

을 성공하지.

답변

1

당신은, 예를 들어, the collect() function을 사용할 수 있습니다 주셔서 감사합니다 하위 쿼리 : 설명서를 말한다

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    (
     SELECT CAST(COLLECT(ref(a)) AS accounts_list) 
     FROM account_table a 
     WHERE accid IN (0, 1) 
    ) 
    FROM person_table p 
    WHERE p.personid = 0 
); 

으로, "당신이 CAST 함수 내에서 사용한다이 함수에서 정확한 결과를 얻으려면"그래서 명시 적으로 account_list 유형으로 캐스팅했습니다.

당신이 대신 할 수있는 하위 쿼리하지 않으려면 :

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    CAST(COLLECT(a.r) AS accounts_list) 
    FROM person_table p 
    CROSS JOIN (SELECT ref(a) AS r FROM account_table a WHERE accid IN (0, 1)) a 
    WHERE p.personid = 0 
    GROUP BY ref(p) 
); 

을하지만 그 조금 지저분 생각; 두 가지의 성능을 모두 확인하십시오.

관련 문제