Tipe Data pada Oracle
TIMESTAMP
Tipe data TIMESTAMP merupakan perpanjangan dari tipe data DATE. Tipe data ini
menyimpan tahun, bulan, dan hari tipe data DATE, ditambah nilai-nilai jam, menit, dan detik.
Tipe data ini berguna untuk menyimpan nilai waktu yang tepat. Rumus dari tipe data
TIMESTAMP adalah sebagai berikut:
TIMESTAMP [(fractional_seconds_precision)]
dimana fractional_seconds_precision opsional menentukan jumlah digit yang disimpan Oracle
di bagian pecahan dari field DETIK datetime tersebut. Bila Anda membuat kolom dengan tipe
data ini, nilainya bisa menjadi nomor dalam rentang 0 sampai 9. Dengan nilai default 6.
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH TIME ZONE adalah varian dari TIMESTAMP yang meliputi zona waktu
nama wilayah atau zona waktu aa offset dalam nilainya. Zona waktu offset adalah perbedaan
(dalam jam dan menit) antara waktu setempat dan UTC (Coordinated Universal Time-dahulu
Greenwich Mean Time). Datatype ini berguna untuk mengumpulkan dan mengevaluasi
informasi terkini di seluruh wilayah geografis.
Rumus tipe data TIMESTAMP WITH TIME ZONE adalah sebagai berikut:
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
dimana fractional_seconds_precision opsional menentukan jumlah digit yang disimpan Oracle
di bagian pecahan dari field DETIK datetime tersebut. Bila Anda membuat kolom dengan tipe
data ini, nilainya bisa menjadi nomor dalam rentang 0 sampai 9. Dengan nilai default 6.
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE adalah varian lain dari TIMESTAMP yang meliputi
zona waktu yang disajikan pada nilainya. Tipe data ini berbeda dari TIMESTAMP WITH TIME
ZONE dalam hal data yang tersimpan dalam database adalah dinormalisasi dengan zona waktu
database, dan zona waktu offset tidak disimpan sebagai bagian dari kolom data. Bila pengguna
mengambil data tersebut, Oracle kembali dalam zona waktu lokal pengguna sesi. Zona waktu
offset adalah perbedaan (dalam jam dan menit) antara waktu setempat dan UTC (Coordinated
Universal Time-dahulu Greenwich Mean Time). Tipe data ini berguna untuk menampilkan
informasi terkini dalam zona waktu dari sistem klien dalam aplikasi dua-tier.
Rumus tipe data TIMESTAMP WITH LOCAL TIME ZONE adalah sebagai berikut:
TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE
dimana fractional_seconds_precision opsional menentukan jumlah digit yang disimpan Oracle
di bagian pecahan dari field DETIK datetime tersebut. Bila Anda membuat kolom dengan tipe
data ini, nilainya bisa menjadi nomor dalam rentang 0 sampai 9. Dengan nilai default 6.
INTERVAL YEAR TO MONTH
INTERVAL YEAR TO MONTH menyimpan periode waktu menggunakan field datetime YEAR
dan MONTH. Tipe data ini berguna untuk mewakili perbedaan antara dua nilai datetime ketika
hanya nilai tahun dan bulan yang signifikan.
Rumus INTERVAL YEAR TO MONTH adalah sebagai berikut:
INTERVAL YEAR [(year_precision)] TO MONTH
dimana year_precision adalah jumlah digit pada field datetime YEAR. Nilai default dari
year_precision adalah 2.
INTERVAL DAY TO SECOND
INTERVAL DAY TO SECOND menyimpan periode waktu dalam hari, jam, menit, dan detik.
Tipe data ini berguna untuk mewakili perbedaan yang tepat antara dua nilai datetime.
Rumus tipe data ini adalah sebagai berikut:
INTERVAL DAY[(day_precision)]
TO SECOND [(fractional_seconds_precision)]
dimana
• day_precision adalah jumlah digit pada field datetime DAY. Nilai yang dapat diterima
adalah 0 sampai 9. Dengan nilai default 2.
• fractional_seconds_precision adalah jumlah digit di bagian pecahan dari bidang
datetime DETIK. Nilai yang dapat diterima adalah 0 sampai 9. Dengan nilai default 6.
Datetime aritmatika / Interval
Anda dapat melakukan sejumlah operasi aritmatika pada tipe data tanggal (DATE), timestamp
(TIMESTAMP, TIMESTAMP WITH TIME ZONE, dan TIMESTAMP WITH LOCAL TIME
ZONE) dan data interval(INTERVAL YEAR TO MONTH dan INTERVAL DAY TO
SECOND). Oracle menghitung hasilnya berdasarkan aturan berikut:
• Anda dapat menggunakan konstanta NUMBER dalam operasi aritmatika pada nilainilai
tanggal dan timestamp, tapi tidak nilai-nilai interval. Oracle secara internal
mengkonversi nilai timestamp untuk tanggal dan menafsirkan nilai-nilai konstanta
NUMBER dalam datetime aritmatika dan ekspresi interval sebagai jumlah hari. Sebagai
contoh, SYSDATE + 1 adalah besok. SYSDATE - 7 adalah satu minggu yang lalu.
SYSDATE + (10/1440) adalah sepuluh menit dari sekarang. Mengurangkan SYSDATE
dengan kolom hire_date karyawan dari tabel test akan menghasilkan jumlah hari sejak
masing-masing karyawan dipekerjakan. Anda tidak dapat mengalikan atau membagi
nilai tanggal atau timestamp.
• Oracle secara implisit mengubah operan BINARY_FLOAT dan BINARY_DOUBLE ke
NUMBER.
• Setiap nilai DATE mengandung komponen waktu, dan hasil dari operasi manipulasi
tanggal termasuk fraksi didalamnya. Fraksi berarti sebagian dari satu hari. Misalnya, 1,5
hari adalah 36 jam. Fraksi ini juga dikembalikan oleh fungsi Oracle built-in untuk
operasi umum pada data DATE. Sebagai contoh, fungsi MONTHS_BETWEEN
mengembalikan jumlah bulan antara dua tanggal. Bagian pecahan dari hasil yang
merupakan bagian dari satu bulan yang terdiri dari 31 hari.
• Jika salah satu operan adalah nilai DATE atau nilai numerik, baik yang mengandung
zona waktu atau pecahan komponen detik, maka:
o Oracle secara implisit akan mengubah operan lain untuk data DATE.
Pengecualian adalah perkalian dari nilai numerik interval, yang akan memiliki
nilai kembali berupa interval.
o Jika operan lain memiliki nilai zona waktu, maka Oracle menggunakan zona
waktu sesi pada nilai kembali.
o Jika operan lain memiliki nilai pecahan detik, maka nilai pecahan detik
dihilangkan.
• Bila Anda lulus timestamp, interval, atau nilai numerik untuk built-in fungsi yang
dirancang hanya untuk datatype DATE, Oracle secara implisit mengkonversi nilai nonDATE
ke nilai DATE.
• Ketika perhitungan interval mengembalikan nilai datetime, hasilnya harus nilai datetime
aktual atau database akan menampilkan pesan error. Sebagai contoh, berikutnya dua
statement yang akan menghasilkan pesan error:
SELECT TO_DATE ('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL ('0 -1') FROM
DUAL;
SELECT TO_DATE ('29-FEB-2004',' DD-MON-YYYY') + TO_YMINTERVAL ('1 - 0') FROM
DUAL;
Statement pertama akan gagal karena menambahkan satu bulan ke bulan 31 hari
akan menghasilkan 31 September yang bukan merupakan tanggal yang valid. Statement
kedua gagal karena menambah satu tahun ke tanggal yang hanya ada setiap empat tahun
sehingga dianggap tidak valid. Namun, statement berikutnya berhasil, karena
menambahkan empat tahun ke tanggal 29 Februari sehingga dianggap valid:
SELECT TO_DATE ('29-FEB-2004 ',' DD-MON-YYYY ') + TO_YMINTERVAL (-0 '4') FROM
DUAL;
TO_DATE ('
---------
29-FEB-08
• Oracle melakukan semua aritmatika timestamp dalam waktu UTC. Untuk TIMESTAMP
WITH LOCAL TIME ZONE, Oracle mengkonversi nilai datetime dari zona waktu
UTC dan database untuk mengubah kembali ke zona waktu database setelah melakukan
aritmetik. Untuk TIMESTAMP WITH TIME ZONE, nilai datetime selalu di UTC,
sehingga konversi tidak diperlukan.
Tipe data Large Object (LOB)
Tipe-tipe data built-in LOB seperti BLOB, CLOB, dan NCLOB (disimpan secara internal) dan
BFILE (disimpan secara eksternal) dapat menyimpan data yang besar dan tidak terstruktur
seperti teks, gambar, video, dan data spasial. Ukuran BLOB, CLOB, dan data NCLOB bisa
sampai (232-1 bytes) * (nilai parameter chunk pada media penyimpanan LOB). Jika tablespace
dalam database Anda adalah dari ukuran blok standar, dan jika Anda telah menggunakan nilai
default parameter chunk penyimpanan LOB saat membuat kolom LOB, maka ini setara dengan
(232-1 bytes) * (database block size) . Ukuran data BFILE dapat mencapai 264-1 byte, meskipun
sistem operasi Anda dapat mengenakan pembatasan maksimum.
Ketika membuat sebuah tabel, anda dapat menentukan tablespace yang berbeda dan
karakteristik penyimpanan untuk kolom LOB atau atribut objek LOB dari yang ditentukan
untuk tabel.
CLOB, NCLOB, dan nilai-nilai BLOB sampai dengan kira-kira 4000 byte disimpan inline jika
Anda mengaktifkan storage pada baris pada saat kolom LOB dibuat. Sedangkan apabila data
LOB lebih besar dari 4000 byte maka akan disimpan eksternal.
Kolom LOB mengandung LOB locator yang dapat mengacu pada nilai-nilai LOB internal
(dalam database) atau eksternal (di luar database). Memilih LOB dari tabel akan
mengembalikan LOB locator dan bukan nilai LOB keseluruhan. Operasi paket DBMS_LOB
dan Oracle Call Interface (OCI) di LOB dilakukan melalui locator.
LOB mirip dengan tipe LONG RAW dan LONG, namun berbeda dalam hal-hal berikut:
• LOB bisa menjadi atribut dari suatu tipe objek (datatype user-defined).
• LOB locator disimpan dalam kolom tabel, baik dengan atau tanpa nilai LOB
sebenarnya. BLOB, NCLOB, dan nilai-nilai CLOB dapat disimpan dalam tablespace
terpisah. BFILE data disimpan dalam file eksternal pada server.
• Bila Anda mengakses kolom LOB, locator dikembalikan.
• Sebuah LOB bisa berukuran sampai (232-1 bytes) * (database block size). Data BFILE
bisa berukuran sampai 264-1 byte, meskipun sistem operasi Anda dapat mengenakan
pembatasan maksimum.
• Anda dapat menentukan lebih dari satu kolom LOB dalam sebuah tabel.
• Dengan pengecualian NCLOB, Anda dapat menentukan satu atau lebih atribut LOB
dalam suatu objek.
• Anda dapat mendeklarasikan variabel mengikat (bind variables) LOB.
• Anda dapat memilih kolom LOB dan atribut LOB.
• Anda dapat menyisipkan baris baru atau memperbarui suatu baris yang sudah ada yang
berisi satu atau lebih kolom LOB atau objek dengan satu atau lebih atribut LOB. Dalam
operasi update, anda dapat mengatur nilai LOB internal untuk NULL, kosong, atau
mengganti seluruh LOB dengan data. Anda dapat mengatur BFILE ke NULL atau
membuat agar menunjuk ke sebuah file yang berbeda.
• Anda dapat memperbarui simpang (interception) baris-kolom LOB atau atribut LOB
dengan simpangan baris-kolom LOB atau atribut LOB yang lain.
• Anda dapat menghapus sebuah baris yang berisi kolom LOB atau atribut LOB dan
dengan demikian juga menghapus nilai LOB. Untuk BFILEs, file sistem operasi yang
sebenarnya tidak dihapus.
Anda dapat mengakses dan mengisi baris dari kolom LOB inline (kolom LOB disimpan dalam
database) atau atribut LOB (atribut dari sebuah kolom tipe objek yang disimpan dalam
database) hanya dengan mengeluarkan pernyataan INSERT atau UPDATE.
BFILE
Tipe data BFILE memungkinkan akses ke file LOB biner yang disimpan dalam sistem file di
luar Oracle Database. Sebuah kolom atau atribut BFILE disimpan dalam locator BFILE, yang
berfungsi sebagai pointer ke file biner pada sistem file server. Locator mempertahankan nama
direktori dan nama file.
Anda dapat mengubah nama file dan path dari BFILE tanpa mempengaruhi tabel base dengan
menggunakan fungsi BFILENAME. Binary file LOB tidak berpartisipasi dalam transaksi dan
tidak dapat direcovery (dipulihkan). Sebaliknya, sistem operasi yang mendasarinya
menyediakan integritas file dan daya tahan. Data BFILE bisa sampai 264-1 byte, meskipun
sistem operasi Anda dapat mengenakan pembatasan maksimum.
Database administrator harus memastikan bahwa file eksternal ada dan bahwa sistem Oracle
proses memiliki izin operasi read pada file tersebut.
Tipe data BFILE memungkinkan dukungan read-only file biner yang berukuran besar. Anda
tidak dapat mengubah atau mereplikasi file tersebut. Oracle menyediakan API untuk mengakses data file. Interface utama yang Anda gunakan untuk mengakses file data adalah package
DBMS_LOB dan Oracle Call Interface (OCI).
BLOB
Tipe data BLOB tersusun atas large object biner yang tidak terstruktur. Objek BLOB dapat
dianggap sebagai bitstreams dengan karakter tanpa set semantik. Objek BLOB dapat
menyimpan data biner sampai dengan (4 gigabyte -1) * (nilai parameter CHUNK LOB storage).
Jika tablespace dalam database Anda adalah ukuran blok standar, dan jika Anda telah
menggunakan nilai default parameter chunk LOB storage saat membuat kolom LOB, setara
dengan (4 gigabyte - 1) * (database block size) .
Objek BLOB memiliki dukungan penuh terhadap transaksional. Perubahan yang dilakukan
melalui SQL, package DBMS_LOB, atau Oracle Call Interface (OCI) berpartisipasi penuh
dalam transaksi. Manipulasi nilai BLOB dapat dilakukan dan dibatalkan. Namun, Anda tidak
dapat menyimpan locator BLOB dalam variabel PL / SQL atau OCI dalam satu transaksi dan
kemudian menggunakannya dalam transaksi atau session lain.
CLOB
Tipe data CLOB terdiri atas single-byte dan multibyte data karakter. Keduanya memiliki lebar
tetap dan didukung seting karakter variabel-lebar, selain itu keduanya juga menggunakan
karakter set database. Objek CLOB dapat menyimpan sampai dengan (4 gigabyte -1) * (nilai
parameter CHUNK LOB storage) dari karakter data. Jika tablespace dalam database Anda
memiliki ukuran blok standar, dan jika Anda telah menggunakan nilai default parameter chunk
LOB storage saat membuat kolom LOB, maka ini setara dengan (4 gigabyte - 1) * (database
block size) .
Objek CLOB memiliki dukungan penuh terhadap transaksional. Perubahan yang dilakukan
melalui SQL, package DBMS_LOB, atau Oracle Call Interface (OCI) berpartisipasi penuh
dalam transaksi. Manipulasi nilai CLOB dapat dilakukan dan dibatalkan. Namun, Anda tidak
dapat menyimpan locator CLOB dalam variabel PL / SQL atau OCI dalam satu transaksi dan
kemudian menggunakannya dalam transaksi atau session lain.
NCLOB
Tipe data NCLOB menyimpan data Unicode. Didukung oleh set karakter lebar-tetap dan
variabel-lebar, dan menggunakan karakter nasional yang telah ditetapkan. Objek NCLOB dapat
menyimpan sampai dengan (4 gigabyte -1) * (nilai parameter CHUNK LOB storage) dari data
karakter teks. Jika tablespace dalam database Anda memiliki ukuran blok standar, dan jika Anda
telah menggunakan nilai default parameter chunk LOB storage saat membuat kolom LOB,
maka ini setara dengan (4 gigabyte - 1) * (database block size) .
Objek NCLOB memiliki dukungan penuh terhadap transaksional. Perubahan yang dilakukan
melalui SQL, package DBMS_LOB, atau OCI berpartisipasi penuh dalam transaksi. Manipulasi
nilai NCLOB dapat dilakukan dan dibatalkan. Namun, Anda tidak dapat menyimpan locator
NCLOB dalam variabel PL / SQL atau OCI dalam satu transaksi dan kemudian
menggunakannya dalam transaksi transaksi atau session lain.
Tipe Data Rowid
Tipe data Rowid terdiri dari tipe data ROWID dan tipe data UROWID.
ROWID
Baris-baris dalam tabel yang terorganisir dalam Oracle Database memiliki alamat baris yang
disebut rowids. Anda dapat memeriksa alamat baris rowid oleh query pseudocolumn ROWID.
Nilai dari pseudocolumn ini adalah string yang mewakili alamat dari tiap baris. String ini
memiliki tipe data ROWID. Anda juga dapat membuat tabel dan cluster yang berisi kolom yang
memiliki tipe data ROWID. Oracle Database tidak menjamin bahwa nilai kolom tersebut adalah
rowids yang valid.
Catatan:
Dimulai pada Oracle8, Oracle SQL mengembangkan format rowids untuk mendukung efisiensi
tabel partisi dan indeks serta alamat data blok tablespace- relatif tanpa ambiguitas. Jika Anda
menjalankan Versi 7 dari database dan Anda berniat untuk melakukan upgrade, gunakan
package DBMS_ROWID untuk bermigrasi dalam data Anda ke format rowids extended.
Rowids berisi informasi berikut:
• Data blok dari datafile yang mengandung baris. Panjang string ini tergantung pada
sistem operasi Anda.
• Baris di blok data.
• File database yang berisi baris. Datafile yang pertama memiliki nomor 1. Panjang string
tergantung pada sistem operasi Anda.
• Data jumlah objek, yang merupakan nomor identifikasi ditugaskan untuk setiap segmen
database. Anda dapat mengambil objek data nomor dari view USER_OBJECTS,
DBA_OBJECTS, dan ALL_OBJECTS. Objek yang memiliki segmen yang sama
(clustered tabel di cluster yang sama, misalnya) memiliki nomor objek yang sama.
Rowids disimpan sebagai basis 64 nilai yang dapat berisi karakter AZ, az, 0-9, dan tanda plus
(+) dan garis miring (/). Rowids tidak tersedia secara langsung. Anda dapat menggunakan
package yang disediakan DBMS_ROWID untuk menafsirkan isi rowid. Fungsi package adalah
melakukan ekstrak dan memberikan informasi mengenai empat unsur rowid yang tercantum di
atas.
UROWID
Baris-baris dari beberapa tabel memiliki alamat yang bukan fisik atau permanen yang tidak
digenerate oleh Oracle Database. Misalnya, alamat baris dari tabel-tabel terindeks-terorganisir
disimpan dalam indeks, yang dapat dipindahkan (disimpan di tempat lain). Rowids tabel asing
(seperti tabel DB2 yang diakses melalui gateway) tidak memiliki standar Oracle rowids.
Oracle menggunakan universal rowids (urowids) untuk menyimpan alamat dari tabel terindeksterorganisir
dan asing. Indeks tabel yang terorganisir memiliki urowids logik dan tabel asing
telah urowids asing. Kedua jenis urowid disimpan dalam pseudocolumn ROWID (sebagai
rowids fisik tabel tumpukan-terorganisir).
Oracle menciptakan rowids logis berdasarkan primary key tabel. Rowids logis tidak berubah
selama kunci primer tidak berubah. Pseudocolumn ROWID dari tabel indeks-terorganisir
memiliki tipe data UROWID. Anda dapat mengakses pseudocolumn ini seperti yang akan Anda
lakukan pada pseudocolumn ROWID tabel tumpukan-terorganisir (menggunakan statemen
SELECT ... ROWID). Jika Anda ingin menyimpan rowids sebuah tabel indeks-terorganisir,
maka anda dapat menentukan tipe kolom UROWID untuk tabel tersebut dan mengambil nilai
pseudocolumn ROWID ke dalam kolom tersebut.
Suatu jenis data baru di Oracle 11g: SIMPLE_INTEGER
Sebelum ke Oracle 11g, kita telah menggunakan tipe data PLS_INTEGER dalam program PL /
SQL. Dalam 11g, sebuah tipe data baru, SIMPLE_INTEGER, telah diperkenalkan. Ini adalah
sub-jenis tipe data PLS_INTEGER dan memiliki rentang yang sama dengan PLS_INTEGER.
Perbedaan dasar antara keduanya adalah SIMPLE_INTEGER yang selalu NOT NULL. Ketika
nilai dari variabel dinyatakan tidak pernah akan null maka kita dapat mendeklarasikan dengan
tipe data SIMPLE_INTEGER. Perbedaan utamanya adalah bahwa ia pernah memberikan pesan
error overflow seperti induknya, tipe data numerik melainkan tetap menjalankannya tanpa
memberikan pesan error. Ketika kita tidak perlu khawatir memeriksa status null serta
melimpahkan kesalahan, tipe data SIMPLE_INTEGER adalah yang terbaik untuk digunakan.
Perbedaan lainnya adalah bahwa tipe data SIMPLE_INTEGER memberikan peningkatan
kinerja yang besar dibandingkan PLS_INTEGER ketika kode ini disusun dalam mode
'NATIVE', karena operasi aritmatika pada tipe SIMPLE_INTEGER dilakukan langsung di
tingkat hardware. Ketika kode dikompilasi dalam mode 'diartikan' yang merupakan default,
SIMPLE_INTEGER masih lebih baik daripada PLS_INTEGER tetapi tidak begitu signifikan.
Anda dapat mengubah sesi untuk mengkompilasi kode dalam mode 'NATIVE' dengan
menjalankan pernyataan berikut ini dan kemudian kompilasi prosedur yang tersimpan.
SQL> ALTER SESSION SET PLSQL_CODE_TYPE 'NATIVE' =;
Session Altered.
Untuk beralih kembali ke modus standar,
SQL> ALTER SESSION SET PLSQL_CODE_TYPE = 'diartikan';
Session Altered.
Potongan kode Setelah menunjukkan kesalahan ketika variabel SIMPLE_INTEGER diberi nilai
null.
DECLARE
v_col1 SIMPLE_INTEGER: = 1;
BEGIN
v_col1: = NULL;
END;
/
Sejak v_col1 harus selalu bukan null dan kita berusaha untuk memberikan nilai null,
memberikan kesalahan berikut.
PLS-00382: Expression is of wrong type
Bahkan jika kita tidak memberi nilai dalam bagian deklarasi untuk tipe data
SIMPLE_INTEGER, itu menghasilkan menjadi kesalahan berikut:
PLS-00218: a variable declared NOT NULL must have an initialization assignment