2016-06-22 3 views
0

제목이 다음과 같이 나타납니다. 기존 표를 기반으로 오라클에 유형을 작성하고 싶습니다.기존 표를 기반으로 유형 생성

나는 다음과 같이했다 :

create or replace function OUTPUT_FCT() return MY_NEW_TYPE AS 
... 

답변

3

테이블에서 행을 반환하는 함수 만 만들면 형식을 만들지 않고 다음과 같은 것을 시도 할 수 있습니다.

설정 :

create table EXISTING_TABLE(a number, b varchar2(100)); 
insert into EXISTING_TABLE values (1, 'one'); 

기능 :

SQL> begin 
    2  dbms_output.put_line(OUTPUT_FCT().a); 
    3  dbms_output.put_line(OUTPUT_FCT().b); 
    4 end; 
    5/
1 
one 

그러나

create or replace function OUTPUT_FCT return EXISTING_TABLE%rowtype AS 
    retVal EXISTING_TABLE%rowType; 
begin 
    select * 
    into retVal 
    from EXISTING_TABLE 
    where rownum = 1; 
    -- 
    return retVal; 
end; 

함수 호출, 나는 않을 것 R select * 같은 것들이 실제로 위험 할 수 있기 때문에 그러한 접근법을 제안하십시오. 필요한 필드가있는 형식을 정의한 다음 원하는 테이블에 명시 적으로 쿼리하는 것이 더 좋습니다.

+0

위의 코드에 대한 컴파일 오류가 없습니다 (아래 답변 참조). – Petar

2

: 목표 테이블의 테이블에 포함 된 샘플 행 EXISTING_TABLE을 반환하는 함수로 이것을 사용 할 수있을 것입니다

create or replace type MY_NEW_TYPE as object(one_row EXISTING_TABLE%rowtype); 

아니요, 그렇게 할 수 없으면 컴파일 오류가 발생합니다.

create or replace type my_new_type as object(one_row t42%rowtype); 
/

Type MY_NEW_TYPE compiled 
Errors: check compiler log 

show errors 

Errors for TYPE STACKOVERFLOW.MY_NEW_TYPE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/36  PLS-00329: schema-level type has illegal reference to MYSCHEMA.T42 

개체 유형의 각 필드를 지정해야하므로 수동으로 데이터 형식을 지정해야합니다. table.column%type도 사용할 수 없습니다.

데이터 사전의 열과 데이터 유형 정보를 기반으로 유형을 동적으로 만들 수 있지만 일회성 작업이 될 수 있으며 런타임에 수행 할 작업이 아니므로 실제로는 그렇지 않습니다. 그만한 가치가있는 것 같아.

테이블의 rowtype을 기반으로 PL/SQL 테이블 유형을 만들 수 있지만 일반 SQL이 아닌 PL/SQL에서 반환하는 함수 만 호출 할 수 있습니다. 따라서 예를 들어 테이블 콜렉션 표현식. 단일 샘플 행만 반환하는 경우 테이블이 아닌 레코드를 반환 할 수 있지만 동일하게 적용됩니다. 테이블의 구조와 일치 할 수있는 참조 커서를 반환하는 함수를 가질 수도 있지만 테이블로도 처리 할 수는 없습니다.

Read more about object type creation in the documentation. 특히 속성과 데이터 유형 섹션.

관련 문제