Sabtu, 21 Mei 2011


PL/SQL


Bagian ini akan memberikan pemahaman dasar PL / SQL. Dokumen ini secara singkat akan membahas konsep-konsep utama di balik
PL / SQL dan memberikan contoh-contoh singkat yang menggambarkan aspek penting dari bahasa. Sebagian besar informasi yang terkandung
dalam bagian ini adalah LANGSUNG diekstrak dari `` PL / SQL Panduan Pengguna dan Referensi''dan kredit semua harus diberikan kepada
ORACLE. Jika Anda memerlukan informasi lebih rinci dibandingkan yang diberikan dalam bagian ini, bacalah buku petunjuk yang dinyatakan di atas.

PL / SQL adalah bahasa prosedural ekstensi Oracle dengan SQL, bahasa database relasional. PL / SQL sepenuhnya terintegrasi
Fitur rekayasa modern software seperti enkapsulasi data, menyembunyikan informasi, overloading, dan pengecualian
penanganan, dan membawa negara-of pemrograman-the-art ke Server ORACLE dan berbagai alat ORACLE.

Sekilas PL / SQL
Dengan PL / SQL, Anda dapat menggunakan pernyataan SQL untuk memanipulasi data ORACLE dan laporan arus-of-kontrol ke proses
data. Selain itu, Anda dapat mendeklarasikan konstanta dan variabel, define subprogram (prosedur dan fungsi), dan perangkap
runtime error. Dengan demikian, PL / SQL menggabungkan kekuatan memanipulasi data SQL dengan kekuatan pemrosesan data
prosedural bahasa.

PL / SQL adalah bahasa blok-terstruktur. Artinya, unit dasar (prosedur, fungsi, dan blok anonim) yang
membuat sebuah PL / SQL program blok logis, yang dapat berisi sejumlah nested sub
​​-blok. Biasanya, masing-masing
blok logis berkaitan dengan suatu masalah atau subproblem harus dipecahkan.

Sebuah blok (atau sub-blok) memungkinkan Anda kelompok deklarasi logika terkait dan pernyataan. Dengan cara itu Anda dapat menempatkan
deklarasi dekat dengan tempat mereka digunakan. Deklarasi yang lokal untuk blok tersebut dan berhenti ada apabila blok
selesai.
        [DECLARE
       -- declarations]
        BEGIN
      -- statements
        [EXCEPTION
      -- handlers]
          END;


FUNDAMENTAL PL / SQL

Leksikal Unit

PL / SQL tidak case-sensitive, jadi huruf tersebut setara dengan huruf besar-kasus yang sesuai, kecuali dalam
string dan karakter literal. Sebuah baris PL / SQL teks berisi kelompok karakter yang dikenal sebagai unit leksikal, yang dapat
diklasifikasikan sebagai berikut:



pembatas (simbol sederhana dan senyawa)

pengidentifikasi, termasuk kata-kata reserved

literal

Komentar

Delimiter adalah simbol sederhana atau senyawa yang memiliki arti khusus untuk PL / SQL. Sebagai contoh, Anda menggunakan pembatas untuk
merupakan operasi aritmatika seperti penambahan dan pengurangan.

Anda menggunakan pengidentifikasi untuk nama PL / SQL objek program dan unit, yang meliputi konstanta, variabel, pengecualian, kursor,
subprogram, dan paket. Beberapa pengenal yang disebut KATA DILINDUNGI, memiliki arti khusus untuk sintaksis
PL / SQL dan sehingga tidak dapat didefinisikan ulang. Untuk fleksibilitas, PL / SQL memungkinkan Anda menyertakan pengenal dalam tanda kutip ganda. Dikutip
pengidentifikasi jarang dibutuhkan, tetapi kadang-kadang mereka bisa berguna.

Sebuah harfiah adalah numerik eksplisit, karakter, string, atau nilai Boolean tidak diwakili oleh identifier.

Dua jenis literal numerik dapat digunakan dalam ekspresi aritmatika: integer dan real.

