2012-03-29 46 views
5

Tôi có kiểu đối tượng với hàm tạo không có arg, nhưng khi tôi chỉ định giá trị mặc định cho cột thuộc loại đó, tôi nhận được ORA-00904: lỗi định danh không hợp lệ.Oracle: chỉ định giá trị mặc định cho cột kiểu đối tượng

Ví dụ:

 
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 

Nếu tôi thay DEFAULT với ví dụ test_t (1), nó hoạt động, nhưng loại phá vỡ mô hình đóng gói OO, tôi muốn tất cả các trường cùng loại có cùng giá trị mặc định "(hy vọng bạn biết ý tôi là gì :-)

Tôi đang thiếu một cái gì đó ở đây, hoặc là điều này bình thường và nó không thể sử dụng constructor không mặc định như thế này?

Trả lời

0

Có vẻ như điều này là không thể.

Một workaround sẽ được sử dụng một kích hoạt:

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; 
/

Nó không hoàn toàn bỏ qua nhà xây dựng không phải mặc định bằng cách này, trọng constructor mặc định

CONSTRUCTOR FUNCTION test_t(in_val NUMBER) 
RETURN SELF AS RESULT 

dẫn đến một ngoại lệ khi cố gắng xác định bảng với DEFAULT NEW test_t(1):

ORA-06.553: PLS-307: quá nhiều tờ khai của 'TEST_T' phù hợp với cuộc gọi này

+0

ORA-06.553: PLS-307 là kết quả của định nghĩa constructor trùng lặp, Oracle có phần hài hước trong đó; nếu bạn thay thế tên tham số "in_val" bằng val (như tên của thuộc tính), nó sẽ ghi đè chính xác hàm tạo mặc định. –

+0

Phải, nhưng nó vẫn tìm thấy nhà xây dựng này ... –

+0

Tôi biết về giải pháp kích hoạt, nhưng 5-10 dòng mã cho một thứ có thể dễ đọc hơn và dễ quản lý hơn. Ban đầu tôi cho rằng không thể thực hiện được vì ngữ cảnh SQL không nhìn thấy bên trong ngữ cảnh PL/SQL, nhưng rõ ràng không phải là trường hợp vì không có công cụ OO nào hoạt động trong SQL thuần túy. Vì vậy, vấn đề này là hoặc là một giám sát trên một phần của Oracle, hoặc có một số cú pháp tôi không biết ... –

Các vấn đề liên quan