2015-03-18 5 views
8

मैं एक सिस्टम तालिका user_tab_cols से कुछ डेटा को एक temp तालिका में सहेजना चाहता हूं, इसलिए मैं इससे डंप ले सकता हूं।ORA-00997 के लिए वर्कअराउंड: लंबे डेटाटाइप का अवैध उपयोग

उस में 100,000 पंक्तियों रहे हैं, मैं 1,000 रिकॉर्ड के बारे में user_tab_cols से चयन किया है और d इस क्वेरी के साथ एक अस्थायी तालिका में उन्हें बचाने:

create table temp table as select * from user_tab_cols where condition... 

मैं त्रुटि 'longtype के अवैध उपयोग' की वजह से था, कॉलम DATA_DEFAULT जिसमें एक प्रकार का लंबा होता है।

क्या कोई वैकल्पिक तरीका है जहां मैं एक लंबे प्रकार को एनोटेर टेबल में स्टोर कर सकता हूं?

+0

'लंबे समय तक सीमित सीमित प्रकार हैं। क्या कोई विशेष कारण है कि आप 'सीएलओबी' का उपयोग नहीं कर रहे हैं? – Mureinik

+1

@Mureinik मैं user_tab_cols से कुछ डेटा निकाल रहा हूं जिसमें एक स्तंभ लंबा है, क्या कोई तरीका है कि मैं उन डेटा को निकाल सकता हूं? – Moudiz

+0

तालिका नाम पंजीकृत नहीं किया था ... यह मेरी ओर से एक बेवकूफ सवाल था। मी कुल्पा – Mureinik

उत्तर

11

ORA-00997: लंबे डेटाप्रकार के अवैध उपयोग

यह लंबी डेटा प्रकार के उपयोग पर एक प्रतिबंध है। आप एक लंबी विशेषता के साथ एक वस्तु प्रकार नहीं बना सकते हैं।

SQL> CREATE TABLE t AS SELECT data_default FROM user_tab_cols; 
CREATE TABLE t AS SELECT data_default FROM user_tab_cols 
         * 
ERROR at line 1: 
ORA-00997: illegal use of LONG datatype 


SQL> 

वैकल्पिक रूप से, आप एक समाधान के रूप TO_LOB इस्तेमाल कर सकते हैं। जो इसे सीएलओबी डेटा प्रकार में परिवर्तित करेगा।

उदाहरण के लिए,

SQL> CREATE TABLE t AS SELECT TO_LOB(data_default) data_default FROM user_tab_cols; 

Table created. 

SQL> desc t; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
DATA_DEFAULT          CLOB 

SQL> 

समाधान here के अधिक उदाहरण देखें।

2

आप select * से स्पष्ट रूप से अपने लक्ष्य तालिका बनाने के लिए, नहीं की आवश्यकता होगी: (। नोट मैं और अधिक सुविधाजनक क्वेरी किए जाने के लिए data_default एक clob कर दिया है)

create table demo_copy 
(table_name varchar2(30) 
, column_name varchar2(30) 
, data_type varchar2(106) 
, data_type_mod varchar2(3) 
, data_type_owner varchar2(30) 
, data_length number 
, data_precision number 
, data_scale number 
, nullable varchar2(1) 
, column_id number 
, default_length number 
, data_default clob 
, num_distinct number 
, low_value raw(32) 
, high_value raw(32) 
, density number 
, num_nulls number 
, num_buckets number 
, last_analyzed date 
, sample_size number 
, character_set_name varchar2(44) 
, char_col_decl_length number 
, global_stats varchar2(3) 
, user_stats varchar2(3) 
, avg_col_len number 
, char_length number 
, char_used varchar2(1) 
, v80_fmt_image varchar2(3) 
, data_upgraded varchar2(3) 
, hidden_column varchar2(3) 
, virtual_column varchar2(3) 
, segment_column_id number 
, internal_column_id number 
, histogram varchar2(15) 
, qualified_col_name varchar2(4000)); 

तो फिर तुम पंक्तियों सम्मिलित कर सकते हैं

begin 
    for r in (
     select * from user_tab_cols c 
     where rownum <= 2 -- your filter condition here 
    ) 
    loop 
     insert into demo_copy values r; 
    end loop; 
end; 

, इस दृष्टिकोण के साथ सिद्धांत रूप में कुछ सीमाएं हैं एकके रूप में: एक PL/SQL पाश मेंकॉलम varchar2(32760) से अधिक हो सकता है कि पीएल/एसक्यूएल लूप में उपयोग करेगा। हालांकि, मुझे उम्मीद है कि अधिकांश कॉलम डिफ़ॉल्ट अभिव्यक्तियों के लिए 32760 वर्ण पर्याप्त होंगे।

संबंधित मुद्दे