2012-10-18 11 views
6

मैं अपने SQL कथन में% TYPE विशेषता का उपयोग कर मान डालना चाहता हूं। % TYPE विशेषता आपको टाइप नामों को हार्डकोड करने की बजाय, अपनी घोषणाओं में फ़ील्ड, रिकॉर्ड, नेस्टेड टेबल, डेटाबेस कॉलम या चर के डेटाटाइप का उपयोग करने देती है।% TYPE विशेषता का उपयोग करते हुए ओरेकल कास्ट

यह काम करता है:

insert into t1 select cast(v as varchar2(1)) from t2; 

लेकिन मैं चाहते हैं

insert into t1 select cast(v as t1.v%TYPE) from t2; 

Error starting at line 16 in command: 
insert into t1 select cast(v as t1.v%TYPE) from t2 
Error at Command Line:16 Column:37 
Error report: 
SQL Error: ORA-00911: Ongeldig teken. 
00911. 00000 - "invalid character" 
*Cause: identifiers may not start with any ASCII character other than 
      letters and numbers. $#_ are also allowed after the first 
      character. Identifiers enclosed by doublequotes may contain 
      any character other than a doublequote. Alternative quotes 
      (q'#...#') cannot use spaces, tabs, or carriage returns as 
      delimiters. For all other contexts, consult the SQL Language 
      Reference Manual. 
*Action: 

इस (या कुछ इसी तरह) किया जा सकता है के लिए?

संपादित करें: जो मैं प्राप्त करने की कोशिश कर रहा हूं वह है: जब t2.v बड़ा होता है तो मैं इसे छोटा करना चाहता हूं। मैं एक कठोर कोडित क्षेत्र की लंबाई के साथ substr का उपयोग करने से बचने की कोशिश कर रहा हूँ। तो डाली (t1.v% प्रकार के रूप में वी) के बजाय substr (वी, 1,1)

उत्तर

5

%TYPE PL/SQL में ही उपलब्ध है, और केवल declaration section of a block में इस्तेमाल किया जा सकता है। तो, आप जो भी कर रहे हैं वह नहीं कर सकते हैं।

आपको लगता है कि हो सकता है आप अपने खुद के PL/SQL (उप) की घोषणा कर सकता है टाइप करें और उपयोग करें कि बयान में:

declare 
    subtype my_type is t1.v%type; 
begin 
    insert into t1 select cast(v as my_type) from t2; 
end; 
/

... लेकिन वह भी काम नहीं करेगा, क्योंकि cast() एक एसक्यूएल समारोह है पीएल/एसक्यूएल एक नहीं, और केवल अंतर्निर्मित और स्कीमा-स्तर संग्रह प्रकारों को पहचानता है; और आप %TYPE का उपयोग करके SQL type नहीं बना सकते हैं। अगर आपको लगता है कि लंबाई एक चर में संग्रहीत हो सकता था

insert into t1 select substr(v, 1, 
    select data_length 
    from user_tab_columns 
    where table_name = 'T1' 
    and column_name = 'V') from t2; 

जो थोड़ा अधिक स्वादिष्ट हो सकता है - SQL में एक प्रतिस्थापन या बाँध चर *:


एक बुरा हैक रूप में, आप की तरह कुछ कर सकता है इसके अलावा, या पीएल/एसक्यूएल में एक स्थानीय चर। उदाहरण के लिए, अगर यह एसक्यूएल * के माध्यम से एक सीधे एसक्यूएल अद्यतन है इसके अलावा आप एक बाँध चर इस्तेमाल कर सकते हैं:

var t1_v_len number; 
begin 
    select data_length into :t1_v_len 
    from user_tab_columns 
    where table_name = 'T1' and column_name = 'V'; 
end; 
/
insert into t1 select substr(v, 1, :t1_v_len) from t2; 

कुछ इसी तरह के अन्य सेट-अप में किया जा सकता है, यह निर्भर करता है, जहां डालने प्रदर्शन किया जा रहा है।

+1

'+ 1',' 10k' तक पहुंचने पर बधाई :) –

+0

@ पीटर लांग - धन्यवाद * 8-) मान लीजिए कि मैं बेहतर होगा और मॉडरेटर टूल्स के बारे में पढ़ूंगा ... –

+0

@Alex यह वही है जो मैं हूं हासिल करने की कोशिश कर रहा है। जब t2.v बड़ा होता है तो मैं इसे छोटा करना चाहता हूं। मैं एक कठोर कोडित क्षेत्र की लंबाई के साथ substr का उपयोग करने से बचने की कोशिश कर रहा हूँ। तो substr (v, 1,1) –