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
에 대한
이유는 시스템이 생성 않는 사용자 정의 형식 사용할 수 있습니까?
패키지에 형식이 SQL 형식이어야하고 PL/SQL 형식이 아니어야하는 이유는 무엇입니까? 나는 실제로 그 타입에 타입을 정의하지 않았기 때문에 그 질문에 대한 간단한 대답 이있을 수 있습니다.
나는 과거에 SQL에서 PL/SQL 유형을 사용했기 때문에 부분 2가 가능하다고 생각하는 이유 중 일부는 생각하지만, PIPELINED 함수를 사용하면 TABLE() 키워드가 이 경우 SQL과 PL/SQL 세계 사이의 약간의 다리가 필요합니다. –
파이프 라인 된 함수에서 SQL 형식이 암시 적으로 만들어집니다. http://blog.sydoracle.com/2007/03/pipelined-functions-implicitly-create.html –
@Gary 링크를 제공해 주셔서 감사합니다. SQL과 PL/SQL 사이의 상호 작용으로 점점 더 혼란스러워지고 있습니다! –