• Tidak ada hasil yang ditemukan

1. Mengetahui dan mengerti CURSOR 2. Mampu mengimplementasikan CURSOR dalam pemrograman di Oracle

N/A
N/A
Protected

Academic year: 2021

Membagikan "1. Mengetahui dan mengerti CURSOR 2. Mampu mengimplementasikan CURSOR dalam pemrograman di Oracle"

Copied!
8
0
0

Teks penuh

(1)

Praktikum

3

CURSOR

Tujuan :

1. Mengetahui dan mengerti CURSOR

2. Mampu mengimplementasikan CURSOR dalam pemrograman di Oracle

Alat dan Bahan :

1. Buku literatur mengenai PL/SQL ORACLE, terutama yang menggunakan DBMS ORACLE 10g. 2. Modul praktikum BASIS DATA LANJUT

3. Modul praktikum DATA MINING DAN WAREHOUSING

Landasan Teori : 1. Pendahuluan

Blok PL/SQL tidak memungkinkan untuk menangani query dengan keluaran lebih dari satu baris(record) karena variabel penampungnya harus mempunyai sebuah nilai. Karena itu, diperlukan sebuah cursor untuk menampung semua kondisi dari keluaran sebuah query. Cursor merupakan suatu variabel yang digunakan untuk menampung hasil query yang terdiri atas lebih dari satu row atau record. Cursor dapat diilustrasikan sebagai penampung sekaligus pointer atas hasil eksekusi query. Pada dasarnya perintah “SELECT ..” pada PL/SQL merupakan sebuah cursor. Terdapat dua macam cursor, yaitu: cursor implisit dan cursor eksplisit

2. Cursor Implisit

Merupakan perintah SELECT statement dengan klausa INTO yang terdapat di dalam blok PL/SQL dan harus menghasilkan satu baris record. Jika hasil cursor implisit ini lebih dari satu baris atau tidak menghasilkan satu baris pun, maka Oracle akan mengeluarkan pesan kesalahan. Klausa into pada cursor implisit dipakai untuk menugaskan nilai hasil proses select ke dalam variabel-variabel yang dipilih.

Atribut Keterangan

SQL%FOUND TRUE jika cursor menghasilkan sebuah baris dari

queri yang dideklarasikan. Sebaliknya FALSE.

SQL%NOTFOUND Kebalikan dari %FOUND

SQL%ROWCOUNT Jumlah baris yang telah diambil/ditangkap (FETCH)

SQL%ISOPEN Mengembalikan nilai TRUE jika cursor masih dalam

keadaan terbuka (OPEN) Contoh: DECLARE mhs_rec mahasiswa%ROWTYPE; nim_nya mahasiswa.nim%TYPE; BEGIN nim_nya := '30108001';

SELECT nim, nama, alamat INTO mhs_rec FROM nahasiswa WHERE nim = nim_nya;

(2)

Jika nilai nim sama dengan 30108001 dipenuhi maka hasil proses select menghasilkan satu baris, sedangkan jika nilai nim_nya diganti dengan nilai lain dimana nilai tersebut tidak akan menghasilkan satu baris pun, maka Oracle akan mengeluarkan pesan kesalahan. Demikian pula jika klausa where pada cursor di atas dihilangkan sementara di dalam tabel proyek terdapat lebih dari satu baris, maka cursor tersebut tidak dapat menampung semua baris yang diterima. Hal ini akan menimbulkan error “exact fetch returns more than requested number of rows”.0020

IMPLICIT CURSOR CONTOH 1.

IMPLICIT CURSOR CONTOH 2

DECLARE

vnim mahasiswa.nim%TYPE:='&nim_mhs';

vnama mahasiswa.nama%TYPE;

BEGIN

SELECT nim,nama INTO vnim,vnama FROM mahasiswa WHERE nim=vnim;

DBMS_OUTPUT.PUT_LINE('Nim : '||vnim);

DBMS_OUTPUT.PUT_LINE('Nama mahasiswa : '||vnama); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada mahasiswa dengan nim : '||vnim);

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE('Data yang dihasilkan lebih dari 1 baris'); END; / DECLARE vnim mahasiswa.nim%TYPE:='&nim_mhs'; vnama mahasiswa.nama%TYPE; n number; BEGIN

