Copy Long Datatype (Oracle) .... hmmm.....

Monday, August 6, 2007

Iseng.. iseng ah.. buat ngingetin diri sendiri kalau lupa.. and sekalian sharing mengenai pengalaman beberapa waktu yang lalu ..sudah cukup lama sih..kurang lebih tahun lalu ... waktu mau mindahin table dengan datatype LONG .. eh .. koq gak bisa pake cara yang biasa... :)

Tahukah anda ? bahwa table dengan LONG datatype tidak dapat dicopy dengan menggunakan cara : "CREATE TABLE AS SELECT" syntax. Tetapi hal ini tetap dapat dilakukan, yaitu dengan SQL*Plus COPY command.

Anda mungkin menjalankan Oracle 10g Release 2, tapi aplikasi yang dijalankan mungkin disupport oleh versi Oracle sebelumnya. Table yang dibuat dengan versi Oracle terdahulu sampai dengan 8i sering menggunakan LONG data type untuk menyimpan data text dalam jumlah besar.

Jika anda ingin melakukan copy table yang menggunakan type data LONG, maka perintah CREATE TABLE AS SELECT tidak akan bekerja; dan akan menampilkan pesan error: ORA-00997: illegal use of LONG datatype.

Anda dapat melakukan export table dan mengimpornya kembali, tetapi itu membutuhkan usaha yang lebih. COPY command di SQL*Plus tetap dapat melakukan copy table dengan satu perintah. Berikut ini adalah format dari COPY command :

COPY FROM user/pw@dblink TO user/pw@dblink CREATE tablename USING select-statement;

Pastikan untuk menggunakan SET LONG terlebih dahulu untuk meng-cover besar data (panjang data) di dalam LONG column dan menghindari pengosongan (truncate) data.

Kekurangannya adalah COPY command sudah dibekukan fungsinya pada Oracle versi 8. Fungsi ini hanya dapat meng-copy table tergantung datatype sebagai berikut : CHAR, DATE, LONG, NUMBER, and VARCHAR2. Beberapa datatype terbaru pada versi 8i dan berikutnya sudah tidak disupport.

Contoh berikut ini menunjukkan CREATE TABLE error dan successful COPY command.

SQL> CREATE TABLE my_views AS
2 SELECT * FROM user_views;
SELECT * FROM user_views
*
ERROR at line 2:
ORA-00997: illegal use of LONG datatype

SQL> SET LONG 100000

SQL> COPY FROM hr/hr@orcl CREATE my_views USING select * from user_views;

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)

Maximum long size is 100000. (long is 100000)

Table MY_VIEWS created.

1 rows selected from hr@orcl.
1 rows inserted into MY_VIEWS.
1 rows committed into MY_VIEWS at DEFAULT HOST connection.


SQL> descmy_views;
Name Null? Type
---------------------- ------------- ----------------
VIEW_NAME NOT NULL VARCHAR2(30)
TEXT_LENGTH NUMBER(38)
TEXT LONG
TYPE_TEXT_LENGTH NUMBER(38)
TYPE_TEXT VARCHAR2(4000)
OID_TEXT_LENGTH NUMBER(38)
OID_TEXT VARCHAR2(4000)
VIEW_TYPE_OWNER VARCHAR2(30)
VIEW_TYPE VARCHAR2(30)
SUPERVIEW_NAME VARCHAR2(30)

5 comments:

Anonymous said...

wuiihh...berat euy posting na.. bingung mo comment apa ya? :)

Jali said...

@osinaga : he he... gak seberat jadi konsultan PPAT ..hehehe

Anonymous said...

Bang Jali,
Saya mohon maaf sebelumnya tidak memperkenalkan diri. Saya Paulus seorang newbie di oracle, Ketika saya mengcopy sebuah tabel dari sebuah database ke database lain, mengapa datatypenya jadi berubah ya?
misal daru Number berubah jadi Number (38)....
Saya lakukan ini dengan copy command di sqlplus.

Terima kasih atas pencerahan yang akan Abang berikan...

Paulus Paska
pauluspaska@gmail.com

Anonymous said...

Bang Jali,
Saya mohon maaf sebelumnya tidak memperkenalkan diri. Saya Paulus seorang newbie di oracle, Ketika saya mengcopy sebuah tabel dari sebuah database ke database lain, mengapa datatypenya jadi berubah ya?
misal daru Number berubah jadi Number (38)....
Saya lakukan ini dengan copy command di sqlplus.

Terima kasih atas pencerahan yang akan Abang berikan...

Paulus Paska
pauluspaska@gmail.com

Jali said...

Halo Mas Paulus,
boleh tahu itu copy dari database apa ke database apa ? and boleh tahu command yang digunakan gak ? tks