2010-11-24 1 views
2

Oracle 10g 및 COLLECT 함수 사용시 문제점이 있습니다. 나는 오늘 아침에 그 존재에 관해서 만 알았지 만, member of 조건과 관련하여 그것을 사용함으로써 해결할 수있는 문제가있다.Oracle COLLECT 함수 및 유형

처음에는 아래와 같은 오류 코드 "ORA_00932 : inconsistent datatypes : expected UDT got -"이 표시되었습니다.

with my_tab as (
    select 1 as cola, 1 as colb from dual union all 
    select 1 as cola, 2 as colb from dual union all 
    select 2 as cola, 3 as colb from dual union all 
    select 2 as cola, 4 as colb from dual union all 
    select 3 as cola, 3 as colb from dual union all 
    select 3 as cola, 4 as colb from dual union all 
    select 4 as cola, 1 as colb from dual union all 
    select 4 as cola, 2 as colb from dual 
) 
select 
    cola, 
    colb_vals 
from (
    select 
    cola, 
    collect(colb) as colb_vals 
    from my_tab 
    group by cola 
) 
where 2 member of colb_vals 

오라클 10.2.4.0부터 약간 이상한 것으로 나타났습니다. 데이터베이스가 임시 시스템 생성 사용자 정의 유형을 생성하고이를 사용하는 것으로 보입니다. 조건을 제거하면 (where 2 member of colb_vals) 코드가 실행되고 임시 UDT (SYSTPblahblahblah ==)가 포함 된 검색된 데이터가 표시됩니다.

좀 더 검색 한 후, 난이 CREATE TYPE를 사용하고 중첩 테이블의 종류를 변경하는 CAST 함수를 사용 해결할 수 있다는 것을 깨달았다. 어느 것이 효과가 있었는지. 나는 단 하나에 하나 개의 절차에서 특정 쿼리에 사용할 수 있도록이 형식이 필요

CREATE TYPE number_ntt as TABLE OF NUMBER;을 사용하고 난 후 패키지로 만든 중첩 테이블 유형을 사용하려고 cast(collect(colb) as number_ntt)

collect(colb)을 교체했다, 이후 꾸러미. 그리고 나는 그것을 작동시킬 수 없었다.

create or replace package mike_temp_pkg as 
    type number_ntt is table of number; 
end mike_temp_pkg; 

그리고이 ORA-00932 결과 cast(collect(colb) as mike_temp_pkg.number_ntt)

collect(colb) 대체이 시간 : 유효하지 않은 데이터 타입.

그래서 내가 가지고있는 문제는 정말 두 부분에 다음 select 아니라 member of에 대한

  1. 이유는 시스템이 생성 않는 사용자 정의 형식 사용할 수 있습니까?

  2. 패키지에 형식이 SQL 형식이어야하고 PL/SQL 형식이 아니어야하는 이유는 무엇입니까? 나는 실제로 그 타입에 타입을 정의하지 않았기 때문에 그 질문에 대한 간단한 대답 이있을 수 있습니다.

답변

2

(1)

수집] 기능 문서 상태 "당신은 CAST 함수 내를 사용해야합니다이 함수의 결과를 얻을 수 있습니다." 나는 그것이 단순히 정의 된 타입으로 캐스트하지 않는 한, 그 내용의 간단한 덤프를 제외하고 어떤 용도를 지원하도록 설계되지 않았다고 생각한다.

(2)

는 SQL 파서는 PL/SQL 블록에 정의 된 유형에 아무런 지식이나 액세스 할 수 없습니다. PL/SQL 코드 내에서 SQL 문을 실행하더라도, 명령문은 기본적으로 독립적 인 구문 분석기 (PL/SQL 변수 이름이 바인드 변수 자리 표시 자로 대체 됨)로 전달됩니다.

+0

나는 과거에 SQL에서 PL/SQL 유형을 사용했기 때문에 부분 2가 가능하다고 생각하는 이유 중 일부는 생각하지만, PIPELINED 함수를 사용하면 TABLE() 키워드가 이 경우 SQL과 PL/SQL 세계 사이의 약간의 다리가 필요합니다. –

+0

파이프 라인 된 함수에서 SQL 형식이 암시 적으로 만들어집니다. http://blog.sydoracle.com/2007/03/pipelined-functions-implicitly-create.html –

+0

@Gary 링크를 제공해 주셔서 감사합니다. SQL과 PL/SQL 사이의 상호 작용으로 점점 더 혼란스러워지고 있습니다! –