2009-10-19 6 views
8

3 개의 값을 가진 객체를 반환하는 함수가 있습니다. select 문에서이 함수를 호출하고 각 값을 다른 열로 유지할 수 있습니까? 3 가지 기능으로 나눌 수는 있지만 성능상의 이유로 값을 유지하고 싶었습니다. (그래서 오라클은 쿼리의 모든 행에 대해 3 개 매우 유사한 복잡한 함수를 호출 할 필요가 없습니다.)에 대한 그래서오라클의 select 문에서 객체 유형 사용

: 내가 좋아하는 것

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

SELECT 문에서 test_func 호출 할 수 있도록를 함수를 여러 번 호출하지 않고 a, b 및 c를 서로 다른 열로 만들 수 있습니다. 어쩌면 이런 걸 생각했지만, 그것은 작동하지 않습니다

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

오라클 10g에서 이런 일을 할 수있는 방법이 있나요, 또는이 문제를 해결하기 위해 더 나은 방법이?

답변

9

질문의 select 문이 작동합니다. 인라인보기에 대한 별칭을 포함하지 않았기 때문에 실패했습니다.

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

을하지만이되지 않습니다 :

어떤 이유로이 작동

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

감사합니다. 이것은 나를 도왔다. – filiprem

+1

문제는 단순히 이름 확인과 관련됩니다. Oracle은 항상 SELECT 문의 점 앞에있는 첫 번째 부분을 데이터베이스의 테이블 별칭 또는 동의어/패키지로 해석합니다. 또한 모든 열을 검사하지 않습니다. 따라서 table_alias.column.attribute로 이름을 완전히 한정해야합니다. – Falco

2

테이블 별칭은 작업 결과를 가능하게 명명 된 결과 집합 컨텍스트에 결과를 저장 개체 인스턴스로. 별칭이 없으면 캐스팅이 고유 한 명시 적 참조가없는 객체 유형 인스턴스를 처리하지 않으므로 테이블 별칭이 실제로 실패합니다.