2012-03-29 11 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), यह काम करता है, लेकिन उस प्रकार के ओओ encapsulation प्रतिमान तोड़ता है, मैं चाहता हूं कि सभी प्रकार के सभी फ़ील्ड एक ही डिफ़ॉल्ट "डिफ़ॉल्ट मान" हों (आशा है कि आप जानते हैं कि मेरा क्या मतलब है :-)

क्या मुझे याद आ रही है यहां कुछ है, या यह सामान्य है और इस तरह के गैर-डिफ़ॉल्ट रचनाकारों का उपयोग करना संभव नहीं है?

उत्तर

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 

एक की ओर जाता है DEFAULT NEW test_t(1) के साथ तालिका को परिभाषित करने का प्रयास करते समय अपवाद:

ORA-06,553: PLS-307: 'TEST_T' की भी कई घोषणाओं इस कॉल

+0

ORA-06,553 से मेल खाते हैं: PLS-307 डुप्लीकेट निर्माता परिभाषा का परिणाम है, ओरेकल कि में कुछ हद तक हास्यास्पद है; यदि आप वैल के साथ "in_val" पैरामीटर नाम को प्रतिस्थापित करते हैं (जैसा कि विशेषता का नाम है), यह डिफ़ॉल्ट कन्स्ट्रक्टर को सही ढंग से ओवरराइड करेगा। –

+0

ठीक है, लेकिन फिर भी यह इस कन्स्ट्रक्टर को पाता है ... –

+0

मुझे ट्रिगर वर्कअराउंड के बारे में पता है, लेकिन कुछ और अधिक पठनीय और प्रबंधनीय फैशन में संभव होने के लिए कोड की 5-10 लाइनें। प्रारंभ में मैंने माना कि यह संभव नहीं है क्योंकि एसक्यूएल संदर्भ पीएल/एसक्यूएल संदर्भ के अंदर नहीं देखता है, लेकिन यह स्पष्ट रूप से मामला नहीं है क्योंकि तब से ओओ सामान शुद्ध एसक्यूएल में काम नहीं करेगा। तो यह समस्या या तो ओरेकल के हिस्से पर एक निरीक्षण है, या कुछ वाक्यविन्यास है जो मुझे अनजान है ... –