Home

Implisit dan Eksplisit
PL/SQL menggunakan dua tipe cursor: implisit dan eksplisit. PL/SQL mendeklarasikan cursor secara implisit untuk seluruh perintah-perintah manipulasi data SQL, termasuk query-query yang hanya menghasilkan satu baris data. Namun, untuk query-query yang menghasilkan lebih dari satu baris data, kita harus mendeklarasikan cursor eksplisit, menggunakan cursor FOR loop, atau menggunakan klausa BULK COLLECT.
Explicit Cursors 
Kumpulan baris-baris data yang dihasilkan oleh query dapat terdiri dari nol, satu, atau banyak baris data, bergantung pada berapa banyak baris-baris data yang sesuai dengan kriteria pencarian yang kita inginkan. Ketika query menghasilkan banyak baris data, kita dapat secara eksplisit mendeklarasikan cursor untuk memproses baris-baris data tersebut. Lebih luas lagi, kita dapat mendeklarasikan cursor di dalam bagian deklaratif dari suatu blok PL/SQL, subprogram, atau package.
Kita menggunakan tiga perintah untuk mengontrol cursor: OPEN, FETCH, dan CLOSE. Pertama, kita menginisialisasi cursor dengan perintah OPEN, yang mana mengidentifikasi result set. Kemudian, kita dapat mengeksekusi FETCH secara berulang-ulang sampai seluruh baris-baris data ditampilkan, atau kita dapat menggunakan klausa BULK COLLECT untuk menampilkan seluruh baris-baris data sekali saja. Ketika baris data terakhir selesai diproses, kita membebaskan cursor dengan perintah CLOSE. Kita dapat memproses beberapa query di secara paralel dengan mendeklarasikan dan membuka beberapa cursor.

Ketika kita mendeklarasikan cursor, kita menamainya dan menghubungkannya dengan query tertentu dengan menggunakan sintaks:
CURSOR cursor_name [(parameter[, parameter]...)]
[RETURN return_type] IS select_statement;
dimana return_type harus merepresentasikan record atau baris data di dalam database table, dan parameter terdiri dari sintaks berikut ini:
cursor_parameter_name [IN] datatype [{:= | DEFAULT} expression]
Sebagai contoh, kita dapat mendeklarasikan cursor-cursor bernama c1 dan c2, seperti berikut ini:
DECLARE
  CURSOR c1 IS
    SELECT empno, ename, job, sal FROM emp
    WHERE sal > 2000;
  CURSOR c2 RETURN dept%ROWTYPE IS
    SELECT * FROM dept WHERE deptno = 10;
Nama cursor merupakan identifier tak terdeklarasi, dan bukan merupakan nama variable PL/SQL. Kita tidak dapat memberikan nilai kepada nama cursor atau menggunakannya di dalam ekspresi. Namun, cursors dan variables mengikuti aturan jangkauan yang sama. Memberikan nama cursor-cursor setelah table-table database diperbolehkan namun tidak direkomendasikan.
Cursor dapat mengambil parameters, yang mana dapat muncul di dalam query terkait dimanapun konstanta dapat muncul. Parameter-parameter formal dari cursor haruslah parameter-parameter IN. Sehingga, mereka tidak dapat mengembalikan nilai ke parameter-parameter aktual. Juka, kita tidak dapat menentukan constraint NOT NULL pada parameter cursor.
Seperti ditunjukkan oleh contoh di bawah ini, kita dapat menginisialisasi parameter-parameter cursor menjadi nilai-nilai default. Dengan demikian, kita dapat melewatka jumlah aktual parameter yang berbeda kepada cursor, menerima atau menimpa nilai-nilai default sesuai keinginan kita. Juga, kita dapat menambahkan nilai parameter-parameter formal tanpa harus mengubah setiap referensi terhadap cursor tersebut.
DECLARE
CURSOR c1 (low INTEGER DEFAULT 0,
high INTEGER DEFAULT 99) IS SELECT ...
Scope dari parameter-parameter cursor adalah lokal bagi cursor tersebut, artinya bahwa mereka dapat direferensi hanya di dalam query yang ditentukan di dalam deklarasi cursor. Nilai-nilai dari parameter-parameter cursor digunakan oleh query terkait ketika cursor dibuka.

