Showing posts with label oracle. Show all posts
Showing posts with label oracle. Show all posts

Thursday, December 8, 2011

plsql_native_library_dir

Di Oracle, jika stored procedure kita error dan mengeluarkan warning plsql_native_library_dir minta untuk di set. itu tandanya compiler oracle kita menunjukan interpreted.
supaya kita tidak membuat settingan plsql_native_library_dir ini di isi maka rubahlah compiler ke native.
anda bisa masuk pada settingan semua inisialisasi.
apabila kita ingin tetap interpreted maka rubahlah plsql_native_library_dir dengan mengisi direktori untuk tempat sementara data lalu restart oracle. settingan ini akan tersimpan pada spfile.

Wednesday, December 7, 2011

Oracle Tuning

Oracle tuning, sbg berikut :
1. PLSQL Code Tuning,
2. SQL Tuning (Indexes, Rule based Optimizer, Cost based optimizer,decode, etc),
3. Database Tuning (Design, Indexing, SGA, Storage, etc).

user dan schema di oracle


user dan schema memiliki relasi 1-1, sehingga pembuatan user maka akan otomatis dibuat schemanya. nama user kan memiliki kesamaan dengan nama schemanya.

schema sendiri terdapat tempat untuk table, function, objeck,dll.Pada Oracle DB itu sendiri pemanggilan objeck bisa jadi rancu karena adanya kesamaan nama
mis: t_trans_account milik schema A dan t_trans_account milik schema B

Oleh sebab itu, biasanya pemanggilan objek itu sendiri di awali dengan memanggil schemanya dulu.

mis: A.t_trans_acccount or B.t_trans_account

Materilized View

kalo saya liat konsep MV mirip dengan pivot table artinya kalo kita ingin sekedar ambil data cukup dari situ saja, sehingga beban server lebih ringan dalam pencarian data dan lebih aman
lebih aman ini karena apabila terjadi perubahan maka data asli aman dan tentunya kerahsiaan nama table asli tidak diketahui oleh orang yang tidak bertanggung jawab
Setelah anda membuat (MV), ada 2 buah schema object yg terbentuk:
1. MV itu sendiri (OBJECT_TYPE : MATERILIZED VIEW)
2. Container table, dengan nama yg sama dgn MV-nya (OBJECT_TYPE : TABLE)
Contoh:
Ada table PENJUALAN(tahun, ..., jumlah_penjualan) ,
Sebut saja total datanya ada 100jt records.
Data tahun, antara 2000 dan 2008.
Misal, kalau anda membuat (V) dan (MV), dgn SELECT stmt sbg berikut:
SELECT tahun, SUM(jumlah_penjuala n)
FROM penjualan
GROUP BY tahun;

Kalau anda melakukan SELECT * FROM view_jual;
maka data yg akan dibaca sebanyak 100jt records, langsung dari table
PENJUALAN. Walaupun hasilnya cuma 9 records.

Tapi kalau anda melakukan SELECT * FROM materialized_ view_jual;
maka data yg akan dibaca HANYA 9 records, diambil dari container table
milik Sang MV tsb. Data yg 100jt yg ada di table PENJUALAN tidak dibaca.

type refresh di MV


type refresh di MV
fast refresh -> membutuhkan materialized view log. Kalau table masternya ada perubahan (proses DML), perubahan itu disimpan di materialized view log, digunakan ketika mvnya di refresh. proses ini jauh lebih cepat dibanding refresh ulang semua. cuman ada aturan mainnya.

complete refresh --> query MVnya di execute ulang.

force refresh --> oracle akan coba fast refresh dulu, kalau gagal,
oracle akan coba complete refresh.

kalau on commit/demand, itu hanya opsi kapan mv itu di refresh. on commit refresh berarti setiap table masternya ada commit, mvnya bakal di refresh. kalau on demand, itu terserah kita mau kapan refresh mvnya.

Materilized View


materalized view digunakan untuk mengambil, mempercepat pengambilan data.

materialized view akan mengorbankan space harddisk bedanya dengan view biasa atau dengan mengambil data secara langsung ke table yaitu:
kecepatannya dan juga kemudahan programer untuk mengelola database satu query bisa untuk digunakan di banyak tempat di program dan apabila mau melakukan modifikasi bisa dengan mengubahnya di database.

nilai default pada stored procedure

kita bisa juga membuat default nilai jika deklarasi tidak kita input.

create or replace
procedure give_me_an_array( p_array in num_array, keluar number default 0
)
as
begin
for i in 1 .. p_array.count
loop
dbms_output. put_line( p_array(i) );
Keluar := p_array(i);
end loop;
end;
/