SELECT nim,nama INTO vnim,vnama FROM mahasiswa WHERE

nim=vnim;

n := SQL%ROWCOUNT;

DBMS_OUTPUT.PUT_LINE('Data Mahasiswa');

IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('Nim : '||vnim); DBMS_OUTPUT.PUT_LINE('Nama : '||vnama);

DBMS_OUTPUT.PUT_LINE('Jumlah data : '||n);

END IF; EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada mahasiswa dengan nim: '||vnim);

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE('Data yang dihasilkan lebih dari 1 baris');

END; /

(3)

IMPLICIT CURSOR CONTOH 3.

3. Cursor Eksplisit

Tidak seperti cursor implisit, cursor eksplisit harus dideklarasikan terlebih dahulu sebelum digunakan. Terdapat empat tahapan penggunaan cursor eksplisit ini yaitu: declare, open, fetch dan terakhir adalah close.

a. Statement declare:

Merupakan deklarasi nama cursor dan definisi struktur query yang akan dilakukan di dalamnya.

Contoh:

b. Statement open

Sebelum suatu cursor dapat digunakan, cursor harus dibuka terlebih dahulu. Contoh:

c. Statement fetch

Fetch merupakan perintah untuk mengambil isi cursor, dimana isi dari cursor tersebut adalah hasil query yang telah dideklarasikan pada statement deklarasi cursor. Dan tiap-tiap field hasil query tersebut kemudian ditampung dalam variable-variable yang tipe datanya sesuai dengan tipe-tipe kolom query pada statemen deklarasi. Fetch ini dilakukan untuk tiap-tiap baris.

Contoh: DECLARE

vnama mahasiswa.nama%TYPE:='&nama_mhs';

-- masukkan paijo misal ada 2 mahasiswa dengan nama depan paijo

n number; BEGIN

UPDATE mahasiswa SET alamat='SKB' WHERE nama LIKE vnama||'%';

n := SQL%ROWCOUNT; IF SQL%FOUND THEN

DBMS_OUTPUT.PUT_LINE('Mahasiswa dengan nama depan '||vnama||' telah di update');

DBMS_OUTPUT.PUT_LINE('Jumlah data yang diupdate = '||n);

ELSE

DBMS_OUTPUT.PUT_LINE('Tidak ada mahasiswa dengan nama depan : '||vnama);

DBMS_OUTPUT.PUT_LINE('Jumlah data yang diupdate = '||n); END IF;

EXCEPTION

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE('Data yang dihasilkan lebih dari 1 baris');

END; /

CURSOR nama_cursor IS query

DECLARE

CURSOR CUR1 IS

SELECT nim, nama, alamat FROM mahasiswa

OPEN nama_cursor;

OPEN CUR1;

FETCH nama_cursor INTO <variable1,variable2,..>;

(4)

d. Statement close

Setelah pemrosesan query selesai, cursor harus ditutup dengan satatemen CLOSE ini. Berikut ini adalah atribut-atribut untuk mendapatkan status cursor. Setiap atribut dalam penggunaannya harus didahului dengan nama cursor.

Atribut Keterangan

nama_cursor%FOUND TRUE jika cursor menghasilkan sebuah baris dari query yang dideklarasikan. Sebaiknya FALSE.

nama_cursor%NOTFOUND Kebalikan dari %FOUND

nama_cursor%ROWCOUNT Jumlah baris yang di-fetch atau diambil dari active set. nama_cursor%ISOPEN TRUE jika cursor sedang terbuka dan FALSE jika sebaliknya. Contoh:

e. Cursor FOR LOOP

Ada sebuah cara untuk mengambil isi cursor secara otomatis, yaitu dengan struktur pengulangan FOR LOOP. Disebut otomatis karena :

• Tidak perlu proses pembukaan cursor ( OPEN ) • Memanipulasi proses pengambilan cursor ( FETCH ) • Tidak perlu penutupan cursor ( CLOSE )

• Variabel indeks yang digunakan dalam struktur pengulangan FOR_LOOP tidak perlu dideklarasikan terlebih dahulu

Sintaks: Contoh: CLOSE nama_cursor; DECLARE v_nama varchar2(20); v_nim char(9);

CURSOR cur1 IS SELECT NAMA, NIM FROM MAHASISWA; BEGIN

OPEN cur1;