Membuka Cursor
Membuka cursor mengeksekusi query dan mengidentifikasi result set, yang terdiri dari seluruh baris-baris data yang sesuai dengan kriteria pencarian dari query. Untuk cursor yang dideklarasikan dengan menggunakan klausa FOR UPDATE, perintah OPEN juka mengunci baris-baris data tersebut. Contoh dari perintah OPEN adalah sebagai berikut:
DECLARE
  CURSOR c1 IS
    SELECT ename, job
    FROM emp
    WHERE sal < 3000;
  ...
BEGIN
  OPEN c1;
  ...
END;
Baris-baris data di dalam result set tidak ditampilkan ketika perintah OPEN dieksekusi. Sebaliknya, perintah FETCH menampilkan baris-baris data.
Melewatkan Parameter-parameter Cursor
Kita menggunakan perintah OPEN untuk melewatkan parameter-parameter kepada cursor. Kecuali kita ingin menerima nilai default, setiap parameter formal di dalam deklarasi cursor harus memiliki parameter aktual yang sesuai di dalam perintah OPEN. Sebagai contoh, deklarasi cursor berikut ini
DECLARE
  emp_name emp.ename%TYPE;
  salary emp.sal%TYPE;
  CURSOR c1 (name VARCHAR2, salary NUMBER) IS
    SELECT ...
beberapa perintah-perintah berikut ini membuka cursor:
OPEN c1(emp_name, 3000);
OPEN c1('ATTLEY', 1500);
OPEN c1(emp_name, salary);
Di dalam contoh terakhir, ketika identifier salary digunakan di dalam deklarasi cursor, ia mengacu kepada parameter formal. Namun, ketika ia digunakan di dalam perintah OPEN, ia mengacu kepada variable PL/SQL. Untuk menghindari kebingungan, gunakan identifier-identifier yang unik.
Parameter-parameter formal yang dideklarasikan dengan nilai default tidak perlu memiliki parameter aktual yang sesuai. Mereka dapat secara sederhana mengasumsikan nilai-nilai default mereka ketika perintah OPEN dieksekusi.
Kita dapat menghubungkan parameter-parameter aktual di dalam perintah OPEN dengan parameter-parameter formal di dalam deklarasi cursor dengan menggunakan notasi posisi atau penamaan. Tipe-tipe data dari setiap parameter aktual dan parameter formal terkaitnya haruslah kompatibel.
 Fetching dengan Cursor
Kecuali kita menggunakan klausa BULK COLLECT (akan kita bicarakan pada bagian berikutnya), perintah FETCH menampilkan baris-baris data di dalam result set sekali pada satu waktu. Setiap fetch menampilkan baris terkini dan kemudian memajukan cursor ke baris berikutnya di dalam result set. Contohnya adalah sebagai berikut:
FETCH c1 INTO my_empno, my_ename, my_deptno;
Untuk setiap nilai kolom yang dihasilkan oleh query yang terkait dengan cursor, harus ada variable yang sesuai, dan bertipe kompatibel di dalam daftar INTO. Khususnya, kita menggunakan perintah FETCH dengan cara berikut:
LOOP
  FETCH c1 INTO my_record;
  EXIT WHEN c1%NOTFOUND;
  -- memproses baris data (record)
END LOOP;
Query dapat mereferensi variable-variable PL/SQL dalam scope-nya. Namun, beberapa variable-variable di dalam query dievaluasi hanya ketika cursor dibuka. Di dalam contoh berikut ini,setiap menampilkan salary dikalikan dengan 2, meskipun factor ditambah setelah setiap fetch:
DECLARE
  my_sal emp.sal%TYPE;
  my_job emp.job%TYPE;
  factor INTEGER := 2;
  CURSOR c1 IS
    SELECT factor*sal
    FROM emp
    WHERE job = my_job;
