2015-03-18 13 views
8

Ich möchte einige Daten aus einer Systemtabelle user_tab_cols in eine temporäre Tabelle speichern, damit ich einen Dump daraus machen kann.Workaround für ORA-00997: Illegale Verwendung des LONG-Datentyps

Es gibt 100.000 Zeilen in es, ich habe wählen Sie aus user_tab_cols etwa 1.000 Datensätze und d sie in eine temporäre Tabelle mit dieser Abfrage speichern:

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

Ich hatte Fehler ‚illegale Nutzung von longtype‘, wegen die Spalte DATA_DEFAULT, die den Typ long enthält.

Gibt es einen alternativen Weg, wo ich einen langen Typ in einem anderen Tisch speichern kann?

+0

'lange' s sind extrem begrenzte Arten. Gibt es einen besonderen Grund, warum Sie 'CLOB' nicht verwenden? – Mureinik

+1

@Mureinik Ich extrahiere einige Daten aus user_tab_cols, die eine Spalte lang enthalten, gibt es eine Möglichkeit, diese Daten zu extrahieren? – Moudiz

+0

Der Tabellenname wurde nicht registriert ... Das war eine dumme Frage in meinem Namen. Mea Culpa. – Mureinik

Antwort

11

ORA-00997: illegale Nutzung von LONG-Datentyp

Es ist eine Einschränkung Verbrauch von LONG Datentyp. Sie können keinen Objekttyp mit einem LONG-Attribut erstellen.

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> 

Alternativ können Sie TO_LOB als Abhilfe verwenden. Was würde es in CLOB-Datentyp konvertieren.

Zum Beispiel

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> 

Weitere Beispiele für Abhilfen here.

2

Sie müssen Ihre Zieltabelle explizit erstellen, nicht von select *: (. Hinweis I data_default ein clob für bequemen Abfrage- gemacht habe)

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

Dann können Sie Zeilen einfügen in einer PL/SQL-Schleife:

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; 

einige Einschränkungen grundsätzlich mit diesem Ansatz gibt es alsDie-Spalte kann mehr als die varchar2(32760) enthalten, die PL/SQL in der Schleife verwenden wird. Ich erwarte jedoch, dass 32760 Zeichen für die meisten Spaltenausdrücke ausreichen.

Verwandte Themen