FETCH cur1 INTO v_nama, v_nim; WHILE cur1%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(v_nama); DBMS_OUTPUT.PUT_LINE(v_nim); FETCH cur1 INTO v_nama, v_nim; END LOOP;

CLOSE CUR1; END;

DECLARE

CURSOR nama_cursor IS ekspresi-query BEGIN

FOR nama_record IN nama_cursor LOOP

-- nama_record tidak perlu dideklarasikan END LOOP

END;

DECLARE

CURSOR cur1 IS SELECT nama FROM mahasiswa; BEGIN

FOR rec IN cur1 LOOP

DBMS_OUTPUT.PUT_LINE(rec.nama); END LOOP

(5)

Nama record yang didefinisikan sesudah for merupakan pendeklarasian yang hanya internal di dalam loop, dan ruang lingkupnya bersifat internal sampai loop berhenti. Sebenarnya di dalam loop for, cursor tidak harus dideklarasikan terlebih dahulu.

EKSPLISIT CURSOR CONTOH 1. (Menggunakan LOOP-EXIT)

EKSPLISIT CURSOR CONTOH 2.(Menggunakan WHILE-LOOP)

DECLARE

vnim mahasiswa.nim%TYPE;

vnama mahasiswa.nama%TYPE;

CURSOR cursor1 IS

SELECT nim,nama FROM mahasiswa; n number;

BEGIN