BEGIN
  ...
  OPEN c1; -- disini faktor sama dengan 2
  LOOP
    FETCH c1 INTO my_sal;
    EXIT WHEN c1%NOTFOUND;
    factor := factor + 1; -- does not affect FETCH
  END LOOP;
END;
Untuk mengubah result set atau nilai-nilai dari variable-variable di dalam query, kita harus menutup dan membuka ulang cursor dengan kumpulan variable-variable input ke nilai-nilai baru mereka.
Namun, kita dapat menggunakan daftar INTO yang berbeda pada fetch-fetch yang terpisah pada cursor yang sama. Setiap fetch menampilkan baris yang lain dan memberikan nilai-nilai kepada variable-variable target, seperti ditunjukkan oleh contoh berikut ini:
DECLARE
  CURSOR c1 IS SELECT ename FROM emp;
  name1 emp.ename%TYPE;
  name2 emp.ename%TYPE;
  name3 emp.ename%TYPE;
BEGIN
  OPEN c1;
  FETCH c1 INTO name1; -- ini mem-fetch baris data pertama
  FETCH c1 INTO name2; -- ini mem-fetch baris data kedua
  FETCH c1 INTO name3; -- ini mem-fetch baris data ketiga  ...
  CLOSE c1;
END;
Jika kita mem-fetch ke belakang baris data terakhir di dalam result set, nilai-nilai dari variable-variable target menjadi tidak menentukan.

Lanjutan prosedural Loop.

Pernyataan LOOP

Pernyataan LOOP berguna untuk melakukan pengulangan. Bentuknya:
[ awal_label : ] LOOP
Statement_list
END LOOP [ akhir_label ]
Daftar pernyataan yang berada antara LOOP dan END LOOP akan terus dieksekusi sampai ada suatu pernyataan untuk keluar pengulangan dieksekusi. Dalam hal ini, pernyataan yang digunakan untuk keluar pengulangan berupa pernyataan LEAVE. Contoh berikut menunjukkan penggunaan LOOP dan LEAVE. 
DELIMITER//
CREATE PROSEDUR tes_loop( )
BEGIN
DECLARE pencacah INT;
SET pencacah = 0;

SELECT CONCAT (‘Nilai awal pencacah : ’ , pencacah);
Ulang : LOOP
SET pencacah = pencacah + 1;
IF pencacah > 10 THEN LEAVE ulang; END IF;
END LOOP ulang;
SELECT CONCAT (‘Nilai akhir pencacah : ’ , pencacah);
END
/
Contoh 1 lain dari loop:
Declare
a number;
i number;

begin
i:=0;
a:=&masukkan_angka;
loop
 i:=i+1;
if(i>=a) then
 exit;
 else if mod(i,2)=0 then
dbms_output.put_line(i);
end if;
end if;
end loop;
end;
/
Contoh2;
declare
a number;
i number;
begin
a:=&masukkan _anggak;
i:=1 ;
while i<a loop
            if mod(i,2)=0 then
            dbms_output.put_line(i);

            end if;
            i:=i+1;
end loop;
end;

/i:=i+1;
Contoh 3:
Declare
a number;
i number;

begin
i:=0;
a:=&masukkan_angka;

loop
 i:=i+1;
if(i>=a) then
 exit;
 else if mod(i,2)=0 then
dbms_output.put_line(i);
end if;
end if;
end loop;
end;
/

