2015-03-18 18 views
8

'un yasadışı kullanımı Bazı verileri bir sistem tablosundan user_tab_cols bir geçici tabloya kaydetmek istiyorum, böylece bir çöp kutusu alıyorum.ORA-00997 için geçici çözüm: LONG veri türü

İçinde 100.000 satırlar vardır, ben 1000 kayıtları hakkında user_tab_cols seçin ve bu sorgu ile geçici tabloya kaydetmek d:

Ben nedeniyle, 'longtype yasadışı kullanımı' hatası vardı
create table temp table as select * from user_tab_cols where condition... 

Uzun bir tür içeren DATA_DEFAULT sütunu.

Uzun bir türü anotehr masasına saklayabileceğim farklı bir yol var mı?

+0

'long's çok sınırlı türlerdir. CLOB'ları kullanmadığınız belirli bir neden var mı? – Mureinik

+1

@Mureinik Ben uzun bir sütun içeren user_tab_cols bazı verileri ayıklamak, bu verileri ayıklamak bir yolu var mı? – Moudiz

+0

Tablo adını kaydetmediniz ... Bu benim adıma aptalca bir soruydu. Mea Culpa. – Mureinik

cevap

11

ORA-00997: uzun veri türü kaçak kullanım

Bu uzun veri türü kullanımına bir kısıtlama olup. LONG niteliğine sahip bir nesne tipi oluşturamazsınız.

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> 

Alternatif olarak, geçici bir çözüm olarak TO_LOB kullanabilirsiniz. Hangisini CLOB veri tipine dönüştürürdünüz? Örneğin

,

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> 

geçici here daha fazla örnek bakınız.

2

Sen select * değil, açıkça hedef tablo oluşturmak gerekir: (. Ben daha uygun olarak algılanması için clobdata_default yaptık Not)

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

Sonra satır ekleyebilir

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; 

birolarak, bu yaklaşımla prensipte bazı sınırlamalar vardır: PL/SQL döngüdesütunu, PL/SQL'in döngüde kullanacağı varchar2(32760)'dan daha fazlasını tutabilir. Ancak, çoğu sütun varsayılan ifadesi için 32760 karakterin yeterli olacağını umuyorum.

İlgili konular