Unduh materi bab ini dalam PDF A4. Video disertakan sebagai tautan; contoh dan tabel ikut dalam PDF.
Versi PDF materi pertemuan 09. Contoh dan tabel dapat dibaca di PDF. Kuis dapat dijalankan di halaman web: Buka materi daring.
Ketik kode pada worksheet agar memahami langkah. Pembatasan seleksi/copy merupakan pengaturan antarmuka, bukan perlindungan mutlak. Isian dan referensi tetap dapat digunakan.
Tujuan pembelajaran
Menjelaskan pembagian kerja PL/SQL engine dan SQL engine.
Menulis anonymous block DECLARE, BEGIN, EXCEPTION, END dengan delimiter client yang tepat.
Menggunakan variabel, konstanta, assignment, %TYPE dan %ROWTYPE.
Membaca tepat satu baris melalui SELECT INTO serta membedakan kardinalitas nol dan banyak.
Menampilkan pesan diagnostik DBMS_OUTPUT tanpa menganggapnya commit.
Pokok bahasan / praktikum
Arsitektur PL/SQL engine dan SQL engine
Anonymous block
DECLARE BEGIN EXCEPTION END
Variabel dan konstanta
Assignment :=
%TYPE
%ROWTYPE
DBMS_OUTPUT
SELECT INTO dan kardinalitas
NULL dan scope
Prasyarat: Selesaikan modul 02/03 atau jalankan setup bersama sekali pada schema latihan sendiri. Gunakan Oracle XE lokal melalui SQL Developer ATAU Oracle FreeSQL setelah login pada schema pribadi yang diizinkan; tidak harus memakai keduanya. Jangan menjalankan ulang CREATE TABLE/seed pada objek yang sudah ada. Selesaikan modul SQL sebelumnya; modul 10 juga memerlukan dasar blok modul 09.
Pilih salah satu lingkungan praktikum
Oracle XE: XE lokal dengan SQL Developer: cocok untuk instalasi, koneksi, user/schema, privilege, tablespace serta latihan SQL/PLSQL.
FreeSQL: FreeSQL dengan login: masuk menggunakan akun sendiri dan gunakan schema latihan yang diizinkan untuk SQL/PLSQL. Tidak perlu memasang XE untuk menyelesaikan latihan non-administratif.
Pengumpulan tugas menerima hasil dari salah satu lingkungan. Pastikan objek prasyarat tersedia dan tetap gunakan schema latihan, bukan schema produksi.
Amati → prediksi → jelaskan
Mulai dari pertanyaan
Apa yang dilakukan engine ketika sebuah blok berisi assignment dan SELECT?
Mengapa sebuah SELECT biasa dapat menampilkan banyak baris tetapi SELECT INTO satu variabel tidak?
Apakah pesan berhasil berarti data sudah tersimpan permanen?
Uji pemahaman awal
Pahami konsep · baca terstruktur · terapkan
Teori dan pembahasan
PL/SQL menambahkan variabel, alur prosedural dan penanganan error di atas SQL. Mulailah dari anonymous block yang hanya membaca data.
PL/SQL memperluas SQL dengan deklarasi, langkah prosedural dan penanganan exception.
Pada latihan database ini, client mengirim blok ke Oracle Database. PL/SQL engine menjalankan bagian prosedural seperti assignment, sedangkan pernyataan SQL dikerjakan oleh SQL engine.
Poin pembahasan
Keduanya bekerja bersama; sebuah variabel tidak menjadi kolom tabel dan DBMS_OUTPUT bukan hasil SELECT biasa.
Perpindahan antara kerja prosedural dan SQL mempunyai biaya, sehingga jangan mengubah operasi himpunan sederhana menjadi pengulangan per baris tanpa alasan.
Anonymous block berguna untuk percobaan karena tidak disimpan sebagai objek schema bernama.
Menjalankan blok berikut tidak memerlukan CREATE PROCEDURE; cukup izin sesi dan akses tabel latihan milik sendiri.
02
Struktur anonymous block dan client
DECLARE membuka bagian deklarasi yang opsional.
BEGIN membuka bagian eksekusi yang wajib, EXCEPTION membuka handler opsional, dan END diakhiri titik koma. Setiap assignment atau pemanggilan prosedur juga diakhiri titik koma.
Poin pembahasan
Slash pada baris tersendiri merupakan delimiter client Run Script, bukan operator akhir bahasa PL/SQL.
Dalam SQL Developer gunakan Run Script untuk skrip dengan slash, atau jalankan blok sebagai satu statement sesuai mode editor.
Pada FreeSQL yang sudah login, ikuti pemisahan blok dan dukungan output editornya; jangan mengirim slash sebagai bagian isi blok jika runner memisahkannya sendiri.
Contoh sengaja hanya membaca tabel sehingga tidak membutuhkan keputusan commit.
03
Variabel, konstanta dan assignment
Deklarasikan nama variabel bersama tipe, ukuran jika perlu, dan nilai awal.
Variabel tanpa nilai awal biasanya NULL, sehingga operasi aritmetika terhadapnya dapat tetap NULL. Assignment memakai :=, sedangkan = digunakan untuk perbandingan.
Poin pembahasan
Konstanta diberi kata CONSTANT dan nilai awal; nilainya tidak boleh diubah kemudian.
Contoh menghitung nilai dasar dan diskon sebagai ekspresi sederhana, bukan kebijakan uang produksi.
Gunakan tipe NUMBER berskala untuk nilai uang dan validasi input positif dengan maksimal dua desimal sebelum penyimpanan ketika menerima parameter.
Literal teks memakai tanda petik tunggal.
Oracle memperlakukan string kosong sebagai NULL; gunakan IS NULL jika maksudnya memeriksa ketiadaan nilai, bukan membandingkan = ''.
04
Anchored type dan record
%TYPE mengikuti tipe kolom atau variabel yang dirujuk, sehingga perubahan tipe kolom tidak mengharuskan penulisan ulang tipe variabel secara manual. v_nama pelanggan_demo.nama%TYPE cocok untuk nama pelanggan.
%ROWTYPE membuat record dengan field sesuai satu baris tabel; r_produk produk_demo%ROWTYPE menyediakan id_produk, nama_produk, harga dan stok. Akses field dengan titik, misalnya r_produk.harga.
Poin pembahasan
Anchoring tipe bukan menyalin seluruh aturan bisnis: constraint atau default kolom tidak otomatis menjadi aturan variabel record.
SELECT * INTO record tepat untuk latihan satu baris dengan bentuk tabel yang sesuai; laporan biasa tetap sebaiknya memilih kolom eksplisit.
Gunakan nama berawalan v_ atau r_ agar tidak bertabrakan dengan kolom dalam WHERE.
05
SELECT INTO dan kardinalitas
SELECT INTO biasa harus menghasilkan tepat satu baris, dengan jumlah dan tipe kolom yang sesuai target.
Pencarian primary key produk 11 memenuhi kontrak pada seed. Nol baris memicu NO_DATA_FOUND, sedangkan banyak baris memicu TOO_MANY_ROWS; jangan menganggap hasil pertama dipilih otomatis.
Poin pembahasan
Aggregate COUNT(*) tanpa GROUP BY menghasilkan satu baris bahkan bila tidak ada data cocok, tetapi AVG atau SUM pada himpunan kosong dapat bernilai NULL.
Menambahkan GROUP BY mengubah kembali jumlah baris sehingga harus dianalisis.
Contoh memakai subblok agar setiap percobaan kardinalitas dapat memiliki handler sendiri.
Setelah handler berjalan, eksekusi tidak kembali ke pernyataan yang gagal; ia meninggalkan blok yang menangani exception.
06
DBMS_OUTPUT, scope dan pembuktian
DBMS_OUTPUT.PUT_LINE menaruh teks ke buffer yang perlu dibaca client.
Aktifkan panel DBMS Output untuk koneksi SQL Developer, atau gunakan SET SERVEROUTPUT ON ketika client script mendukungnya. Pada FreeSQL aktifkan tampilan output sesuai editor; SET SERVEROUTPUT adalah perintah client, bukan SQL database universal.
Poin pembahasan
Pesan biasanya tampil setelah blok selesai, bukan sebagai streaming kemajuan transaksi.
Variabel berlaku dalam scope blok tempat dideklarasikan dan tidak tersedia pada blok berikutnya.
Catat SQL serta output aktual saat mencoba; contoh yang disediakan belum merupakan bukti eksekusi pada akun Oracle mahasiswa.
Pesan berhasil juga tidak membuktikan DML telah commit.
Pemilik transaksi tetap harus memilih COMMIT atau ROLLBACK ketika latihan selanjutnya mulai mengubah data.
Alur mencoba anonymous block
1Deklarasikan data
2Baca dengan SELECT INTO
3Lakukan assignment
4Tampilkan DBMS_OUTPUT
5Tangani kondisi yang diharapkan
Gunakan alur ini sebagai panduan saat mengikuti praktikum; bukti hasil tetap berasal dari eksekusi Oracle Anda.
Amati data · ikuti langkah · pahami hasil
Contoh dan tabel pembahasan
Contoh berikut dibaca langsung, tanpa parameter atau tombol simulasi. Nilai adalah prediksi ilustratif dari data acuan, bukan hasil eksekusi pada akun Oracle Anda.
SELECT INTO: satu baris, nol baris dan banyak baris
Gunakan produk seed untuk memahami kontrak SELECT INTO sebelum memproses datanya.
Contoh SQL / PL/SQL
DECLARE
v_nama produk_demo.nama_produk%TYPE;
BEGIN
SELECT nama_produk INTO v_nama
FROM produk_demo WHERE id_produk = 11;
DBMS_OUTPUT.PUT_LINE(v_nama);
END;
/
Kondisi query
Jumlah baris seed
Akibat pada SELECT INTO
id_produk = 11
1
Variabel menerima Kopi
id_produk = 999
0
NO_DATA_FOUND
harga > 10000
3
TOO_MANY_ROWS
Cara membaca contoh
DECLARE menyiapkan v_nama dengan tipe kolom nama_produk.
SELECT ... INTO mengisi variabel jika tepat satu baris ditemukan.
DBMS_OUTPUT hanya menampilkan pesan; output yang terlihat bukan COMMIT.
Yang perlu dipahami: Query banyak baris membutuhkan cara pembacaan yang sesuai, misalnya cursor pada pertemuan11.
Video pembelajaran
Video utama — fokus bab ini
Struktur anonymous block DECLARE–BEGIN–EXCEPTION–END dan DBMS_OUTPUT. Referensi tambahan memperluas variabel, konstanta, SELECT dan %TYPE/%ROWTYPE.
PL/SQL Block Structure | Anonymous Block | How to write Hello World Program in PL/SQL| TechnonTechTV TechnonTechTV · Buka video utama di YouTube
Fokus: Variabel, konstanta, SELECT/DML dalam blok dan %TYPE/%ROWTYPE.
Rentang yang disarankan: 00:29:08–01:42:38; lanjut control structure pada pertemuan10.
Batas cakupan dan panduan menonton: Video utama memakai Oracle11g untuk konsep blok. Pilih bagian fundamental pada referensi panjang, bukan seluruh kursus; langkah editor menyesuaikan XE/FreeSQL.
Video merupakan pendamping, bukan pengganti keseluruhan bab. Pemeriksaan relevansi memakai transkrip yang tersedia, deskripsi pembuat dan bab waktu; bukan klaim seluruh durasi telah ditonton. Versi/editor atau bahasa dapat berbeda. Praktikum tetap mengikuti SQL/PLSQL Oracle pada halaman dan pilihan XE atau FreeSQL login. Jika pemutar dibatasi oleh YouTube, gunakan tautan Buka video.
Praktikum Oracle XE atau FreeSQL
Pilih salah satu lingkungan praktikum
Oracle XE: XE lokal dengan SQL Developer: cocok untuk instalasi, koneksi, user/schema, privilege, tablespace serta latihan SQL/PLSQL.
FreeSQL: FreeSQL dengan login: masuk menggunakan akun sendiri dan gunakan schema latihan yang diizinkan untuk SQL/PLSQL. Tidak perlu memasang XE untuk menyelesaikan latihan non-administratif.
Pengumpulan tugas menerima hasil dari salah satu lingkungan. Pastikan objek prasyarat tersedia dan tetap gunakan schema latihan, bukan schema produksi.
Output contoh adalah prediksi berdasarkan dataset, bukan bukti bahwa kode telah dijalankan pada akun Anda. Periksa koneksi, hak membuat objek, autocommit dan panel DBMS_OUTPUT. Slash pada baris sendiri adalah pemisah mode skrip klien tertentu, bukan statement PL/SQL.
Gunakan tabel pertemuan02 dan data pertemuan03 atau setup index sekali. Periksa keadaan data bila latihan sebelumnya pernah di-commit. Jangan menjalankan ulang CREATE TABLE/INSERT atau menghapus data secara buta.
Langkah 1 — Anonymous block paling sederhana
BEGIN
DBMS_OUTPUT.PUT_LINE('Blok PL/SQL berjalan');
END;
/
Aktifkan output editor. Slash untuk Run Script, bukan bagian bahasa PL/SQL. Tidak membaca atau mengubah tabel.
Langkah 2 — DECLARE, variabel, konstanta dan assignment
c_diskon tetap, sedangkan v_total berubah melalui :=. Format angka output mengikuti pengaturan sesi; verifikasi nilai, bukan bentuk teks lokal tertentu.
Langkah 3 — %TYPE dan SELECT INTO satu pelanggan
DECLARE
v_id pelanggan_demo.id_pelanggan%TYPE := 1;
v_nama pelanggan_demo.nama%TYPE;
v_kota pelanggan_demo.kota%TYPE;
BEGIN
SELECT nama, kota INTO v_nama, v_kota
FROM pelanggan_demo WHERE id_pelanggan = v_id;
DBMS_OUTPUT.PUT_LINE(v_nama || ' / ' || NVL(v_kota, 'Kota belum diisi'));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ID pelanggan tidak ditemukan');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Query melanggar kontrak satu baris');
END;
/
Pada seed membaca Ayu. PK menjamin maksimal satu baris; handler tetap menjelaskan kontrak jika query diubah.
Langkah 4 — %ROWTYPE untuk satu produk
DECLARE
r_produk produk_demo%ROWTYPE;
BEGIN
SELECT * INTO r_produk FROM produk_demo WHERE id_produk = 11;
DBMS_OUTPUT.PUT_LINE(r_produk.nama_produk || ' stok=' || r_produk.stok);
DBMS_OUTPUT.PUT_LINE('Harga=' || r_produk.harga);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Produk tidak ditemukan');
END;
/
Record menampung satu baris produk dan field diakses memakai titik. Constraint tabel tidak otomatis memvalidasi assignment ke field record.
Langkah 5 — DECLARE BEGIN EXCEPTION END: nol dan banyak baris
DECLARE
v_nama pelanggan_demo.nama%TYPE;
BEGIN
BEGIN
SELECT nama INTO v_nama FROM pelanggan_demo WHERE 1 = 0;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Percobaan nol baris: NO_DATA_FOUND');
END;
BEGIN
SELECT nama INTO v_nama FROM pelanggan_demo;
DBMS_OUTPUT.PUT_LINE('Tabel ternyata hanya berisi satu baris');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Tabel kosong');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Percobaan banyak baris: TOO_MANY_ROWS');
END;
DBMS_OUTPUT.PUT_LINE('Blok luar tetap dilanjutkan');
END;
/
WHERE 1=0 selalu menunjukkan kasus nol; seed pelanggan menunjukkan kasus banyak. Subblok terpisah memungkinkan percobaan berikutnya berjalan.
Langkah 6 — Aggregate satu baris dan NULL string kosong
DECLARE
v_banyak NUMBER;
v_teks VARCHAR2(20) := '';
BEGIN
SELECT COUNT(*) INTO v_banyak FROM penjualan_demo WHERE 1 = 0;
DBMS_OUTPUT.PUT_LINE('COUNT kosong = ' || v_banyak);
DBMS_OUTPUT.PUT_LINE('Teks kosong ditampilkan sebagai: ' || NVL(v_teks, 'NULL'));
END;
/
COUNT tanpa GROUP BY tetap satu baris bernilai nol. Oracle menganggap string kosong sebagai NULL; NVL hanya memberi label tampilan.
Tugas / latihan
Pada XE ATAU FreeSQL schema pribadi, buat anonymous block dengan variabel, konstanta dan assignment; lampirkan output aktual dan cara mengaktifkan output.
Gunakan %TYPE untuk mengambil satu pelanggan dan %ROWTYPE untuk satu produk; jelaskan syarat jumlah baris.
Uji SELECT INTO untuk tepat satu, nol dan banyak baris dalam subblok berhandler. Bandingkan dengan COUNT(*) tanpa GROUP BY pada himpunan kosong.
Pertanyaan analisis
Mengapa menyalin %TYPE tidak berarti semua aturan CHECK dan DEFAULT tabel telah menjadi aturan variabel?
Jelaskan jalur client, PL/SQL engine, SQL engine dan buffer DBMS_OUTPUT pada satu blok SELECT INTO.
Pengumpulan
Tugas boleh dikerjakan di Oracle XE lokal atau FreeSQL dengan login; cukup pilih salah satu. Kumpulkan satu laporan melalui LMS/kanal yang ditetapkan dosen. Cantumkan Nama, NPM, pertemuan dan lingkungan yang dipakai. Sertakan kode SQL/PLSQL sebagai teks, output aktual atau pesan error, serta jawaban analisis.
Jika FreeSQL menyediakan tautan berbagi yang dapat diakses dosen, tautan boleh ditambahkan sebagai bukti pendamping, bukan pengganti hasil eksekusi yang terdokumentasi. Jangan membagikan password, token atau koneksi pribadi.
Hasil yang belum dieksekusi diberi label “prediksi”. Screenshot ilustrasi browser bukan bukti praktikum Oracle.
Panduan XE21c digunakan untuk konteks instalasi lokal; dokumentasi SQL/PLSQL untuk konsep bahasa. Versi FreeSQL/editor dapat berbeda, sehingga periksa fitur dan pesan aktual.