DELIMITER;
Pada prosedur tes_loop, variable pecahan dideklarasikan sebagai variable local yang bertipe INT. Mula-mula variable tersebut diiisi dengan 0. Selanjutnya, pernyataan
SELECT CONCAT ( ‘Nilai awal pecahan : ‘, pecahan ) ;
Digunakan untuk menampilkan tulisan ‘Nilai awal pecahan : ‘diikuti dengan isi variable pecahan.
Pernyataan LOOP digunakan untuk mengeksekusi pernyataan-pernyataan yang ada didalamnya secara terus-menerus, sampai ada perintah untuk keluar dari pernyetaan tersebut.
Pernyataan yang ada dalam LOOP yang pertama adalah
SET pecahan = pecahan + 1 ;
Pernyataan tersebut untuk menaikkan isi variable pecahan sebesar 1.
Pernyataan kedua
IF pecahan > 10 THEN LEAVE ulang ; END IF ;
Digunakan untuk LEAVE saat variable pecahan bernilai 11 (yakin ketika kondisi pecahan > 10 bernilai benar). Ketika LEAVE dijalankan, Pengulangan menjadi berakhir. Dengan demikian, pernyataan selanjutnya yang dieksekusi adalah
SELECT CONCAT ( ‘ Nilai akhir pecahan : ‘, pecahan ) ;
Pernyataan REPEAT
Seperti halnya LOOP, pernyataan REAPET juga berguna untuk melakukan pengulangan. Bentuknya:
[awal_label :] REAPET
Daftar pernyataan
UNTIL kondisi_pengulangan
END REAPET [ akhir_label ]
Pada pernyataan ini, bagian daftar_pernyataan akan dieksekusi terus-menerus sampai kondisi_pengulangan benilai benar (TRUE). 
DECLARE pecahan INT DEFAULT 0 ;
Digunakan untuk mendeklarasikan variable local pertama pecahan yang bertipe INT dan diberi nilai awal sebesar 0.
Pernytaan REAPET digunakan untuk menjalankan pernyataan 
SET pecahan = pecahan + 1 ;
Sampai kondisi pecahan > 10 bernilai benar. Kondisi ini tercapai saat pecahan bernilai 11.
Pernyataan WHILE
Pernyataan WHILE juga digunakan untuk melakukan pengulangan terhadap sejumlah pernyataan. Bentuknya adalah:
[ awal_label : ] WHILE kondisi_pengulangan DO
daftar_pernyataan
END WHILE [ akhir_label ]
Berada dengan LOOP atau REAPET, WHILE akan menguji kondisi_pengulangan terlebih dulu.Selama kondisi tersebut bernilai benar, bagian daftar_pernyataan akan dieksekusi secara terus-menerus. Berikut contoh penggunaan pernyataan WHILE.
DELIMITER//
CREATE PROSEDUR tes_while( )
BEGIN
DECLARE pencacah INT;
SET pencacah = 0;
SELECT CONCAT (‘Nilai awal pencacah : ’ , pencacah);
WHILE pencacah < 11 DO
SET pencacah = pencacah + 1;
END WHILE;
SELECT CONCAT (‘Nilai akhir pencacah : ’ , pencacah);
END
/


Prosedural if_then_else