DBMS_OUTPUT.PUT_LINE('Data Mahasiswa); DBMS_OUTPUT.PUT_LINE('No Nim Nama'); OPEN cursor1;

LOOP

FETCH cursor1 INTO vnim, vnama; EXIT WHEN cursor1%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(cursor1%ROWCOUNT||'.'||vnim||' '||vnama); END LOOP; n := cursor1%ROWCOUNT; DBMS_OUTPUT.PUT_LINE('Jumlah data = '||n); CLOSE cursor1; EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada data mahasiswa'); END; / DECLARE vnim mahasiswa.nim%TYPE; vnama mahasiswa.nama%TYPE; CURSOR cursor1 IS

SELECT nim, nama FROM mahasiswa; n number;

BEGIN

DBMS_OUTPUT.PUT_LINE('Data Mahasiswa); DBMS_OUTPUT.PUT_LINE('No Nim Nama'); OPEN cursor1;

FETCH cursor1 INTO vnim,vnama; WHILE cursor1%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(cursor1%rowcount||'.'||vnim||''|| vnama);

FETCH cursor1 INTO vnim,vnama; END LOOP;

n := cursor1%ROWCOUNT;

DBMS_OUTPUT.PUT_LINE('Jumlah data = '||n); CLOSE cursor1;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada data mahasiswa); END;

(6)

EKSPLISIT CURSOR CONTOH 3.(Menggunakan FOR-IN-LOOP)

EKSPLISIT CURSOR CONTOH 4.

(Menggunakan FOR-IN-LOOP tanpa mendeklarasikan cursor)

Tugas Pendahuluan :

1. Jelaskan perbedaan antara cursor dengan perintah SELECT! 2. Jelaskan maksud dan keluaran dari blok PL/SQL dibawah ini:

DECLARE

CURSOR cursor1 IS

SELECT nim,nama FROM mahasiswa; n number;

BEGIN

DBMS_OUTPUT.PUT_LINE('Data Mahasiswa); DBMS_OUTPUT.PUT_LINE('No Nim Nama');

FOR x IN cursor1 LOOP -- x tidak perlu di deklarasikan DBMS_OUTPUT.PUT_LINE(cursor1%rowcount||'.'||x.nim||' '||x.nama); n := cursor1%ROWCOUNT; END LOOP; DBMS_OUTPUT.PUT_LINE('Jumlah data = '||n); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada data mahasiswa'); END; / DECLARE n number:=0; BEGIN DBMS_OUTPUT.PUT_LINE('Data Mahasiswa);

DBMS_OUTPUT.PUT_LINE('No Nim Nama');

FOR x IN (SELECT nim,nama FROM mahasiswa)

-- x tidak perlu di deklarasikan

LOOP n := n + 1; DBMS_OUTPUT.PUT_LINE(n||'.'||x.nim|| ''||x.nama); END LOOP; DBMS_OUTPUT.PUT_LINE('Jumlah data = '||n); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada data mahasiswa'); END; / DECLARE vid_buku buku.id_buku%TYPE; vjudul buku.judul%TYPE; CURSOR cursor1 IS

SELECT id_buku,judul FROM buku; n number;

BEGIN

DBMS_OUTPUT.PUT_LINE('Data Buku); DBMS_OUTPUT.PUT_LINE(id_buku Judul); OPEN cursor1;

FETCH cursor1 INTO vid_buku,vjudul; WHILE cursor1%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(cursor1%ROWCOUNT||'.'||vid_buku|

|' '||vjudul);

FETCH cursor1 INTO vid_buku,vjudul; END LOOP;

n := cursor1%ROWCOUNT;

DBMS_OUTPUT.PUT_LINE('Jumlah data = '||n); CLOSE cursor1;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Tidak ada data buku); END;

(7)

supplier buku punya no_telp alamat nama id_supplier id_buku judul pengarang stock harga 1 n Percobaan :

1. Buat database baru dengan nama

NPM anda. Buat tabel-tabel seperti

pada ERD seperti berikut lengkap dengan tipe data dan panjang data

yang benar.

Kemudian isikan data-data berikut :

ID SUPPLIER NAMA NO TELP ALAMAT

SP-001 PT. Sidogiri 022-8768509 JL. Ruwet Gg. Buntet No. 34 Bandung SP-002 PT. Moroseneng 021-8695465 JL. Badak Jawa No.6 Jakarta

SP-003 PT. Suka-Suka 031-4568698 JL Darmo No.7 Surabaya SP-004 PT. Sukabaca 022-9797966 JL. Sukabirus No.9 Bandung

ID BUKU ID JENIS ID SUPPLIER

JUDUL PENGARANG HARGA STOCK

BK-001 IT SP-002 10 Langkah Belajar Logika & Algoritma Menggunakan Bahassa C++ Ema Utami Rp. 27.375 10 BK-002 IT SP-001 10 Langkah Mempelajari Lotus Notes 4.5 Jane Calabria Rp. 9.180 34 BK-003 BH SP-004 Kamus Bahasa Inggris Jubilee Enterprise Rp. 15.980 65 BK-004 IT SP-001 101 Tip & Trik

Adobe Photoshop CS

Gregorius Agung

Rp. 16.830 26

BK-005 BI SP-001 101 Tip & Trik Belajar Anatomi Manusia

Gregorius Agung

Rp. 19.380 84

BK-006 IT SP-002 101 Tip & Trik Ms. Access Project 2003 & Sql Server 2000 Hengky Alexander M. Rp. 16.830 36 BK-007 MN SP-002 Konsep-Konsep Marketing Anwar Khaidir Rp. 12.580 26 BK-008 AG SP-004 Renungan Jumat Abdurrahma

Arroisi Rp. 31.280 6 BK-009 UM SP-003 11 Langkah Menjadi Sahabat Ana V. Dwiyani Rp. 19.380 2 BK-010 IT SP-002 12 Kreasi Logo Dengan Adobe Illustrator CS2 Jubilee Enterprise Rp. 27.880 88 BK-011 UM SP-004 13 Cara Praktis Memetik Sukses R. Herry Prasetyo Rp. 16.830 25 Kemudian lakukan EXPORT dan simpan file hasil EXPORT tersebut sehingga dapat di IMPORT kembali dan digunakan pada praktikum berikutnya.

(8)

3. Jalankan blok PL/SQL dibawah ini pada SQL Plus kemudian jika terjadi error perbaiki : DECLARE v_idsupplier supplier.id_supplier%TYPE; v_nama supplier.nama%TYPE; v_no_telepon supplier.no_telepon%TYPE; v_alamat supplier.alamat%TYPE; BEGIN

SELECT id_supplier,nama,no_telepon,alamat INTO

vid_supplier,vnama,vno_telepon,valamat FROM supplier ORDER BY id_supplier;

IF SQL%NOTFOUND THEN

DBMS_OUTPUT.PUT_LINE('Nama Pemesan Tidak Ditemukan'); ELSE

DBMS_OUTPUT.PUT_LINE('Daftar Nama Pemesan yang Total Banquetnya <= 500000 :');

DBMS_OUTPUT.PUT_LINE(v_npm); END IF;

END; /

Referensi

Dokumen terkait

Pada awal disini input yang di pergunakan adalah gambar dari hasil kamera, dari input tersebut di kelola untuk di jadikan gambar grayscale, dimana konversi gambar grayscale

Sinyal CH 1 pada osiloskop menampilkan hasil pengukuran sinyal tegangan pada tahanan 50 kΩ , dimana tegangan pada tahanan ini digunakan untuk mengukur arus maka

Demikian juga untuk Kemandirian anak down syndrome dalam melakukan toilet training, dari hasil uji Mann Whitney diperoleh nilai z = -0,357 dengan nilai p = 0,792 dimana

Hasil pengolahan dengan menggunakan SmartPLS dapat dilihat setelah dikeluarkan dimana nilai loadings dari indikator sikap untuk patuh, norma subyektif, kontrol

memilih salah satu judul film yang berasal dari hasil grabbing tadi, dengan parameter berupa id film kemudian digunakan MyMovieAPI untuk mengambil informasi film dari

Dari sekian penelitian sebelumnya semakin menambah minat untuk mengambil variabel price to book value dan laverage operation terhadap return, selain memiliki hasil

Guru memberikan perintah untuk Mencetak gambar yang menggunakan banyak layer, color, linetype, dan lineweight, serta hasil cetak yang memiliki ketebalan garis yang

Gadget adalah hal yang sangat populer saat ini. Hampir setiap orang menggunakan gadget untuk berbagai keperluan. Salah satu fungsinya adalah berkomunikasi dan mencari informasi dengan cepat. Gadget membutuhkan sebuah program yang berfungsi untuk mengatur berjalannya perangkat tersebut. Menurut Yulikuspartono (2009:29) mengemukakan bahwa “ program merupakan sederetan instruksi atau statement dalam bahasa yang dimengerti oleh komputer yang bersangkutan”. Program merupakan sebuah elemen inti untuk kinerja suatu perangkat. Program inilah yang akan mengolah dan menjalankan perintah yang diberikan oleh user agar dapat di kelola oleh perangkat/device. Program juga dibuat oleh manusia, dan orang yang membuat program ini disebut dengan Programmer. Seorang programmer membuat program dengan menggunakan bahasa pemrograman. Bahasa pemrograman inilah yang disusun dengan berdasarkan logika atau algoritma menusia yang di terjemahkan ke algoritma manusia yang di terjemahkan ke perangkat. Bahasa pemrograman ini dibuat untuk memudahkan manusia dalam membuat suatu aplikasi atau program. Bahasa pemrograman bisa di klasifikasikan dari beberapa sudut pandang. Salah satu pengklasifikasian bahasa pemrograman adalah pendekatan dari notasi bahasa pemrograman tersebut, apakah lebih dekat ke bahasa mesin atau ke bahasa manusia. Dengan cara ini, bahasa pemrograman dapat di kelompokan menjadi dua yakni bahasa tingkat rendah (low level languages) dan bahasa tingkat tinggi (high level language). Bahasa tingkat tinggi adalah bahasa yang mudah dipahami oleh manusia, C++ merupakan salah satu contoh dari bahasa tingkat tinggi. Contoh lain dari bahasa tingkat tinggi ini seperti Pascal, Perl, Java, dan lain-lain sebagainya. Sedangkan bahasa tingkat rendah adalah bahasa mesin atau bahasa assembly. Secara sederhana sebuah komputer hanya dapat mengeksekusi program yang ditulis dalam bentuk bahasa mesin. Oleh karena itu, jika suatu program ditulis dalam bahasa tingkat tinggi maka program tersebut harus diproses terlebih dahulu sebelum bisa dijalankan dengan komputer. Hal ini merupakan salah satu kekurangan bagi bahasa tingkat tinggi dimana diperlukan waktu untuk memproses suatu program sebelum program tersebut di jalankan. Sebagai bahasa yang beraras tinggi, yang menggunakan perintah-perintah yang mudah dimengerti oleh manusia, C++ mempunyai keunggulan yakni bersifat universal. Sebagai bahasa yang universal, C++ bisa dijumpai di berbagai platform (Linux, Unix, Windows, Mac, dan lain-lain). Artinya, jika kita menguasai C++ di platform PC, sangat mudah untuk berpindah di Linux ataupun system operasi yang lain.