String literal merupakan urutan nol atau lebih karakter yang diapit oleh tanda kutip tunggal. Semua string literal kecuali null
string (`') milik CHAR tipe. PL / SQL adalah case-sensitive dalam literal string.

Boolean literal adalah nilai-nilai yang telah ditentukan TRUE dan FALSE dan NULL non-nilai (yang merupakan singkatan untuk hilang,
tidak diketahui, atau tidak berlaku nilai). Perlu diingat bahwa tidak Boolean literal string.

PL / SQL compiler mengabaikan komentar tapi sebaiknya Anda tidak. Menambahkan komentar untuk program anda mempromosikan mudah dibaca
dan alat bantu pemahaman. PL / SQL mendukung gaya komentar dua: single-line dan multiline. Single-line komentar mulai
dengan tanda hubung ganda (-) di manapun pada baris dan memperpanjang sampai akhir baris. Multiline komentar dimulai dengan garis miring-
(/*), asterisk akhir dengan (*/), asterisk-garis miring dan garis span bisa banyak. Anda tidak bisa komentar sarang.

Datatypes

Setiap variabel konstan dan memiliki datatype, yang menentukan format penyimpanan, kendala, dan rentang nilai yang valid.
PL / SQL menyediakan berbagai tipe data skalar dan komposit yang telah ditentukan. Tipe skalar tidak memiliki komponen internal. A
jenis komposit memiliki komponen internal yang dapat dimanipulasi secara individual. PL / SQL Datatypes mirip dengan SQL's
Datatypes tetapi beberapa tipe data yang umum dibahas lagi. Untuk informasi lebih lanjut tentang PL / SQL Datatypes lihat
Bab 2 dari `` Panduan PL / SQL Pengguna dan Referensi.''

(NOMOR) Anda menggunakan datatype NOMOR untuk menyimpan nomor titik tetap atau mengambang dari hampir semua ukuran. Anda dapat
menentukan presisi, yang merupakan jumlah digit, dan skala, yang menentukan di mana terjadi pembulatan.

           NOMOR [(presisi, skala)]
Anda tidak dapat menggunakan konstanta atau variabel untuk menentukan presisi dan skala, Anda harus menggunakan literal integer.

(CHAR) Anda menggunakan datatype CHAR untuk menyimpan data tetap-panjang karakter. The datatype CHAR mengambil opsional
parameter yang memungkinkan Anda menentukan panjang maksimum sampai 32767 bytes.


           CHAR [(maximum_length)]
Anda tidak dapat menggunakan sebuah konstanta atau variabel untuk menentukan panjang maksimum, Anda harus menggunakan sebuah integer literal. Jika Anda tidak
menentukan panjang maksimum, standarnya ke 1.

• (VARCHAR2) Anda menggunakan VARCHAR2 datatype untuk menyimpan data variabel-panjang karakter. The VARCHAR2 datatype
mengambil parameter yang diperlukan yang memungkinkan Anda menentukan panjang maksimum sampai 32767 bytes.


           VARCHAR2 (maximum_length)

Anda tidak dapat menggunakan sebuah konstanta atau variabel untuk menentukan panjang maksimum, Anda harus menggunakan sebuah integer literal.

(boolean) Anda menggunakan datatype Boolean untuk menyimpan nilai-nilai TRUE dan FALSE dan NULL non-nilai.
Ingat bahwa NULL berdiri untuk nilai yang hilang, tidak diketahui, atau tidak berlaku. The boolean datatype tidak mengambil parameter.

(TANGGAL) Anda menggunakan datatype DATE untuk menyimpan nilai-nilai tetap-panjang tanggal. The datatype TANGGAL tidak mengambil parameter. Berlaku
tanggal untuk variabel DATE termasuk tanggal 1 Januari 4712 SM sampai dengan 31 Desember 4712 AD. Ketika disimpan dalam kolom database,
nilai tanggal termasuk waktu hari dalam detik sejak tengah malam. Default bagian tanggal untuk hari pertama arus
bulan; default porsi waktu untuk tengah malam.



Datatype Conversion

Kadang-kadang perlu untuk mengkonversi nilai dari satu datatype yang lain. PL / SQL mendukung kedua eksplisit dan implisit
(otomatis) datatype konversi.

Untuk menetapkan konversi secara eksplisit, Anda menggunakan fungsi built-in yang mengkonversi nilai dari satu datatype yang lain. PL / SQL
fungsi konversi sama dengan yang ada di SQL. Untuk informasi lebih lanjut tentang fungsi konversi lihat Bab 2
`` PL / SQL User's Guide dan Referensi.''

Ketika masuk akal, PL / SQL dapat mengubah datatype dari nilai implisit. Hal ini memungkinkan Anda untuk menggunakan literal, variabel,
dan parameter dari satu jenis mana tipe lain yang diharapkan. Jika PL / SQL tidak dapat menentukan konversi implisit
diperlukan, Anda mendapatkan error kompilasi. Itu adalah tanggung jawab Anda untuk memastikan bahwa nilai-nilai konversi. Misalnya, PL / SQL
dapat mengkonversi nilai CHAR '02-Juni-92 'ke nilai DATE, tetapi PL / SQL tidak dapat mengubah nilai CHAR
'kemarin' ke nilai DATE.


Declarations

Program anda menyimpan nilai-nilai dalam variabel dan konstanta. Sebagai program mengeksekusi, nilai-nilai variabel dapat berubah,
tetapi nilai-nilai konstanta tidak bisa.

Anda dapat mendeklarasikan variabel dan konstanta di bagian deklaratif dari setiap blok / PL SQL, subprogram, atau paket.
Deklarasi mengalokasikan ruang penyimpanan untuk nilai, menentukan datatype, dan nama lokasi penyimpanan sehingga nilai tersebut dapat
dijadikan acuan. Mereka juga dapat menetapkan nilai awal dan menentukan kendala NULL TIDAK.

           TANGGAL tanggal lahir;
           emp_count SMALLINT: = 0;
           acct_id VARCHAR2 (5) NOT NULL: = 'AP001';
Nama deklarasi pertama variabel tipe DATE. Nama kedua sebuah deklarasi variabel jenis dan SMALLINT
menggunakan operator penugasan (: =) untuk menetapkan nilai awal nol untuk variabel. Nama-nama sebuah deklarasi ketiga
variabel VARCHAR2 tipe, menentukan kendala NULL TIDAK, dan memberikan nilai awal 'AP001' ke
variabel.

Dalam deklarasi konstan, kata KONSTAN reserved harus mendahului tipe specifier.

           credit_limit KONSTAN REAL: = 5000,00;

Menggunakan DEFAULT. Jika Anda suka, Anda dapat menggunakan kata DEFAULT reserved bukan operator penugasan
menginisialisasi variabel dan konstanta. Anda juga dapat menggunakan DEFAULT untuk menginisialisasi parameter subprogram, parameter kursor,
dan bidang dalam catatan yang ditetapkan pengguna.

           tax_year SMALLINT DEFAULT 92;
           berlaku boolean DEFAULT FALSE;
• Menggunakan JENIS%. Atribut JENIS% menyediakan datatype dari, kolom variabel konstan, atau database. Variabel dan
konstanta dideklarasikan menggunakan TIPE% diperlakukan seperti yang dideklarasikan menggunakan nama datatype. Sebagai contoh dalam deklarasi
bawah, PL / SQL memperlakukan debit seperti sebuah variabel (7,2) REAL.

           kredit REAL (7,2);
           kredit debit% TIPE;

Atribut TYPE% kadang berguna ketika mendeklarasikan variabel yang merujuk pada kolom database. Anda dapat referensi
tabel dan kolom, atau Anda dapat referensi pemilik, tabel, dan kolom.

           scott.dept.dname my_dname% TIPE;

Menggunakan JENIS% untuk menyatakan my_dname memiliki dua keuntungan. Pertama, Anda tidak perlu tahu persis datatype dname.
Kedua, jika definisi database perubahan dname, yang datatype perubahan my_dname sesuai pada waktu berjalan.

• Menggunakan ROWTYPE%. Atribut ROWTYPE% menyediakan tipe record yang mewakili baris pada tabel (atau melihat). The
catatan dapat menyimpan seluruh baris data yang dipilih dari tabel atau diambil oleh kursor.

         DECLARE
            emp_rec   emp%ROWTYPE;
            CURSOR c1 is SELECT deptno, dname, loc FROM dept;
            dept_rec  c1%ROWTYPE
             ...
         BEGIN
         SELECT * INTO emp_rec FROM emp WHERE ...
          ...
         END;

Kolom dalam baris dan bidang terkait dalam rekor memiliki nama yang sama dan tipe data.

Kolom nilai yang dikembalikan oleh statemen SELECT disimpan dalam bidang. Untuk referensi lapangan, Anda menggunakan dot
notasi.

         IF emp_rec.deptno = 20 THEN ...

Selain itu, Anda dapat menetapkan nilai dari sebuah ekspresi untuk suatu bidang tertentu.
        emp_rec.ename := 'JOHNSON';
Sebuah deklarasi ROWTYPE% tidak dapat menyertakan klausa inisialisasi. Namun, ada dua cara untuk memberikan nilai pada semua
field dalam rekor sekaligus. Pertama, PL / SQL memungkinkan tugas agregat antara seluruh catatan jika deklarasi mereka lihat
ke meja yang sama atau kursor
DECLARE
             dept_rec1    dept%ROWTYPE;
             dept_rec2    dept%ROWTYPE;
             CURSOR c1 IS SELECT deptno, dname, loc FROM dept;
             dept_rec3    c1%ROWTYPE;
             dept_rec4    c1%ROWTYPE;
          BEGIN
             ...
             dept_rec1 := dept_rec2;
             dept_rec4 := dept_rec3;
             ...
END;


Tapi, karena dept_rec2 didasarkan pada meja dan dept_rec3 didasarkan pada kursor, tugas berikut adalah ilegal:
dept_rec2 := dept_rec3;  -- illegal
Kedua, Anda dapat menetapkan daftar nilai kolom untuk merekam dengan menggunakan SELECT dan pernyataan FETCH, sebagai contoh
bawah ini. Nama-nama kolom harus muncul dalam urutan di mana mereka ditentukan oleh CREATE TABLE atau
CREATE VIEW pernyataan.
          DECLARE
             dept_rec dept%ROWTYPE;
             ...
          BEGIN
          SELECT deptno, dname, loc INTO dept_rec FROM dept
           WHERE deptno = 30;
             ...
          END;

Namun, Anda tidak dapat menetapkan daftar nilai kolom untuk merekam dengan menggunakan pernyataan penugasan. Meskipun Anda dapat
mengambil seluruh catatan, Anda tidak bisa memasukkan mereka. Sebagai contoh, pernyataan berikut adalah ilegal:

INSERT INTO dept VALUES (dept_rec);  -- illegal

Pilih-daftar item diambil oleh kursor yang terkait dengan ROWTYPE% harus memiliki nama sederhana atau, jika mereka ekspresi,
harus memiliki alias. Pada contoh berikut, Anda menggunakan alias yang disebut upah:


DECLARE
CURSOR my_cursor IS SELECT sal + NVL(comm,0) wages, ename
FROM emp;
my_rec  my_cursor%ROWTYPE;
BEGIN
OPEN my_cursor;
LOOP
FETCH my_cursor INTO my_rec;
EXIT WHEN my_cursor%NOTFOUND;
IF my_rec.wages > 2000 THEN
INSERT INTO temp VALUES (NULL, my_rec.wages, my_rec.ename);
END IF;
END LOOP;
CLOSE my_cursor;
END;


PL / SQL tidak mengijinkan referensi kedepan. Anda harus mendeklarasikan variabel atau konstanta sebelum referensi di lain
laporan, termasuk pernyataan deklaratif lainnya. Namun, PL / SQL tidak memungkinkan deklarasi maju dari
subprogram.

Beberapa bahasa memungkinkan Anda untuk menyatakan daftar variabel yang termasuk dalam datatype yang sama. PL / SQL tidak mengizinkan ini.
Sebagai contoh, deklarasi berikut adalah ilegal:
i, j, k      SMALLINT;  -- illegal

Naming Conventions
Konvensi penamaan yang sama berlaku untuk semua / obyek program PL SQL dan unit termasuk konstanta, variabel, kursor,
pengecualian, prosedur, fungsi, dan paket.

Dalam lingkup yang sama, semua pengidentifikasi menyatakan harus unik. Jadi, bahkan jika mereka berbeda tipe data, variabel dan
parameter tidak dapat berbagi nama yang sama.

Dalam pernyataan SQL berpotensi ambigu, nama variabel lokal dan parameter formal lebih diutamakan daripada
nama tabel database. Sebagai contoh, statemen SELECT berikut ini gagal karena PL / SQL emp mengasumsikan bahwa
mengacu pada parameter formal:
PROCEDURE calc_bonus (emp NUMBER, bonus OUT REAL) IS
avg_sal REAL;
...
BEGIN
SELECT AVG(sal) INTO avg_sal FROM emp WHERE ...
...
END;

Dalam kasus tersebut, Anda dapat awalan nama tabel dengan nama pengguna, sebagai berikut:
PROECEDURE calc_bonus (emp NUMBER, bonus OUT REAL) IS
avg_sal REAL;
...
BEGIN
SELECT AVG(sal) INTO avg_sal FROM scott.emp WHERE ...
...
END;

Nama-nama kolom database didahulukan dari nama-nama variabel lokal dan parameter formal. Misalnya,
HAPUS pernyataan berikut menghapus semua karyawan dari tabel emp, bukan hanya KING, karena ORACLE
mengasumsikan bahwa kedua enames dalam klausa WHERE mengacu pada kolom database
.
DECLARE
ename   CHAR(10) := 'KING';
BEGIN
DELETE FROM emp WHERE ename = ename;
...
END;


Dalam kasus tersebut, untuk menghindari ambiguitas, prefiks nama variabel lokal dan parameter formal dengan my_ sebagai berikut:
DECLARE
my_ename   CHAR(10) := 'KING';
...
Atau, gunakan label blok untuk memenuhi syarat referensi, sebagai berikut:
<<main>>
DECLARE
ename   CHAR(10) := 'KING';
BEGIN
DELETE FROM emp WHERE ename = main.ename;
...
END;

Contoh Function Tanpa Parameter (2):
SET SERVEROUTPUT ON
DECLARE
          X VARCHAR2(20);
BEGIN
          X := tulis_teks;
          DBMS_OUTPUT.PUT_LINE(X);
END;
/
Contoh Function Dengan Parameter:
CREATE OR REPLACE FUNCTION
                   pangkat (bil INTEGER, n INTEGER)
RETURN INTEGER AS
          HASIL INTEGER(10);
          I INTEGER;
BEGIN
          HASIL := 1;
          FOR I IN 1..n LOOP
                   HASIL := HASIL * bil;
          END LOOP;
          RETURN HASIL;
END;
/
Scope and Visibility


Referensi ke sebuah pengenal yang diselesaikan sesuai dengan ruang lingkup dan visibilitas. Ruang lingkup dari sebuah identifier adalah bahwa wilayah
unit program (block, subprogram, atau paket) dari mana Anda dapat referensi identifier. Sebuah identifier yang terlihat
hanya di daerah dari mana Anda dapat referensi identifier menggunakan nama wajar tanpa pengecualian.

Sebagai contoh, pengidentifikasi dideklarasikan dalam blok / PL SQL dianggap lokal untuk blok tersebut dan global untuk semua-nya sub blok.
Jika sebuah identifier global adalah redeklarasi dalam blok-sub, baik pengidentifikasi tetap dalam lingkup. Dalam sub-blok, namun hanya
identifier lokal terlihat karena Anda harus menggunakan nama yang memenuhi syarat untuk referensi identifier global.

Meskipun Anda tidak dapat mendeklarasikan suatu pengenal dua kali dalam blok yang sama, Anda dapat mendeklarasikan identifier yang sama di dua yang berbeda
blok. Dua benda diwakili oleh identifier yang berbeda, dan setiap perubahan dalam satu tidak mempengaruhi yang lain. Catatan
yang menghalangi tidak dapat pengenal referensi dideklarasikan dalam blok lainnya bersarang pada tingkat yang sama karena mereka pengidentifikasi adalah
baik lokal maupun global untuk blok tersebut.

Jika Anda redeclare identifier dalam sub-blok, Anda tidak dapat referensi identifier global kecuali jika Anda menggunakan nama yang memenuhi syarat.
Kualifikasi bisa label dari sebuah blok melampirkan (atau melampirkan subprogram) sebagai berikut:


<<outer>>
DECLARE
birthdate   DATE;
BEGIN
...
DECLARE birthdate    DATE;
BEGIN
...
IF birthdate = outer.birthdate THEN
...
END IF;
END;
END outer;


Assignments

Variabel dan konstanta yang diinisialisasi setiap kali blok atau subprogram dimasukkan. Secara default, variabel ini diinisialisasi
ke NULL. Jadi, kecuali anda menyatakan menginisialisasi variabel, nilainya tidak terdefinisi, seperti yang ditunjukkan contoh berikut:

DELCARE
count   INTEGER;
BEGIN
count := count + 1;   -- assigns a null to count
END;


Oleh karena itu, tidak pernah referensi variabel sebelum Anda menetapkan nilai itu. Hanya nilai-nilai TRUE dan FALSE dan non-
nilai NULL dapat diberikan ke sebuah variabel Boolean. Ketika diterapkan pada PL / SQL ekspresi, operator relasional
mengembalikan nilai Boolean. Jadi, tugas berikut adalah legal:
DECLARE
done    BOOLEAN;
BEGIN
done := (count > 500);
...
END;

Atau, Anda dapat menggunakan statemen SELECT atau FETCH memiliki ORACLE memberikan nilai ke variabel.
SELECT ename, sal + comm INTO last_name, wages FROM emp
WHERE empno = emp_id;

Untuk setiap item dalam daftar SELECT, harus ada variabel yang sesuai dalam daftar KE. Juga, setiap item harus kembali
suatu nilai yang secara implisit konversi ke datatype variabel yang sesuai.

Expressions and Comparisons


Semua ekspresi dan perbandingan adalah sama seperti yang dijelaskan di bagian Referensi SQL. Beberapa pedoman
ikut membantu Anda mencegah jatuh ke dalam perangkap umum.

Secara umum, jangan bandingkan bilangan real untuk kesetaraan tepat atau ketidaksetaraan. Ini juga merupakan ide baik untuk menggunakan tanda kurung pada saat
melakukan perbandingan.

Ingat bahwa variabel boolean itu sendiri bisa benar atau salah. Jadi perbandingan dengan nilai-nilai boolean TRUE dan
FALSE yang berlebihan. Sebagai contoh, dengan asumsi variabel dilakukan termasuk tipe Boolean, pernyataan IF
Anda bisa menghindari beberapa kesalahan umum oleh mengingat aturan berikut:

Perbandingan
  melibatkan nulls selalu menghasilkan NULL

menerapkan operator logis TIDAK untuk menghasilkan null NULL

dalam pernyataan kontrol bersyarat, jika kondisi bernilai NULL, urutan yang terkait laporan tidak
dieksekusi

Ingat bahwa menerapkan NULL operator logis untuk sebuah hasil null NULL.
Jika argumen null dilewatkan ke fungsi, null dikembalikan kecuali dalam kasus-kasus berikut:

(decode) Fungsi deCODE membandingkan argumen pertama untuk ekspresi mencari satu atau lebih, yang dipasangkan
dengan ekspresi hasil. Setiap ekspresi pencarian atau hasilnya bisa null. Jika pencarian berhasil, hasil yang terkait
kembali. Pada contoh berikut ini, jika nilai rating null, deCODE mengembalikan nilai 1000:

           credit_limit: = (rating, NULL, 1000, 'B', 2000, 'A', 4000);

(NVL) Jika Argumen pertama adalah null, NVL fungsi mengembalikan nilai dari argumen kedua. Dalam berikut
Misalnya, jika hire_date adalah null, kembali NVL nilai SYSDATE, jika tidak, NVL mengembalikan nilai hire_date:

          
start_mulai: = NVL (hire_date, SYSDATE);

(REPLACE). Jika argumen kedua adalah null, fungsi REPLACE mengembalikan nilai dari argumen pertama apakah
argumen opsional ketiga hadir atau tidak. Sebagai contoh, setelah tugas:


                 new_string: = REPLACE (old_string, NULL, my_string);

nilai-nilai old_string dan new_string adalah sama.


Built-in Functions

PL / SQL menyediakan banyak fungsi yang kuat untuk membantu Anda memanipulasi data. Anda dapat menggunakan mereka di mana saja ekspresi
tipe yang sama diperbolehkan. Selanjutnya, Anda dapat sarang mereka.

Built-in fungsi jatuh ke dalam kategori berikut:

• fungsi pelaporan kesalahan

• Nomor fungsi

• karakter fungsi

• Fungsi konversi

• data fungsi

• fungsi lain-lain

Anda dapat menggunakan semua fungsi built-in dalam laporan SQL kecuali kesalahan-fungsi pelaporan dan SQLCODE
SQLERRM. Selain itu, Anda dapat menggunakan semua fungsi dalam laporan prosedural kecuali fungsi lain-lain
DeCODE.

Kebanyakan fungsi sama dengan yang dibahas dalam bagian Referensi SQL kecuali orang-orang yang dibahas di bawah ini.

Dua fungsi, SQLCODE dan SQLERRM, memberikan informasi tentang PL / SQL kesalahan eksekusi.
(SQLCODE)
fungsi SQLCODE kembali NOMOR
Mengembalikan nomor yang terkait dengan pengecualian yang terakhir diangkat. Fungsi ini berarti hanya dalam
pengecualian handler. Di luar seorang pawang, SQLCODE selalu kembali nol.

Untuk pengecualian internal, kembali SQLCODE jumlah kesalahan ORACLE terkait. NUMBER bahwa
Kembali SQLCODE adalah negatif kecuali kesalahan ORACLE adalah "tidak ada data yang ditemukan", dalam hal SQLCODE kembali 100.

Untuk pengecualian yang ditetapkan pengguna, kembali SQLCODE +1 kecuali jika Anda menggunakan EXCEPTION_INIT pragma mengasosiasikan
pengecualian dengan nomor kesalahan ORACLE, dalam hal pengembalian SQLCODE bahwa nomor kesalahan
.
(SQLERRM)
 fungsi SQLERRM [(error_number NUMBER)] CHAR kembali
Mengembalikan pesan kesalahan yang terkait dengan nilai saat SQLCODE. SQLERRM bermakna hanya dalam
pengecualian handler. Di luar seorang pawang, SQLERRM dengan tidak ada argumen selalu mengembalikan pesan `` ORA-0000: normal,
sukses selesai.''

Untuk pengecualian internal, SQLERRM mengembalikan pesan yang terkait dengan ORACLE kesalahan yang terjadi. The
pesan diawali dengan kode kesalahan ORACLE.

Untuk pengecualian yang ditetapkan pengguna, kembali SQLERRM Eksepsi pesan `` User-Defined''kecuali Anda menggunakan pragma yang
EXCEPTION_INIT mengasosiasikan pengecualian dengan nomor kesalahan ORACLE, di mana kasus SQLERRM mengembalikan
pesan kesalahan yang sesuai.

Anda dapat melewati error_number argumen untuk SQLERRM, dalam hal SQLERRM mengembalikan pesan yang terkait
dengan error_number.
Fungsi-fungsi lain-lain berikut ini mungkin berguna bagi Anda dalam PL / SQL coding.
(UID) UID fungsi kembali NOMOR
Mengembalikan nomor identifikasi unik yang diberikan untuk pengguna ORACLE saat ini. UID tidak membutuhkan argumen.

(USER) fungsi PENGGUNA VARCHAR2 kembali
Mengembalikan nama pengguna dari pengguna ORACLE saat ini. USER tidak membutuhkan argumen.

(USERENV) fungsi USERENV (str VARCHAR2) return VARCHAR2
Menghasilkan informasi tentang sesi yang sedang berlangsung. Dapat menggunakan informasi tersebut untuk menulis aplikasi tabel audit trail atau
menentukan bahasa dan set karakter sedang digunakan. \ \
String str dapat memiliki salah satu dari nilai berikut:

'ENTRYID' mengembalikan sebuah entri audit identifier

LANGUAGE’ mengembalikanwilayah, dan karakter set database yang digunakan

'SESSIONID'
mengembalikan sesi audit identifier

'TERMINAL' mengembalikan sistem operasi pengenal untuk terminal sesi

Anda tidak dapat menentukan 'ENTRYID' atau pilihan 'sessionid' dalam laporan SQL bahwa akses remote database.

PL/SQL Tables


PL / SQL menyediakan dua tipe data komposit: TABEL dan CATAT. Obyek jenis TABEL disebut PL / SQL tabel,
yang dimodelkan sebagai (tetapi tidak sama dengan) tabel database. PL / SQL tabel menggunakan kunci utama untuk memberikan array-seperti
akses ke baris.

Seperti ukuran tabel database, ukuran meja / PL SQL tidak dibatasi. Artinya, jumlah baris dalam PL / SQL
tabel dapat meningkatkan secara dinamis. PL / SQL table tumbuh sebagai baris baru ditambahkan
.
PL / SQL tabel dapat memiliki satu kolom dan sebuah kunci primer, baik yang dapat diberi nama. Kolom dapat dikelompokkan ke
tipe skalar, tetapi kunci primer harus milik BINARY_INTEGER tipe.

PL / SQL tabel harus dinyatakan dalam dua langkah. Pertama, Anda menentukan jenis TABLE, kemudian menyatakan PL / SQL tabel jenis itu.
Anda dapat mendeklarasikan jenis TABEL di bagian deklaratif blok apapun, subprogram, atau paket dengan menggunakan sintaks:
TYPE type_name IS TABLE OF
{ column_type | variable%TYPE | table.column%TYPE } [NOT NULL]
INDEX BY BINARY_INTEGER;

mana type_name adalah penspesifikasi tipe yang digunakan dalam deklarasi berikutnya dari PL / SQL dan column_type tabel adalah setiap skalar
(bukan komposit) datatype seperti CHAR, DATE, atau NOMOR. Dapat menggunakan% TIPE atribut untuk menentukan kolom
datatype.
Pada contoh berikut, Anda menyatakan jenis TABEL disebut EnameTabTyp:
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
...
Setelah Anda menentukan tipe EnameTabTyp, Anda dapat mendeklarasikan PL / SQL tabel tipe tersebut, sebagai berikut:

           ename_tab
      EnameTabTyp

Pengenal ename_tab merupakan seluruh PL / SQL meja.
PL / SQL tabel adalah tak terbatas karena kunci utama dapat mengasumsikan nilai apapun dalam rentang nilai yang ditetapkan untuk
BINARY_INTEGER. Akibatnya, Anda tidak dapat menginisialisasi PL / table SQL dalam deklarasi tersebut. Sebagai contoh, berikut ini
deklarasi adalah ilegal:

ename_tab EnameTabTyp: = ('Casey',, 'STUART' 'CHU');

Untuk baris rujukan dalam tabel / PL SQL, Anda menetapkan nilai kunci primer menggunakan sintaks array-seperti

           plsql_table_name (primary_key_value)

mana primary_key_value milik BINARY_INTEGER tipe. Kisaran besarnya nilai BINARY_INTEGER
adalah -2 ** 31-1 ... 2 ** 31-1. Misalnya, Anda referensi baris ketiga dalam PL / SQL ename_tab tabel sebagai berikut:

           ename_tab (3) ...

Anda dapat menetapkan nilai ekspresi / PL SQL ke baris tertentu dengan menggunakan sintaks berikut:

           plsql_table_name (primary_key_value): plsql_expression =;

Dalam contoh di bawah ini, Anda menggunakan kursor UNTUK loop untuk memuat dua PL / SQL tabel. Sebuah kursor UNTUK loop implisit menyatakan nya
indeks pengulangan sebagai catatan, membuka kursor yang terkait dengan query yang diberikan, berulang kali mengambil baris dari nilai-nilai dari
kursor ke dalam field dalam catatan, lalu menutup kursor.
Sampai berturut-turut diberi nilai, itu tidak ada. Jika Anda mencoba untuk referensi sebuah baris terinisialisasi, PL / SQL menimbulkan
standar NO_DATA_FOUND pengecualian.

Ingat bahwa ukuran PL / SQL tabel tidak dibatasi begitu, bahwa jika Anda ingin mempertahankan jumlah baris, Anda harus
mendeklarasikan variabel untuk tujuan itu. A PL / SQL tabel bisa tumbuh besar, hanya dibatasi oleh memori yang tersedia. Ketika
PL / SQL kehabisan memori itu menimbulkan STORAGE_ERROR pengecualian yang telah ditetapkan.

Anda harus menggunakan loop untuk nilai INSERT dari meja / PL SQL ke dalam kolom database. Demikian juga, Anda harus menggunakan loop untuk
FETCH nilai dari kolom database ke tabel / PL SQL. Oleh karena itu, Anda tidak dapat referensi PL / SQL tabel di
KE klausul pernyataan SELECT.

Tidak ada cara langsung untuk menghapus baris dari tabel / PL SQL karena DELETE tidak bisa menentukan
PL / SQL tabel. Mengatur baris ke NULL tidak bekerja karena baris tetap dan tidak menaikkan pengecualian
NO_DATA_FOUND saat dirujuk.

Meskipun Anda tidak dapat menghapus baris individu dari meja / PL SQL, Anda dapat menggunakan solusi sederhana untuk menghapus seluruh
PL / SQL tabel. Pertama, menyatakan lain PL / SQL meja dari jenis yang sama dan biarkan kosong. Kemudian, bila Anda ingin menghapus
asli PL / SQL tabel, hanya menetapkan tabel kosong kepada mereka.


User-defined Records
Dapat menggunakan% yang ROWTYPE atribut untuk menyatakan rekor yang mewakili baris dalam tabel atau baris diambil oleh kursor.
Namun, Anda tidak dapat menentukan tipe data dari field dalam catatan atau mendefinisikan bidang Anda sendiri. The datatype komposit
REKOR lift tersebut pembatasan.

Seperti yang mungkin Anda harapkan, objek disebut REKOR jenis catatan. Tidak seperti PL / SQL tabel, catatan telah unik bernama
bidang, yang dapat dikelompokkan pada tipe data yang berbeda. Misalnya, Anda memiliki jenis data yang berbeda tentang
karyawan seperti nama, gaji, menyewa tanggal, dan sebagainya. Data ini berbeda dengan tipe tapi logika terkait. Sebuah catatan yang
berisi bidang-bidang seperti gaji, nama, dan tanggal mempekerjakan karyawan akan membiarkan Anda memperlakukan data sebagai unit logis.

Seperti PL / SQL tabel, catatan harus dideklarasikan dalam dua langkah. Pertama, Anda menentukan jenis RECORD, kemudian menyatakan pengguna-
didefinisikan catatan jenis itu.

CONTROL STRUCTURES


Menurut teorema struktur, setiap program komputer dapat ditulis dengan menggunakan struktur kontrol dasar yang dapat
dikombinasikan dengan cara apapun yang diperlukan untuk berurusan dengan soal yang diberikan.

Struktur seleksi tes kondisi, kemudian melaksanakan satu urutan laporan bukan yang lain, tergantung pada
apakah kondisi itu benar atau salah. Kondisi adalah variabel atau ekspresi yang mengembalikan nilai Boolean (TRUE,
FALSE, atau NULL). Struktur iterasi menjalankan urutan laporan berulang-ulang selama kondisi berlaku

benar. Struktur urutan hanya menjalankan urutan pernyataan dalam urutan di mana mereka terjadi.

Conditional Control: IF Statements


Seringkali, kita perlu mengambil tindakan alternatif, tergantung pada keadaan. JIKA Pernyataan memungkinkan Anda melaksanakan
urutan pernyataan kondisional. Artinya, apakah urutan dijalankan atau tidak tergantung pada nilai dari
kondisi. Ada tiga bentuk laporan IF: IF-THEN, IF-THEN-ELSE dan IF-THEN-ELSIF.

Bentuk ketiga JIKA pernyataan menggunakan kata kunci ELSIF (elseif TIDAK) untuk memperkenalkan kondisi tambahan, sebagai berikut:

Contoh Struktur satu kondisi
SET SERVEROUTPUT ON
DECLARE
          BIL INTEGER := 80;
BEGIN
          IF MOD(BIL, 2) = 0 THEN
                   DBMS_OUTPUT.PUT_LINE( TO_CHAR(BIL) || ‘ ADALAH BILANGAN GENAP’);
          END IF;
END;
/
Contoh stuktur dua kondisi
SET SERVEROUTPUT ON
DECLARE
          BIL INTEGER := 3;
BEGIN
          IF MOD(BIL, 2) = 0 THEN
                   DBMS_OUTPUT.PUT_LINE( TO_CHAR(BIL) || ‘ ADALAH
                   BILANGAN GENAP’);
          ELSE
                   DBMS_OUTPUT.PUT_LINE( TO_CHAR(BIL) || ‘ ADALAH
                   BILANGAN GANJIL’);
          END IF;
END;
/

Perancangan Control: LOOP dan EXIT Laporan

Laporan LOOP membiarkan Anda mengeksekusi urutan laporan beberapa kali. Ada tiga bentuk laporan LOOP:
LOOP, WHILE-LOOP, dan FOR-LOOP.

LOOP

Bentuk paling sederhana dari pernyataan LOOP adalah loop (atau tak terbatas) dasar, yang menutup urutan laporan antara
kata kunci LOOP dan END LOOP, sebagai berikut:

           LOOP
              sequence_of_statements3;
              ...
           END LOOP;

Dengan setiap iterasi dari loop, urutan laporan dijalankan, kemudian mengendalikan resume di bagian atas loop. Jika
proses lebih lanjut yang tidak diinginkan atau tidak mungkin, Anda bisa menggunakan pernyataan EXIT untuk melengkapi loop. Dapat menempatkan
satu atau lebih laporan EXIT di mana saja di dalam satu lingkaran, tapi tak luar loop. Ada dua bentuk EXIT
Laporan: EXIT dan EXIT-KAPAN.

Pernyataan EXIT memaksa loop untuk menyelesaikan tanpa syarat. Ketika sebuah pernyataan EXIT ditemui, loop

 WHILE-LOOP

Asosiasi pernyataan WHILE-LOOP kondisi dengan urutan pernyataan tertutup oleh kata kunci LOOP
dan AKHIR LOOP, sebagai berikut:

           SAAT kondisi LOOP
              sequence_of_statements;
              ...
           END LOOP;

Sebelum setiap iterasi dari loop, kondisi dievaluasi. Jika kondisi bernilai TRUE urutan, dari
pernyataan di bawah ini dilaksanakan, kemudian dilanjutkan kontrol di bagian atas loop. Jika kondisi bernilai FALSE atau NULL, maka
loop dilewati dan kontrol lolos ke pernyataan berikutnya. Karena kondisi diuji di bagian atas loop,
urutan mungkin mengeksekusi nol kali
Interaction With ORACLE

SUPPORT SQL

Dengan memperluas SQL, PL / SQL menawarkan kombinasi yang unik kekuasaan dan kemudahan penggunaan. Anda dapat memanipulasi data ORACLE
fleksibel dan aman karena PL / SQL mendukung semua perintah SQL manipulasi data (kecuali RENCANA MENJELASKAN),
transaksi kontrol perintah, fungsi, pseudocolumns, dan operator. Namun, PL / SQL tidak mendukung data
definisi perintah seperti CREATE, perintah kontrol sesi seperti SET PERAN, atau sistem kontrol
perintah ALTER SYSTEM.


Mani
pulation Data

Untuk memanipulasi data ORACLE, Anda menggunakan perintah INSERT, UPDATE, DELETE, SELECT, dan LOCK TABLE.

Transaction Control

ORACLE adalah berorientasi transaksi, yaitu, ORACLE menggunakan transaksi untuk memastikan integritas data. Transaksi adalah serangkaian
laporan manipulasi data SQL yang tidak logis unit kerja. Sebagai contoh, dua pernyataan mungkin UPDATE
kredit satu rekening bank dan debit yang lain. Pada saat yang sama, ORACLE membuat permanen atau database Membatalkan semua
perubahan yang dilakukan oleh transaksi. Jika program anda gagal di tengah transaksi, ORACLE mendeteksi kesalahan dan gulungan
kembali transaksi. Oleh karena itu, database akan dipulihkan ke kondisi semula secara otomatis.
Anda menggunakan perintah COMMIT, ROLLBACK, SAVEPOINT, dan SET TRANSAKSI untuk mengontrol transaksi.
COMMIT membuat perubahan permanen database yang dibuat selama transaksi berjalan. Sampai Anda komit Anda
perubahan, pengguna lain tidak bisa melihat mereka. ROLLBACK mengakhiri transaksi berjalan dan Membatalkan perubahan yang dibuat sejak
transaksi dimulai. SAVEPOINT menandai titik saat ini dalam pengolahan transaksi. Digunakan dengan
ROLLBACK, Membatalkan bagian dari transaksi. SET TRANSAKSI menetapkan transaksi read-only.


SQL
Functions

PL / SQL memungkinkan Anda menggunakan semua fungsi SQL termasuk fungsi kelompok, yang merangkum seluruh kolom ORACLE
data.


SQL Pseudocolumns

PL / SQL mengakui SQL pseudocolumns berikut, yang kembali item tertentu data: CURRVAL, TINGKAT,
NEXTVAL, ROWID, dan rownum.

Sebagai contoh, NEXTVAL mengembalikan nilai berikutnya dalam urutan database. Mereka disebut pseudocolumns karena mereka
tidak kolom aktual dalam tabel tapi berperilaku seperti kolom. Misalnya, Anda dapat pseudocolumns referensi di SQL
laporan. Selanjutnya, Anda dapat memilih nilai dari sebuah pseudocolumn. Namun, Anda tidak bisa memasukkan nilai ke dalam, update
nilai dalam, atau menghapus nilai dari sebuah pseudocolumn. Asumsikan bahwa Anda telah menyatakan empno_seq sebagai urutan database,
maka pernyataan berikut memasukkan nomor karyawan baru ke dalam tabel emp:


          INSERT INTO emp VALUES (empno_seq.NEXTVAL, new_ename, ...);

urutan adalah objek database yang menghasilkan nomor urut. Bila Anda membuat urutan, Anda dapat menentukan nya
awal nilai dan selisih penilaian. CURRVAL mengembalikan nilai saat ini dalam urutan tertentu. Sebelum Anda dapat referensi
CURRVAL dalam satu sesi, Anda harus menggunakan NEXTVAL untuk menghasilkan nomor.

TINGKAT digunakan dengan pernyataan SELECT CONNECT BY untuk mengatur baris dari sebuah tabel database ke dalam pohon
struktur. TINGKAT mengembalikan jumlah tingkat dari sebuah node dalam struktur pohon. root adalah tingkat 1, anak-anak akar adalah tingkat
2 dan seterusnya. Anda menetapkan arah di mana query berjalan pohon (turun dari akar atau naik dari cabang-cabang)
dengan operator SEBELUMNYA. Dalam START DENGAN klausa, Anda menentukan kondisi yang mengidentifikasi akar pohon.

ROWID mengembalikan (alamat biner) rowid dari sebuah baris dalam sebuah tabel database.

Rownum mengembalikan sebuah angka yang menunjukkan urutan yang berturut-turut dipilih dari tabel. Jika statemen SELECT
mencakup ORDER BY klausa, ROWNUMs ditugaskan untuk baris diambil sebelum mengurutkan dilakukan.


Operator
s

PL / SQL memungkinkan Anda menggunakan semua perbandingan SQL, mengatur, dan operator baris dalam pernyataan SQL.


Manajemen
t cursor

PL / SQL menggunakan dua jenis cursors: implisit dan eksplisit. PL / SQL menyatakan kursor implisit untuk semua data SQL
manipulasi laporan, termasuk query yang kembali hanya satu baris. Namun, untuk query yang mengembalikan lebih dari satu
baris, Anda harus mendeklarasikan kursor eksplisit atau menggunakan kursor UNTUK loop


Explicit Cursors
Himpunan baris yang dikembalikan oleh query dapat terdiri dari nol, satu, atau beberapa baris, tergantung pada berapa banyak baris memenuhi Anda
kriteria pencarian. Ketika pertanyaan kembali beberapa baris, Anda secara eksplisit dapat mendefinisikan proses kursor ke baris. Anda mendefinisikan
kursor di bagian deklaratif dari sebuah blok / PL SQL, subprogram, atau paket dengan penamaan itu dan menetapkan permintaan. Kemudian,
Anda menggunakan tiga perintah untuk mengontrol kursor: OPEN, FETCH dan CLOSE.

Error Handling


Overview

Dalam PL / SQL kondisi peringatan atau error disebut pengecualian. Pengecualian dapat internal didefinisikan (oleh runtime
sistem) atau user-defined.

Contoh pengecualian internal didefinisikan meliputi pembagian dengan nol dan keluar dari memori. Beberapa umum internal
pengecualian memiliki nama standar, seperti ZERO_DIVIDE dan STORAGE_ERROR. Internal pengecualian lainnya
dapat diberikan nama.

Anda dapat menentukan pengecualian Anda sendiri di bagian deklaratif dari setiap blok / PL SQL, subprogram, atau paket.
Untuk
Misalnya, Anda mungkin mendefinisikan pengecualian bernama insufficient_funds untuk bendera sebuah rekening bank tekor. Tidak seperti internal
pengecualian, pengecualian yang ditetapkan pengguna harus diberi nama.

Bila terjadi kesalahan, eksepsi dimunculkan. Artinya, berhenti eksekusi normal dan transfer kontrol ke eksepsi
penanganan bagian / blok Anda PL SQL atau subprogram. pengecualian internal dibangkitkan implisit (otomatis) oleh
runtime sistem. User-defined pengecualian harus dinaikkan secara eksplisit oleh pernyataan RAISE, yang juga dapat meningkatkan
standar pengecualian.

Untuk menangani pengecualian dibangkitkan, Anda menulis rutinitas terpisah yang disebut penangan pengecualian.
Setelah berjalan handler pengecualian, yang
blok saat berhenti melaksanakan dan melampirkan resume blok dengan pernyataan berikutnya. Jika tidak ada blok melampirkan,
kontrol kembali ke lingkungan host.
Subprogram

Subprogram dinamai PL / SQL blok yang dapat mengambil parameter dan dipanggil. PL / SQL memiliki dua jenis
subprogram disebut prosedur dan fungsi. Umumnya, Anda menggunakan prosedur untuk melakukan tindakan dan fungsi untuk
menghitung nilai.

Seperti tanpa nama atau anonim / blok PL SQL, subprogram memiliki bagian deklaratif, merupakan bagian yang dieksekusi, dan opsional
penanganan-pengecualian bagian.

Prosedur
es

Prosedur adalah subprogram yang melakukan tindakan tertentu.

                    
 

Functions
Fungsi adalah subprogram yang menghitung nilai. Fungsi dan prosedur yang terstruktur sama, kecuali yang berfungsi
memiliki klausa RETURN
.contoh program functions pada program perpangkatan:




RETURN Statement

Pernyataan RETURN immediatedly melengkapi pelaksanaan subprogram dan kembali kontrol ke pemanggil.
Eksekusi kemudian dilanjutkan dengan pernyataan berikut panggilan subprogram. Subprogram dapat berisi beberapa KEMBALI
laporan, tidak ada yang perlu pernyataan leksikal terakhir.

Dalam prosedur, pernyataan RETURN tidak dapat berisi ekspresi. Pernyataan itu hanya kembali kontrol ke pemanggil
sebelum akhir prosedur normal tercapai.

Namun, dalam fungsi, pernyataan RETURN harus mengandung sebuah ekspresi, yang dievaluasi saat RETURN
pernyataan tercapai. Sebuah fungsi harus mengandung setidaknya satu pernyataan RETURN. Jika tidak, PL / SQL menimbulkan
standar PROGRAM_ERROR pengecualian pada waktu berjalan.


Parameter Modes

Anda menggunakan mode parameter untuk menentukan perilaku parameter formal. Ketiga mode parameter, DI (default),
OUT,
​​dan IN OUT, ​​dapat digunakan dengan subprogram. Namun, hindari menggunakan mode OUT dan IN OUT dengan
fungsi.

• IN parameter yang memungkinkan Anda lulus nilai ke subprogram yang dipanggil. Di dalam subprogram, sebuah DALAM bertindak parameter seperti
sebuah konstanta. Oleh karena itu, tidak dapat diberi nilai. Tidak seperti OUT dan IN parameter OUT,
​​IN parameter dapat
diinisialisasi ke nilai default.

• parameter OUT memungkinkan Anda kembali nilai-nilai ke pemanggil dari subprogram. Di dalam subprogram, sebuah parameter OUT tindakan
seperti variabel terinisialisasi. Oleh karena itu, nilainya tidak dapat ditugaskan untuk variabel lain atau dipindahkan ke dirinya sendiri.

Parameter aktual yang terkait dengan parameter OUT formal harus berupa sebuah variabel, tetapi tidak dapat berupa sebuah konstanta atau
ekspresi.

OUT parameter aktual dapat (tetapi tidak perlu) memiliki nilai sebelum subprogram disebut. Namun, nilai hilang
ketika Anda memanggil subprogram.

Sebelum keluar sebuah subprogram, secara eksplisit memberikan nilai untuk semua parameter OUT formal. Jika tidak, nilai-nilai
parameter aktual yang sesuai yang tak tentu. Jika Anda keluar berhasil, PL / SQL memberikan nilai ke aktual
parameter. Namun, jika Anda keluar dengan eksepsi tidak tertangani, PL / SQL tidak menempatkan nilai ke parameter aktual.

• IN parameter OUT memungkinkan Anda lulus nilai awal ke subprogram yang dipanggil dan kembali nilai-nilai diperbarui ke
pemanggil. Di dalam subprogram, parameter IN OUT bertindak seperti variabel diinisialisasi.
Parameter aktual yang terkait dengan parameter OUT IN formal harus berupa sebuah variabel, tetapi tidak dapat berupa sebuah konstanta atau
ekspresi.

Array
Definisi
Tipe data bentukan yang dapat menyimpan sekumpulan nilai dari tipe data yang sama dan dikemas dalam bentuk larik.
Nilai dari elemen-elemen array dapat diacu atau diakses melalui indeksnya, perlu diperhatikan bahwa indeks array harus dari tipe data yang mempunyai keterurutan, seperti halnya tipe integer.
Mendeklarasikan siswa sebagai array bertipe varchar2 dengan maksimal 25 karakter, nama bagian dari array siswa, lalu i sebagai integer.
Lalu memasukan nilai nama 1 Ani, nama 2 budi, dan seterusnya. Menggunakan perulangan FOR untuk mencetak nama dari 1 sampai 4.