Kontruksi Pengatur Aliran Eksekusi
Untuk keperluan pengaturan aliran eksekusi di dalam prosedur atau fungsi tersimpan, MySQL menyediakan berbagai kontruksi yang terkait dengan pengambilan keputusan dan pengulangan. Implementasinya berupa perintah IF, CASE, LOOP, ITERATE, REPEAT, WHILE, dan LEAVE.
Pernyataan IF
Pernyataan IF berguna untuk melakukan pengambilan keputusan berupa pemilihan eksekusi didasarkan suatu keadaan. Bentuknya:
IF kondisi THEN daftar_pernyataan
[ ELSEIF kondisi THEN daftar_pernyataan ] . . .
[ ELSEIF daftar_pernyataan ]
END IF
Daftar pernyataan yang terletak sesudah THEN dieksekusi hanya kalau kondisi didepan THEN bernilai (TRUE). Bagian ELSEIF digunakan untuk menyeleksi kembali kalau keadaan sebelumnya bernilai salah (FALSE).
Contoh berikut menunjukan prosedur yang akan menampilkan nilai terkevil dari dua buah parameternya.
USE pegawai
DELIMITER //
CREATE PROCEDURE tes_if ( x INT, y INT )
BEGIN
IF x < y THEN
SELECT CONCAT ( ‘ Terkecil : ‘, x ) ;
ELSEIF ;
END
//
DELIMITER ;
Contoh pemanggilan fungsi tes_if ()
Mysql > CALL tes_if ( 10, 22 );
+------------------------------------+
| CONTAC ( ‘ Terkecil : ‘, x ) |
+------------------------------------+
| Terkecil : 10 |
+------------------------------------+
1 row in set ( 0. 00 sec )
Query ok, 0 rows affected ( 0. 00 sec )
Mysql > CALL tes_if (22, 10 ) ;
+------------------------------------+
| CONTAC ( ‘ Terkecil : ‘, y ) |
+------------------------------------+
| Terkecil : 10 |
+------------------------------------+
1 row in set ( 0. 00 sec )
Query ok, 0 rows affected ( 0. 00 sec )
Mysql >
Pernyataan CASE
Pernyataan CASE merupakan alternative lain untuk IF dengan kondisi yang bertingkat. Bentuknya:
CASE case_value
WHEN search_condition THEN statement_list
[ WHEN search_condition THEN statement_list ] . . .
[ else statement_list ]
END CASE
Seleksi akan dilakukan dimulai dari WHEN teratas. Kalau ada yang memenuhi (kondisi bernilai benar / TRUE) maka pernyataan yang terletak sesudah THEN akan dieksekusi dan kemudian menuju ke END CASE. Kalau suatu WHEN diperiksa tidak memenuhi, maka WHEN berikutnya akan diperiksa. Bagian ELSE akan dieksekusi kalau tak ada WHEN yang cocok.
Contoh penggunaan CASE:
DELIMITER //
CREATE PROCEDURE tes_case ( nilai INT )
BEGIN
DECLARE skor CHAR (50) ;
CASE
WHEN nilai > 100 OR nilai < 0 THEN
SET skor = ‘Nilai salah’ ;


WHEN nilai > = 90 THEN
SET skor = ‘skor: A’ ;
WHEN nilai > = 70 THEN
SETskor = ‘skor: B’ ;
WHEN nilai > = 60 THEN
SET skor = ‘skor: C’ ;
WHEN nilai > = 50 THEN
SET skor = ‘skor: D’ ;
ELSE
SET skor = ‘skor: E’ ;
END CASE ;
SELECT skor ;
END
/
Contoh lain dari konstruksi if :
declare
a number(5);

begin
a:=&masukkan_nilai;

if (a<50) then
dbms_output.put_line('gagal');
else if (a=50) then
dbms_output.put_line('ulang lagi');
else if (a>=50) then
dbms_output.put_line('lulus');
else
dbms_output.put_line('lulus');
end if;
end if;
end if;
end;
/

DDL dan DML


CREATE TABLE


Format Pembuatan Table :
CREATE TABLE       Nama_Tabel (
Nama_kolom1      tipe_kolom1,
Nama_kolom2      tipe_kolom2,
Constraint1, Constraint2
);
Format Constraint Primary Key:
CONSTRAINT Nama_Constraint PRIMARY KEY (Nama_Kolom);
Format Constraint Foreign Key:
CONSTRAINT Nama_Constraint FOREIGN KEY (Nama_KolomFK) REFERENCES Nama_Tabel_Induk (Nama_KolomTI);
Contoh 1: Membuat Tabel Anggota dengan primary key pada kolom no_anggota
create table anggota(                   
no_anggota number(6),                   
nama_anggota varchar(50) not null,
alamat_anggota varchar (100),                                                           
constraint pk1 primary key(no_anggota)    

);
NOTE: Pada saat membuat tabel yang memiliki foreign key, pastikan tabel induk sudah dibuat dan tipe 
data kolom induk sama persis dengan tipe data kolom FK, adapun nama kolom boleh berbeda.

Alter Table

