2012-03-29 2 views
5

객체 생성자에 인수가없는 생성자가 있지만 해당 유형의 열에 기본값으로 지정하면 ORA-00904 : 잘못된 식별자 오류가 발생합니다.오라클 : 객체 유형 열의 기본값 지정

예 :

 
CREATE OR REPLACE TYPE test_t AS OBJECT 
(
    val  NUMBER(10), 
    CONSTRUCTOR FUNCTION test_t return self as result 
) 

CREATE OR REPLACE TYPE BODY test_t AS 
    CONSTRUCTOR FUNCTION test_t RETURN SELF AS RESULT IS 
    BEGIN 
    val := 1; 
    RETURN; 
    END; 
END; 

CREATE TABLE test_table (
    test_attr test_t DEFAULT new test_t() 
) 

Error: ORA-00904: "INKA"."TEST_T"."TEST_T": invalid identifier 

나는 예를 들어, 기본적를 교체하는 경우 test_t (1), 작동하지만 그 일종의 OO 캡슐화 패러다임을 깨고 같은 유형의 모든 필드에 동일한 기본 "기본값"을 갖기를 바란다. (내 뜻을 알기를 바란다.)

누락 여기 또는 무언가가 정상이며 이것이 아닌 기본 생성자를 사용할 수 없습니까?

답변

0

이렇게 보이지 않습니다.

한 가지 해결 방법은 트리거를 사용하는 것입니다 :

CREATE OR REPLACE TRIGGER test_trigger 
    BEFORE INSERT OR UPDATE 
ON test_table 
    FOR EACH ROW 
WHEN (new.test_attr IS NULL) 
BEGIN 
    :new.test_attr := NEW test_t(); 
END test_trigger; 
/
그것은 완전히

CONSTRUCTOR FUNCTION test_t(in_val NUMBER) 
RETURN SELF AS RESULT 

가 리드 기본 생성자를 오버라이드 (override), 그런데 기본이 아닌 생성자를 무시하지 않습니다


DEFAULT NEW test_t(1)을 사용하여 표를 정의 할 때 예외 :

ORA-06553 : PLS-307 'TEST_T'의 너무 많은 선언이 호출을

+0

ORA-06553 일치 : PLS-307 중복 생성자 정의의 결과를, 오라클이 점에서 다소 재미; "in_val"매개 변수 이름을 val로 대체하면 (속성 이름과 마찬가지로) 기본 생성자를 올바르게 대체합니다. –

+0

그래도 여전히이 생성자를 찾습니다 ... –

+0

나는 방아쇠 해결책을 알고 있지만 훨씬 더 읽기 쉽고 다루기 쉬운 방식으로 가능한 5-10 줄의 코드를 알고 있습니다. 처음에는 SQL 컨텍스트가 PL/SQL 컨텍스트 내에서 보지 못하기 때문에 가능하지 않다고 추측 했었지만 그 이후로는 순수한 SQL에서는 작동하지 않을 것입니다. 따라서이 문제는 오라클의 부분에 대한 감독이거나 내가 인식하지 못하는 구문이 있습니다 ... –