2011-07-04 3 views
4

방금 ​​오라클의 ANYDATAANYTYPE을 발견했으며 매우 반복적 인 코드가 있으면 일반적으로 유용 할 것이라고 생각했습니다.행 유형을 기반으로하는 컬렉션이있는 ANYDATA

declare 
    --simple test query 
    cursor myCurs is 
     select sysdate from dual; 

    type t_arr is table of myCurs%rowtype; 
    v_arr t_arr; 

    v_anydata ANYDATA;  
begin 

    open myCurs; 
    fetch myCurs bulk collect into v_arr; 
    close myCurs; 

    dbms_output.put_line(v_arr.count || ' records'); 

    v_anydata := ANYDATA.convertCollection(v_arr); 
    dbms_output.put_line(anydata.gettypename(v_anydata)); 

end; 
/

이 코드를 실행하면 나에게 오류를 제공합니다 "ORA-22370 : : 방법 ORA는-22370 방법 ConvertCollection의 잘못된 ussage이의 잘못된 사용"(예, 실제로 반복 I는 다음과 같습니다 매우 간단한 코드 샘플을 시도 ORA-22370).

제 질문은 : 행 유형 모음에 ANYDATA를 사용할 수 있습니까? 컬렉션에 ANYDATA (지금까지)가 사용 된 모든 예제가 객체 유형을 사용하고 아무 것도 사용하지 않기 때문에이 질문을합니다. 그러나 행 유형을 사용할 수 없다는 것을 명시 적으로 알지 못했습니다.

필자의 목표는 같은 일을 반복하지만 다른 테이블에 대해 다른 커서를 사용하는 반복적 인 대량 수집/삽입 코드를 정리하는 것이 었습니다.

(오라클 10g)

답변

5

애니는 SQL의 data_types와 함께 작동, 즉 당신이 테이블 열을 정의하는 데 사용할 수있는 아무것도.

% ROWTYPE은 PL/SQL 구조이므로 SQL 엔진에서 인식하지 못합니다. % ROWTYPE의 동적 특성을 생각하면 이유를 파악할 수 있습니다.


반복적 인 코드를 정리하려는 것은 고상한 생각입니다. 이전에 일반 유형 처리를 소유하는 수퍼 유형 오브젝트를 사용하는 SQL 유형의 ETL 프로세서와 테이블 특정 코드 (예 : 삽입)를 실행하는 부속 유형을 구현했습니다. 이러한 부속 유형은 완전히 생성 가능합니다. 동적 % ROWTYPE 구현만큼 매끄럽지는 않지만 충분히 쉽습니다.

+0

이 예제에서 내가하려는 것은 단순히 불가능합니다. – FrustratedWithFormsDesigner

+0

APC에게, 제발 Pl/SQL의 제네릭에 관한 제 새로운 질문을보기 위해 친절하게 여기에 부탁하는 것은 좋지 않습니다. http://stackoverflow.com/questions/13157392/dynamic-typing-or- generics-in-oracle-pl-sql. 당신의 대답에서이 질문에 당신은 매우 도움이 될 수 있다고 생각합니다. – bpgergo

관련 문제