Format Menambah Kolom/Constraint Table :
ALTER TABLE         Nama_Tabel         ADD (
Nama_kolom1      tipe_kolom1,
Nama_kolom2      tipe_kolom2,
Constraint1, Constraint2
);
Format Memodifikasi Kolom Table :
ALTER TABLE         Nama_Tabel         MODIFY (
Nama_kolom1      tipe_kolom1,
Nama_kolom2      tipe_kolom2
);

Format Membuang Kolom/Constraint Table :
ALTER TABLE         Nama_Tabel         DROP COLUMN    Nama_Kolom;
Atau
ALTER TABLE         Nama_Table         DROP CONSTRAINT              Nama_Constraint;

Contoh1: Menambah kolom golongan darah dan sebuah foreign key ke tabel x kolom_anu
alter table anggota add(                
golongan_darah char(1),                                                          
constraint c foreign key (golongan_darah) references X(anu)  
);
 Drop Table

Format Penghancuran Table :
DROP TABLE          Nama_Tabel;
Contoh: Menghancurkan tabel anggota berikut seluruh data yang ada di dalamnya
drop table anggota;
 Note: Jika tabel A masih diacu oleh tabel B maka harus menghancurkan dulu tabel B sebelum tabel A.

Insert

Format Menambah Data Jika Semua Kolom Ingin Diisi:
INSERT INTO          Nama_Tabel         VALUES (
Data_kolom1,
Data_kolom2,
Data_kolom3
);
Format Menambah Data Jika Hanya Kolom Tertentu Yang Diisi:
INSERT INTO          Nama_Tabel         (Nama_Kolom1, Nama_Kolom2)
VALUES (
Data_kolom1,
Data_kolom2
);
Contoh1: Menambah data pada tabel anggota (semua kolom diisi sesuai urutan kolom pada tabel)
insert into anggota values(             
101,                
‘Ngatimin van der Woodsen’,
‘Jl. Entah Berantah nomor sekian’
);
Note:
Insert untuk semua kolom memperhatikan urutan kolom sesuai perintah DESC Nama_Tabel
Untuk tipe data selain number penulisan data diapit dengan petik tunggal (‘)
Format Penulisan Date : DD-MON-YYYY (2 digit tanggal, 3 digit awal bulan dalam bhs inggris, 4 digit tahun)

Update

Format Mengubah Data:
UPDATE Nama_Tabel
SET          Nama_Kolom = data_baru
WHERE   syarat_perubahan_data;
Contoh1: Mengubah semua alamat anggota menjadi ‘Sukabirus’
update anggota set alamat_anggota = ‘Sukabirus’;
Contoh2: Mengubah no_anggota 101 menjadi 201
update anggota set no_anggota = 201
 where no_anggota = 101;
Delete
Format Menghapus Data:
DELETE FROM       Nama_Tabel
WHERE                   syarat_perubahan_data;
Contoh1: Menghapus seluruh isi tabel anggota
delete from anggota;
Contoh2: Meghapus data anggota yang nomor anggotanya 101
delete from anggota
where no_anggota = 101;
Note: Jika fasilitas autocommit dimatikan maka penyimpanan terhadap perubahan data (insert, update, delete) akan terjadi setelah dilakukan perintah COMMIT atau DISC. Jika belum melakukan COMMIT ato DISC dan ingin mengembalikan data ke kondisi semula dapat digunakan perintah ROLLBACK.

Simple Queries
Select....From...Where

Format Query Data:
SELECT    daftar_kolom
FROM     daftar_tabel
WHERE   syarat_dan_atau_foreign_key
Fungsi Agregat: MIN(), MAX(), AVG(), SUM(), COUNT()
SELECT                    daftar_kolom_non_fungsi_ag,         fungsi_ag(nama_kolom1), fungsi_ag(nama_kolom2)
FROM                     daftar_tabel
WHERE                  syarat_dan_atau_foreign_key
GROUP BY              daftar_kolom_non_fungsi_ag

