2015-03-18 9 views
8

Desidero salvare alcuni dati da una tabella di sistema user_tab_cols, in una tabella temporanea in modo da poter prelevare un dump da esso.Soluzione alternativa per ORA-00997: uso illecito del tipo di dati LONG

Ci sono 100.000 righe in esso, ho selezionare dalla user_tab_cols circa 1.000 record e D salvarli in una tabella temporanea con questa query:

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

ho avuto l'errore 'uso illegale di longtype', a causa della la colonna DATA_DEFAULT che contiene un tipo di long.

Esiste un modo alternativo in cui è possibile memorizzare un tipo lungo in un tavolo anonimo?

+0

'long's sono tipi estremamente limitati. C'è qualche ragione particolare per cui non stai usando 'CLOB's? – Mureinik

+1

@Mureinik Sto estraendo alcuni dati da user_tab_cols che contengono una colonna lunga, c'è un modo per estrarre quei dati? – Moudiz

+0

Non ha registrato il nome della tabella ... Questa è stata una domanda stupida a mio nome. Colpa mia. – Mureinik

risposta

11

ORA-00997: uso illegale di datatype LUNGO

Si tratta di un restrizione sull'uso di LONG tipo di dati. Non è possibile creare un tipo di oggetto con un attributo LONG.

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> 

In alternativa, è possibile utilizzare TO_LOB come una soluzione. Quale lo convertirà in tipo di dati CLOB.

Per esempio,

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> 

Altri esempi di soluzioni alternative here.

2

Avrai bisogno di creare la tabella di destinazione in modo esplicito, non da select *: (. Notate che ho fatto data_default un clob per più conveniente interrogazione)

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

Quindi è possibile inserire righe in un ciclo PL/SQL:

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; 

ci sono alcune limitazioni in linea di principio con questo approccio, comeLa colonnapuò contenere più dello varchar2(32760) che PL/SQL utilizzerà nel ciclo. Tuttavia, mi aspetto che 32760 caratteri siano sufficienti per la maggior parte delle espressioni di default della colonna.