exec give_me_an_array( NUM_ARRAY( 1,2,3));

inti bisa keluarin suatu data dari storedprocedure yaitu pada deklarasi awal yaitu ada tulisan “default” dan juga nilai defaultnya.

keluaran dari suatu procedure


kita bisa juga membuat keluaran dari suatu procedure

create or replace
procedure give_me_an_array( p_array in num_array, keluar number out
)
as
begin
for i in 1 .. p_array.count
loop
dbms_output. put_line( p_array(i) );
Keluar := p_array(i);
end loop;
end;
/

exec give_me_an_array( NUM_ARRAY( 1,2,3));

inti bisa keluarin suatu data dari storedprocedure yaitu pada deklarasi awal yaitu ada tulisan “out”

test array

create or replace type NUM_ARRAY as table of number;

create or replace
procedure give_me_an_array( p_array in num_array
)
as
begin
for i in 1 .. p_array.count
loop
dbms_output. put_line( p_array(i) );
end loop;
end;
/

Pemasukan data sebagai Array


Pada Stored procedure di Oracle kita bisa memasukkan data sebagai array. Data ini kenapa perlu dimasukkan dengan cara Array yaitu sebagai kemudahan, kerapihan dalam pengolahan data pada oracle.

Ada 4 tahap:
1. Kita harus membuat type data sebagai Array
2. kita deklarasikan array itu sebagai masukkan pada storedprocedure
3. compile storedprocedure
4. test stored procedure itu

Kita belum mengetahui berapa besar array yang dapat dimasukkan dalam satu kali masukkan

ROW MOVEMENT


Pada saat kita membuat suatu table maka default ROW MOVEMENT ialah DISABLE.

Row Movement ini digunakan jika kita melakukan flashback. Flashback itu diperlukan apabila kita salah melakukan drop dan lain-lain. Sehingga kita perlu menggeser row itu pada fisik database.

Setiap kali kita membuat object atau memasukkan data maka akan diberikan nilai identik yaitu rowid. Row ini akan bisa digeser pada fisik dengan melakukan ENABLE ROW MOVEMENT.

dengan cara sebagai berikut:

ALTER TABLE rowmove_test DISABLE ROW MOVEMENT;

ALTER TABLE rowmove_test ENABLE ROW MOVEMENT;

Cursor Oracle


cursor bisa dibuat pada Procedure
pembuatan cursor yaitu dengan cara :
DECLARE CURSOR Nama IS Select id, nama FROM T_mst_karyawan
setelah di declare, kita bisa mengambil datanya dengan cara:
DECLARE CURSOR Nama IS Select id, nama FROM T_mst_karyawan;
begin
open Nama;
loop
FETCH Nama Into IDV,NAMAV;
exit when Nama%NOTFOUND;
end loop

catatan:
cursor memakan memory lebih banyak dibanding pengambilan langsung tapi juga mempermudah untuk pengambilan data yang banyak dan juga lebih dari 1 field.


Pengambilan data dengan mengambil baris teratas sebanyak yang dikehendaki


Pada penggunaan sintax sql di oracle ternyata tidak bisa menggunakan top seperti di SQL SERVER

Pada sintax oracle di gunakan rownum
contoh: select total_setelah from t_trans_faktur_jual where rownum<11>

Penggabungan oracle dan java


pada oracle yang digunakan versi 10g ini ternyata sudah terintegrasi java. java disini sebenernya bukan untuk aplikasi web tapi hanya untuk membantu untuk pembuatan procedure2x yang rumit misalnya penyandian data2x rahasia, hingga pengolahan data yang cenderung untuk ke security java di oracle bisa kita compile dulu atau langsung.

kalau langsung kita bisa langsung menuliskannya di sqlplus dan nantinya oracle akan mengcompile ulang jika ada perintah untuk menjalankan script itu kalau kita compile diluar oracle maka versi java harus compatible dengan java oracle dan cukup meregistrasikan classnya ke oracle dan memindahkan class itu ke dalam directory oracle yang direkomendasikan.

Thursday, November 3, 2011

Pencarian dan Pembandingan Type Data Colom

Saat Kita membuat sebuah query adakalanya kita menjoinkan atau merelasikan beberapa table. Lalu saat kita merelasikan tabel - tabel itu ternyata data tidak kunjung muncul, padahal seharusnya data itu muncul.

Oleh sebab itu kita lihat atau amati type data yang digunakan oleh masing-masing tabel itu dan juga panjangnya. Jika terjadi perbedaan maka akan membutuhkan bantuan seperti halnya TRIM dan UPPER.