(*) Fungsi agregat dapat digunakan sebagai pengganti daftar kolom, digunakan setelah SELECT...
(*) Jika setelah SELECT digunakan fungsi agregat bersama kolom yang lain yang bukan fungsi agregat maka HARUS menggunakan klausa GROUP BY. Perhatikan contoh 3,4,5 dan 6

Contoh1: Menampilkan nama dan alamat anggota yang diawali huruf A dan terdiri dari 5 huruf
select nama_anggota, alamat_anggota
from anggota
where nama_anggota like 'A____';
Contoh2: Menampilkan nama anggota dan judul buku yang diawail huruf W dan terdiri dari MINIMAL 8 huruf
select nama_anggota, judul_buku
from anggota, buku, peminjaman
where anggota.no_anggota = peminjaman.no_anggota
and buku.id_buku = peminjaman.id_buku
and judul_buku like 'W_______%';
Contoh3: Menampilkan total denda yang pernah dibayar oleh Ngatimin (tanpa menampilkan nama Ngatimin)
Select sum(denda) as totaldenda
from peminjaman, anggota
where anggota.no_anggota = peminjaman.no_anggota
and nama_anggota = 'Ngatimin';
Contoh4: Menampilkan jumlah buku yang pernah dipinjam oleh Ngatiyem (tanpa menampilkan nama Ngatiyem)
select count(id_buku) as jmlbuku
from peminjaman, anggota
where anggota.no_anggota = peminjaman.no_anggota
and nama_anggota = 'Ngatiyem';
Contoh5: Menampilkan total denda yang pernah dibayar oleh Ngatimin (dengan menampilkan nama Ngatimin)
Select nama_anggota, sum(denda) as totaldenda
from peminjaman, anggota
where anggota.no_anggota = peminjaman.no_anggota
and nama_anggota = 'Ngatimin'
group by nama_anggota;

 Simple Anonymous PL/SQL
Panduan:
1.       Bagian declare diisi dengan daftar variabel dan tipe datanya masing-masing
2.       Bagian inti program selalu diawali dengan BEGIN dan diakhiri dengan END; serta /
3.       PL/SQL dapat disimpan sebagai file *.sql dan di-run sebagai script dengan perintah @ fullpath, dimana fullpath tidak boleh mengandung spasi
contoh: @ D:\BelajarOracle\Pertemuan3\anu.sql;
4.       Jika blok PL/SQL menmapilkan output ke layar maka setelah login kita harus mengaktifkan screen output dengan cara menjalankan perintah SET SERVEROUTPUT ON setelah login (cukup satu kali tiap login)
5.       Aturan nama variabel: tidak boleh pakai spasi, diawali selain huruf atau mengandung simbol tanda baca

Format Deklarasi Variabel:
Nama_Var             Tipe_data;
atau
Nama_Var             Nama_Tabel.Nama_Kolom%Type;

Format Pembacaan Single Row Data:
SELECT    daftar_kolom
INTO       daftar_variabel
FROM     daftar_tabel
WHERE   syarat;

(*) Format di atas tidak bisa digunakan jika hasil query lebih dari 1 baris, kecuali jika dilengkapi dengan exception

Format Penerimaan Input Dari User:
Nama_Var := &prompt;
atau
Nama_Var := ‘&prompt’;

Note: Prompt bebas namun tidak boleh menggunakan spasi dan simbol selain alfanumerik. Jika Input bertipe selain tipe data number maka &prompt harus diapit petik tunggal (‘)

Contoh1: Menerima input jari-jari dan menampilkan luas serta keliling lingkaran
Declare
jari2         number(5,2);
keliling      number(7,2);
luas          number(7,2);

begin
jari2 := &jari2;
keliling := 2 * 3.14 * jari2;
luas := 3.14 * power(jari2,2);
dbms_output.put_line('Jari-jari lingkaran = '||jari2);
dbms_output.put_line('keliling lingkaran = '||keliling);
dbms_output.put_line('luas lingkaran = '||luas);
end;
/