Contoh:
Select * From T_MST_BARANG A INNER JOIN T_MST_BARANG_WARNA B ON A.KODE_WARNA = B.KODE_WARNA

Ternyata tidak muncul dikarenakan di T_MST_BARANG CHAR(10) Sedangkan T_MST_BARANG_WARNA VARCHAR2(10)

Akhirnya kita menggunakan TRIM :
Select * From T_MST_BARANG A INNER JOIN T_MST_BARANG_WARNA B ON TRIM(A.KODE_WARNA) = TRIM(B.KODE_WARNA)

Data akan muncul hanya saja penggunaan TRIM akan memakan resources. Akan sangat terasa jika Database sudah di akses oleh banyak user dan juga data yang cukup besar.

Maka solusinya kita harus merubah strukture tabel.
Kita rubah T_MST_BARANG CHAR(10) menjadi T_MST_BARANG VARCHAR2(10) lalu kita update
datanya karena type data CHAR yang tidak diisi oleh data akan membuat data memiliki space kosong sebagai bagian dari data.

Contoh:
kode_warna = 'xxx'
saat masuk ke dalam CHAR(10) maka akan menjadi 'xxx '
nah rugi space kan maka dari itu kita update datanya

UPDATE T_MST_BARANG
KODE_WARNA = TRIM(KODE_WARNA);

Script untuk melihat semua colom yang ada di database:
SELECT TABLE_NAME, CHAR_LENGTH, DATA_TYPE, COLUMN_NAME FROM ALL_TAB_COLUMNS;

Kalau kita ingin membandingkan colom yang memiliki arti sama tapi type datanya berbeda contoh:

SELECT TABLE_NAME, CHAR_LENGTH, DATA_TYPE, COLUMN_NAME FROM ALL_TAB_COLUMNS
where owner = 'DISTRIBUSI'
AND SUBSTR(TABLE_NAME,1,1) = 'T'
AND COLUMN_NAME LIKE '%KETERANGAN%';

Sekian dulu semoga bermanfaat
Terima Kasih.

Password User

Untuk bisa melihat password user gunakan:
select * from dba_users

Hanya masalahnya password user di encrypt.

Di dba_users ini juga kita bisa lihat status user tersebut.

semoga Bermanfaat

Ranking atau Penomoran

Saat Kita membuat query dan menjalankan query itu maka data yang muncul kita tidak tahu data itu baris keberapa.

Saat pembuatan report juga, query yang kita buat tidak ada block penomoran sehingga kita biasanya menggunakan penomoran dari tools yang kita gunakan.

Sekarang kita buat penomoran dari query.
Ada beberapa fungsi yang bisa digunakan yaitu RANK, DENSE_RANK, ROW_NUMBER

CONTOH:
select rank() over (order by rownum asc) from dual
select dense_rank() over (order by rownum asc) from dual
select row_number() over (order by rownum asc) from dual

untuk contoh yang lebih kompleks:
select row_number() over (order by kode_barang asc), kode_barang from T_MST_BARANG

dan ini contoh yang menggunakan partition:
select dense_rank() over (partition by b order by a) dr,
rank() over (partition by b order by a) rk,
row_number() over (partition by b order by a) rn,
a,b
from table;

Semoga Bermanfaat.
terima kasih.

Wednesday, August 13, 2008

Cek Waktu Eksekusi Syntax SQL


Untuk melakukan pengecekkan berapa lama waktu efektif sebuah query dijalankan maka bisa dilakukan dengan cara:

set timing on;

bisa dilakukan pada isqlplus atau pun di command sqlplus. Setelah kita melakukan pengesetan timing lalu jalankan perintah-perintah untuk exsekusi query dan nantinya akan diperlihatkan waktu pengerjaan di bagian akhir.

COMMIT


Kalau kita melakukan pekerjaan yang ada hubungannya dengan DDL atau sebgian DML seperti insert dan update maka harus selalu diakhiri dengan commit;
COMMIT sebagai tanda bahwa itu akhir dari suatu proses
contoh:
INSERT INTO T_MST_KARYAWAN VALUES('a','b','c'); commit;

atau kita bisa melakukan pengesetan untuk auto commit
set autocommit on;

Penghapusan Tablespace



Tablespace ternyata tidak dapat langsung dihapus, pertama-tama ia akan memunculkan error priveledge dan jika kita telah penuhi priveledgenya maka akan memunculkan eror index.

ternyata penhapusan tablespace ini tidak dapat dilakukan jika ada index pada tablespace itu.