download

Programatic SQL
Programatic SQL dibagi menjadi dua tipe :
1. Embedded SQL Statements
kalimat SQL disimpan secara langsung ke dalam kode sumber program dan
dicampur dengan kalimat bahasa host. Pendekatan ini membuat user daapt
menulis program yang dapat mengakses database secara langsung. Suatu
precompiler yang special memodifikasi kode sumber dengan memindahkan
kalimat SQL dengan memanggil ke routine DBMS. Kode sumber dapat di
compile dan di link dengan cara normal. Standard ISO menspesifikasi embedded
support untuk bahasa pemograman seperti Ada, C, COBOL, Fortran, MUMPS,
Pascal, and PL/I.
2. Application Programming Interface (API)
suatu teknik alternative yang menyediakan programmer suatu set standar fungsi
yang dapat di panggil dari software. API ndapat menyediakan fungsilitas yang
sama dengan embedded statement dan memindahkan kebutuhan berbagai
precompilasi. Ini dapat ditentang dengan pendekatan ini yang menyediakan
suatu interface yang jelas dan menghasilkan lebih banyak kode yang mudah
diatur. API yang terkenal adalah Open Database Connectivity (ODC) standard.
Kebanyakan DBMS menyediakan beberapa bentuk embedded SQL seperti Oracle,
INGRES, Informix, dan DB2. Oracle juga menyediakan API, Acces hanya
menyediakan API (dipanggil ADO-ActiveX Data Objects-layer atas ODBC).
Ada dua tipe embedded SQL yakni embedded SQL yang static dimana keseluruhan
kalimat SQL di kenal di program tempat ditulis dan embedded SQL yang dinamis
yang mengijinkan semua bagian kalimat SQL di spesifikasi pada saat dijalankan.
2.1.1.1
Simple Embedded SQL Statements
Tipe embedded SQL yang simple tidak menghasilkan query yakni tidak ada SELECT
statement, berupa INSERT, UPDATE, DELETE, CREATE TABLE.
Contoh embedded program untuk create viewing table dapat dilihat pada figure 21.1
hal 653
Beberapa konsep Embedded SQL statement :
 Embedded SQL statement dimulai dengan suatu identifier yang biasanya suatu
keyword EXEC SQL yang diartikan dalam standar ISO (‘@SQL pada MUMPS
’). Ini mengindikasikan ke precompiler bahwa kalimat ini adalah Embedded
SQL statement.
 Embedded SQL statement diakhiri dengan suatu terminator yang bebas dalam
host language. Di Ada, “C”, dan PL/I terminatornya merupakan titik koma(;). Di
Cobol , terminatornya berupa keyword END-EXEC. Di Fortran, embedded
statement nya diakhiri ketika tidak ada lagi baris yang lebih lanjut.
 Embedded SQL statement dapat dilanjutkan melebih satu baris , menggunakan
tanda lanjutan dari host language.
 Embedded SQL statement dapat muncul di mana saja dimana pada host
language yang muncul.

Embedded statement (CONNECT, CREATE TABLE dan COMMIT) sama
dimasukkan secara interaktif.
Pada Oracle , kita tidak perlu mengikuti kalimat definisi data dengan kalimat
COMMIT karena kalimat definisi data diikuti automatic COMMIT sebelum dan
sesudah dijalankan. Akan tetapi, COMMIT pada figure 21.1 dihilangkan. Untuk
penambahan, option RELEASE pada COMMIT menyebabkan system bebas untuk
semua sumber Oracle seperti locks dan cursor dan untuk menghilangkan koneksi dari
database.
2.1.1.2
SQL Communications Area
DBMS menggunakan SQL Communications Area (SQLCA) untuk melaporkan
kesalahan pada waktu dijalankannya pada program aplikasi. SQLCA merupakan
struktur data yang terdiri dari variable error dan status indicator. Program aplikasi
dapat memeriksa SQLCA untuk menentukan berhasil atau gagalnya suatu kalimat
perintah SQL . figure 21.1 menunjukkan definisi SQLCA untuk Oracle. Untuk
menggunakan SQLCA maka pada awal program harus ditulis baris : EXEC SQL
INCLUDE sqlca;
Baris tersebut memberitahukan precompiler bahwa terdapat struktur data SQLCA
dalam program. Bagian yang paling penting dari struktur ini adalah SQLCODE
variable dimana digunakan untuk mencek error. SQLCODE yang diset oleh DBMS :



SQLCODE dari nol mengindikasikan kalimat dijalankan sukses (walau
terdapat pesan peringatan pada sqlwarn)
SQLCODE negative mengindikasikan bahwa terjadi kesalahan. Nilai dari
SQLCODE mengindikasikan kesalahan spesifik yang terjadi.
SQLCODE positif mengindikasikan bahwa kalimat dijalankan sukses tetapi
kondisi pengecualian terjadi, seperti tidak terdapatnya beberapa baris lebih
yang dikembalikan oleh SELECT statement.
pada figure 21.2 hal 654 kita mencek negative SQLCODE(sqlca.sqlcode < 0) untuk
kelengkapan kalimat CONNECT dan CREATE TABLE yang tidak sukses.
Statement WHENEVER
Setiap embedded SQL statement potensial menghasilkan error. Secara jelas ,
mencek kesuksesan setelah suatu kalimat SQL dikerjakan, jadi precompiler Oracle
menyediakan method alternative untuk menyederhanakan penanganan error.
WHENEVER statement inilah yang merupakan petunjuk ke precompiler untuk
menghasilkan kode otomatis dalam menangani error setelah kalimat SQL. Format dari
WHENEVER statement : EXEC SQL WHENEVER <condition><action>
WHENEVER statement terdiri dari kondisi dan action yang dilakukan jika kondisi
yang terjadi seperti melanjutkan ke kalimat berikutnya, memanggil routine,
mencabangkan ke labeled statement, atau berhenti. Condition dapat berupa salah satu
dibawah ini :
 SQLERROR memberitahukan precompiler untuk menghasilkan kode untuk
menangani error (SQLCODE < 0)


SQLWARNING memberitahukan precompiler untuk menghasilkan kode untuk
menangani peringatan (SQLCODE > 0)
NOT FOUND memberitahukan precompiler untuk menghasilkan kode untuk
menangani peringatan yang spesifik dimana operasi yang dapat diperoleh
kembali tidak menemukan beberapa record.
Action dapat berupa :
 CONTINUE untuk menghilangkan kondisi dan proses pada kalimat berikut
 DO untuk mentransfer control ke fungsi yang menangani error. Ketika sampai
pada akhir routine, control transfer ke kalimat yang terdapat kalimat SQL yang
salah (kecuali fungsi menterminasi eksekusi program)
 DO BREAK untuk memindahkan actual ‘break’ statement dalam program. Ini
berguna untuk digunakan dalam perulangan untuk mengakhiri perulangan.
 DO CONTINUE , untuk memindahkan actual ‘continue’ statement dalam
program . ini berguna untuk digunakan dalam perulangan untuk melanjutkan ke
iterasi berikutnya dalam perulangan.
 GOTO label untuk mentransfer control ke label yang dispesifikasi
 STOP untuk kembali ke kerja yang salah dan tidak pasti dan menterminasi
program.
Contoh WHENEVER statement dalam segmen code :
EXEC SQL WHENEVER SQLERROR GOTO error1;
EXEC SQL INSERT INTO Viewing VALUES (‘CR76’,’PA14’,’12-May2001’, ‘Not enough space’);
EXEC SQL INSERT INTO Viewing VALUES (‘CR77’,’PA14’,’13-May2001’, ‘Quite like it’);
Akan dikonversi oleh precompiler menjadi :
EXEC SQL INSERT INTO Viewing VALUES (‘CR76’,’PA14’,’12-May-2001’,
‘Not enough space’);
if (sqlca.sqlcode<0) goto error1;
EXEC SQL INSERT INTO Viewing VALUES (‘CR77’,’PA14’,’13-May2001’, ‘Quite like it’);
if (sqlca.sqlcode<0) goto error1;
2.1.1.3
Host Language Variables
Adalah suatu variable program yang dideklarasikan dalam host language. ini
dapat berupa varibel tunggal maupun struktur. Variable host language dapat
digunakan dalam embedded SQL statement untuk mentransfer data dari database ke
program. Mereka juga dapat digunakan dalam clausa WHERE dalam kalimat
SELECT. Secara fakta , mereka dapat digunakan dimana saja yang secara tetap dapat
muncul. Akan tetapi , mereka tidak dapat digunakan untuk menwakili objek database
seperti nama table atau nama kolum .
Untuk menggunakan variable host dalam embedded SQL statement , nama
variable harus diawali colon (:). Sebagai contoh , kita memiliki variable program ,
increment, mewakili gaji yang meningkat dari staff member SL.21 kemudian kita
update gaji member menggunakan kalimat :
EXEC SQL UPDATE Staff SET salary=salary + increment
WHERE staffNo = ‘SL21’;
Variable host language harus dideklarasikan ke SQL seperti mendeklarasikan
sintaks dalam host language. semua variable host harus dideklarasikan ke SQL dalam
BEGIN DECLARE SECTION …END DECLARE SECTION block. Blok ini harus
muncul ketika beberapa variable digunakan dalam embedded SQL statement.
Menggunkan contoh sebelumnya, kita dapat mendapati deklarasi dari bentuk berikut
pada poin yang tepat sebelum kegunaan yang pertama pada variable host :
EXEC SQL BEGIN DECLARE SECTION
float increment;
EXEC SQL END DECLARE SECTION
Variable host language harus compatible dengan nilai SQL yang diwakilinya. Table
21.1 hal 257 menunjukan beberapa poin tipe data SQL Oracle dan tipe data
corresponding di ‘C’. ini memetakan perbedaan dari produk ke produk, yang secara
jelas membuat penulisan portable embedded SQL statement susah.catatan : tipe data
‘C’ untuk karakter string memerlukan carakter ekstra untuk mengijinkna terminator
null pada ‘C’ string.
Indicator variable
Kebanyakan bahasa pemograman tidak menyediakan dukungan untuk nilai
yang tidak dikenal/hilang seperti yang diwakili dalam model relational oleh nulls. Ini
menyebabkan masalah ketika null dimasukkan atau diretrieve dari suatu table.
Embedded SQL menyediakan indicator variable untuk mengatasi masalah ini. Tiap
variable host mempunyai variable asosiasi indicator yang dapat diset atau diperiksa.
Maksud dari variable indicator ini adalah sebagai berikut :
 Nilai indicator nol berarti variable host yang diasosiasi terdiri dari nilai yang
valid
 A-1 nilai berarti variable host yang diasosiasi harus diasumsikan terdiri dari
null (isi actual variable host tidak berhubungan).
 Nilai indicator positif berarti variable host yang diasosiasikan terdiri dari nilai
yang valid yang harus di bulatkan (variable host tidak cukup besar untuk nilai
yang dikembalikan)
Dalam embedded statement , suatu indicator variable di gunakan secara teratur
mengikuti variablel host yang diasosiasi dengan colon (:) yang memisahkan dua
variable. Sebagai contoh , untuk menset alamat colum owner CO21 menjadi
NULL, kita menggunakan segmen code berikut :
EXEC SQL BEGIN DECLARE SECTION
char address [51];
short addressInd;
EXEC SQL END DECLARE SECTION
addressInd=-1
EXEC SQL UPDATE PrivateOwner SET address = addres:addressInd
WHERE ownerNo = ‘CO21’;
Variable indicator merupakan variable integer 2-byte jadi kita
mendeklarasikan addressInd sebagai tipe short didalam BEGIN DECLARE
SECTION. Kita menset addressInd menjadi -1 untuk mengindikasikan variable host
yang diasosiasi , address harus diinterprestasikan sebagai NULL. Variable indicator
kemudian dipindahkanke kalimat UPDATE secara teratur mengikuti variable host ,
address. Di Oracle , variable indicator dapat secara optional diikuti keyword
INDICATOR untuk kemudahan pembacaan.
Ketika kita mencari data dari database dan itu memungkinkan kolom dalam
hasil query berupa null maka kita harus menggunakan variable indicator untuk kolum
tersebut, atau DBMS menghasilkan error dan menset SQLCODE pada nilai yang
negative.
21.1.4 Retrieving Data Using Embedded SQL and Cursors
Pada sesi 21.1.1 kita telah mendiskusikan mengenai statement SQL yang melekat
yang tidak menghasilkan hasil query apa pun. Kita juga dapat mengambil data dengan
menggunakan statement SELECT, akan tetapi prosesnya lebih kompleksjika query
tersebut manghasilkan lebih dari satu baris. Hasil yang kompleks tersebut berdasarkan
kenyataan bahwa sebagian bahasa pemrograman hanya dapat memproses data
individual atau baris individual. SQL menyediakan mekanisme kepada host language
untuk mengakses baris-baris dari query pada saat yang bersamaan.
SQL yang melekat terbagi mjd 2 grup :
 Single-row queries, dimana hasil query mengandung paling banyak 1 baris data.
 Multi-row queries, dimana hasil query boleh mengandung jumlah baris yang
berubah-ubah, bisa kosong, satu, atau lebih.
Single-row queries
Single-row queries ditangani oleh singleton select statement, yang mempunyai format
sama dengan statement SELECT yang dijelaskan pada sesi 5.3, dengan pemakaian
klausa INTO yang menspesifikasikan nama dari variable untuk menerima hasil query.
Klausa INTO mengikuti list SELECT. Harus ada hubungan korespondensi satu-satu
diantaranya. Contoh :
EXEC SQL SELECT fName,lName,address
INTO :firstName, :lastName, :address :addressInd
FROM PrivateOwner
WHERE ownerNo =’CO21’;
Pada contoh tersebut, nilai kolom fName ditempatkan pada variable firstName, lName
pada lastName, dan address pada address (bersama dengan indicator null untuk
addressInd)
Contoh 21.2 Single-row Query
* sintak dapat dilihat pada buku halaman 659, figure 21.3
Multi-row queries
Ketika query database dapat mengembalikan jumlah baris yang berubah-ubah, SQL
menggunakan kursor untuk mengembalikan data. Kursor mengizinkan host language
untuk mengakses baris pada hasil query secara bersama-sama. Efeknya,
kursorberfungsi sebagai pointer pada baris tertentu yang terdapat pada hasil query.
Kursor harus dideklarasikan dan dibuka sebelum dapat digunakan, dan harus ditutup
untuk menon-aktifkan setelah tidak diperlukan lagi. Baris dari hasil query dapat
diambil dengan statement FETCH, yang berlawanan dengan statement SELECT.
Format yang ada :
EXEC SQL DECLARE cursorName CURSOR FOR selectStatement
Contohnya, untuk mendeklarasikan kursor unutuk mengambil semua property untuk
staff dengan nomor SL41, kita dapat menulis :
EXEC SQL DECLARE propertyCursor CURSOR FOR
SELECT propertyNo, street, city
FROM PropertyForRent
WHERE StaffNo = ‘SL41’ ;
Statement OPENmengeksekusi query dan mengidentifikasi semua baris-baris yang
sesuai dengan kondisi pencarian query, dan posisi kursor sebelum baris pertama dari
table hasilnya. Format untuk statement OPEN adalah :
EXEC SQL OPEN cursorName
Contohnya, unutuk membuka kursor pada query paling atas, kita dapat menuliskan :
EXEC SQL OPEN propertyCursor ;
Statement FETCH menerima baris berikutnya pada set yang aktif. Format untuk
statement FETCH adalah :
EXEC SQL FETCH cursorName INTO {hostVariable [indicatorVariable]
[,…] }
Ketika cursorName merupakan nama dari kursor maka kursor tersebut akan terbuka.
Jumlah dari variable host pada klausa INTO harus sesuai dengan jumlah kolom pada
klausa SELECT pada query korespondennya pada statement DECLARE CURSOR.
Untuk contohnya, untukmengambil baris berikutnya pada hasil query contoh
sebelumnya, kita dapat menuluskan :
EXEC SQL FETCH propertyCursor
INTO :propertyNo, :street, :city ;
Statement FETCH memberi nilai pada kolom propertyNo menjadi variable
propertyNo, nilai kolom street menjadi variable street, dan seterusnya. Sejak
statement FETCH beroperasi pada baris tunggal dari hasil query, biasanya statement
FETCH tersebut akan menempatkan kedalam loop sebuah program.
Format dari CLOSE statement mirip dengan OPEN statement :
EXEC SQL CLOSE cursorName
Ketika cursorName yang menjadi nama kursor telah terbuka, untuk contohnya :
EXEC SQL CLOSE propertyCursor ;
Sekali kursor ditutup, set aktif akan tidak terdefinisi. Semua kursor secara otomatis
tertutup pada akhir transaksi. Ilustrasi poin tersebut dapat dilihat pada Contoh 21.3.
* contoh 21.4 dapat dilihat pada halaman 662
21.1.5 Using Cursor to Modify Data
Kursor hanya dapat dibaca (readonly) atau dapat diupdate (updateable). Jika
table/view teridentifikasi oleh kursor yang tidak dapat terupdate, maka kursor tersebut
bersifat readonly; atau jika kursor tersebut updateable, dan posisi statement UPDATE
dan DELETE CURRENT dapat digunakan. Baris dapat disisipkan secara langsung
pada table. Jika baris disisipkan setelah cursor ditetapkan dan kursor tersebut bersifat
readonly, efek dari perubahan tidak dapat dilihat melalui kursor tersebut sebelum
ditutup. Jika kursor tersebut updateable, standar ISOmengspesifikasikan efek
perubahan implementation-independent. Oracle tidak membuat row yang baru
dimasukkan terlihat pada aplikasi.
Untuk mengupdate datamelaui kursor, Oracle memerlukan pemanjangan sampingan
pada statement DECLARE CURSOR :
EXEC SQL DECLARE cursorName CURSOR FOR selectSTatement
FOR UPDATE OF columnName [,…]
Klausa FOR UPDATE OF harus mengurutkan kolom-kolom pada table yang
dinamakan pada selectStatement yang memerlukan updating; unutuk lebih jauhnya
lagi, kolom yang telah diurutkan harus tampil pada list SELECT. Format dari kursor
berbasisi statement UPDATE adalah :
EXEC SQL UPDATE TableName
SET columnName = dataVAle [,…]
WHERE CURRENT OF propertyCursor ;
Dimana cursorName adalah nama untuk membuka, cursor menjadi updateable.
Klausa WHERE tersedia hanya unutuk baris terspesifikasi diman ditunjuk oleh kursor
tersebut. Update mengefekkan hanya pada data dalam baris tersebut. Masing-masing
nama kolom pada klausa SET harus teridentifikasi untuk update dalam statement
DECLARE CURSOR. Contohnya :
EXEC SQ UPDATE PropertyForRent
SET staffNo = ‘SL22’
WHERE CURRENT OF propertyCursor ;
Staff number, staffNo yang terupdate pada baris tertentu dalam sebuah table
terasosiasikan pada kursor propertyCursor. Update yang ada tidak memajukan kursor,
jadi FETCH lainnya harus dilakukan unutuk memindahkan kursor maju pada baris
berikutnya.
Juga dimungkinkan unutuk dilakukan penghapusan baris melalui kursor yang
updateable. Format untuk statement DELETE :
EXEC SQL DELETE FROM TableName
WHERE CURRENT OF cursorName;
Dimana cursorName adalah nama yang dibuka, cursor terupdate. Untuk kesekian
kalinya, statement yang ada bekerja pada baris tertentu, dan FETCH harus
ditampilkan untuk memajukan kursor pada baris berikutnya. Contoh statementnya :
EXEC SQL DELETE FROM PropertyForRent
WHERE CURRENT OF propertyCursor ;
21.1.6 ISO Standard untuk Embedded SQL
Pada bagian ini, akan dibahas perbedaan antara bahasa Oracle Embedded SQL dengan
ISO Standard
Statement Whenever
ISO Standard tidak mengenali kondisi untuk SQLWARNING dari statement
WHENEVER
SQL Communications Area
 ISO Standard tidak mengenali SQL Communications Area, tetapi mengenali
variable integer SQLCODE.
 Selain dari itu, juga mendefinisikan parameter karakter string SQLSTATE,
terdiri dari 2 karakter class code diikuti 3 karakter subclass code.
 Oracle 8 menunjang mekanisme SQL STATE, tetapi untuk menggunakannya
kita harus mendeklarasikannya dalam DECLARE SECTION:
Char SQLSTATE[6];
 Setelah mengeksekusi perintah SQL, system akan mengembalikan status code
pada variable SQLSTATE. Status code menunjukkan eksekusi tersebut
berhasil, atau menimbulkan error.
Cursors
Statement untuk ISO DECLARE CURSOR sebagai berikut:
EXEC SQL DECLARE cursorName [INSENSITIVE] [SCROLL]
CURSOR FOR selectStatement
[FOR] {READ ONLY | UPDATE [OF columnNameList]}]
Jika keyword INSENSITIVE dipakai, maka efek perubahan terhadap tabel utama
tidak terlihat oleh user. Jika keyword SCROLL dipakai, user dapat mengakses baris
secara acak. Akses dispesifikasikan dalam statement fetch:
EXEC SQL FETCH [[fetchOrientation]FROM]cursorName
INTO hostVariable [,…]
dimana fetchOrientation bisa berupa:
 NEXT: mengambil baris berikut dari tabel hasil query mengikuti baris dari
tempat kursor berada.
 PRIOR: mengambil baris dari tabel hasil query didepan baris kursor berada.
 FIRST: mengambil baris pertama.
 LAST: mengambil baris terakhir.
 ABSOLUTE: mengambil baris spesifik berdasarkan nomor barisnya.
 RELATIVE: memindahkan kursor maju atau mundur dari baris ke posisi awal.
Dynamic SQL
Pada static SQL menyediakan fungsionalitas untuk pengembangan aplikasi
yang memungkinkan akses ke database menggunakan statement biasa SQL. Tipe SQL
ini sudah memenuhi untuk banyak aplikasi pemrosesan data.
Meskipun demikian, ada banyak situasi dari pola akses database yang tidak
tetap dan hanya dikenal pada eksekusi. Untuk itu ISO Standard menyediakan
pendekatan lain, yang disebut dynamic SQL.
Perbedaan utamanya adalah static SQL tidak mengijinkan host variabel
digunakan pada tempat nama tabel atau nama kolom. Contohnya dalam static SQL
kita tidak bisa menulis:
EXEC SQL BEGIN DECLARE SECTION;
Char TableName[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO :TableName
VALUES (‘CR76’,’PA14’,’05-May-2001’,’Not enough space’);
dimana static SQL mengharuskan nama tabel di INSERT statement dan bukan nama
host variabel. Kalau pun bisa, akan menimbulkan masalah dalam deklarasi kursor.
Bandingkan dengan:
EXEC SQL DECLARE cursor1 CURSOR FOR
SELECT *
FROM: TableName;
‘*’ mengindikasikan semua kolom dari tabel, TableName diperlukan dalam tabel
hasil, tetapi jumlah kolom dapat berbeda dengan pilihan dari tabel.
21.2.1 EXECUTE IMMEDIATE statement
Dasar ide dari dynamic SQL adalah untuk menempatkan SQL statement
untuk dieksekusi dalam host variabel. Cara termudah untuk melakukannya
dengan tidak memakai SELECT statement adalah menggunakan EXECUTE
IMMEDIATE statement, dengan format:
EXEC SQL EXECUTE IMMEDIATE [hostVariable | stringLiteral]
Sebagai contoh kita bisa menggantikan statement static SQL berikut:
EXEC SQL BEGIN DECLARE SECTION
float increment;
EXEC SQL END DECLARE SECTION
EXEC SQL UPDATE Staff SET salary=salary+increment
WHERE staffNO=’SL21’;
dengan:
EXEC SQL BEGIN DECLARE SECTION;
char buffer[100];
EXEC SQL END DECLARE SECTION;
sprintf(buffer,”UPDATE Staff SET salary=salary+%f
WHERE staffNo=’SL21’”,increment);
EXEC SQL EXECUTE IMMEDIATE:buffer;
21.2.2 PREPARE dan EXECUTE Statements
EXECUTE IMMEDIATE statement berguna hanya jika SQL
statement dieksekusi hanya sekali dalam program. Untuk eksekusi yang lebih
dari sekali, bisa digunakan PREPARE dan EXECUTE statement.
PREPARE statement menginstruksikan DBMS untuk mempersiapkan
statement dinamis untuk eksekusi selanjutnya.
Format dari PREPARE adalah:
EXEC SQL PREPARE statementName FROM [hostVariable |
stringLiteral]
dan format EXECUTE:
EXEC SQL EXECUTE statementName
[USING hostVariable [indicatorVariable] [,…] |
USING DESCRIPTOR descriptorName]
Clause USING hostVariable membuat bagian dari statement yang sudah
dipersiapkan yang tidak terspesifikasi, digantikan dengan placeholders
(parameter markers).
Placeholder adalah variable palsu yang dapat muncul di mana saja dalam
hostVariable/stringLiteral dari PREPARE statement. Placeholder tidak perlu
dideklarasikan dan dapat diberi nama apa saja.
21.2.3 The SQL Description Area
Placeholders merupakan satu cara untuk melewati parameter ke pernyataan
EXECUTE . SQLDA di gunakan ketita nomor pada placeholders dan type
datanya tidak diketahui ketika pernyataan di formulakan. Ada 2 pendekatan yg
berbeda dlam SQLDA dalam oracle.
Ada 2 pernyataan SQL untuk mengatur dan mengakses struktur ini:
 DESCRIBE BIND VARIABLE berisi di dlm SQLDA untuk banyak
variable khusus yg terapit dalam query
 DESCRIBE SELECT LIST berisi di dlm SQLDA ke data kolom ketika
diharapkan secara dinamik data berubah dan nomor kolom dapat diubah
atau type dalam kolom yg tdk diketahui.
ORACLE SQLDA
NAME
SQLDA: SQL Description Area
Struktur SQLDA :
Long N;
Char **V;
Long *L;
Short *T;
Short **I;
Long F;
Cgar **S;
Short *M
Short *C;
Char **X;
Short *Y:;
Short *Z;
};
21.2.4 Pernyataan DESCRIBE
Pernyataan DESCRIBE mengembalikan informasi deskriptif tentang
persiapan pernyataan sql. Dengan menyiapkan pernyataan SELECT ,
DESCRIBE isi memberikan SQLDA dengan nam type data, dan panjang
kolom dalam pernyataan SQL
Dengan non-SELECT statement, DESCRIBE disusun pada F field
dalam SQLDA mjd 0. dengan format penyataan DESCRIBE sebgagai berikut
:
EXEC SQL DESCRIBE BIND VARIABLES FOR statementName
INTO bindDescriptorName
EXEC SQL DESCRIBE SELECT LIST FOR statementName INTO
selectDescriptorName
Dimana
statementName
adalh
persiapan
penyataan
dan
bindDescriptionname adalah nama-nama inisial SQLDAs.
21.2.5 Retrieving data using dynamic SQL and dynamic
cursor menggunakan kembali data dengan menggunakan dynamic SQL dan
dynamic cursor
Prinsip dasar pada dynamic SQL adalah sama,walaupn ada beberapa
pernyataan yangberbeda. Kita masih menggunakan pernyataan DECLARE ,
OPEN , FETCH , dan CLOSE, tetapi dalam format yg seperti di bawah ini:
EXEC SQL DECLARE cursorName CURSOR FOR selectStatement
EXEC SQL OPEN cursorName {USING
hostVariable[indicatorVariable][,…]|
USING DESCRIPTOR descriptorName}
EXEC SQL FETCH cursorName {{USING
hostVariable[indicatorVariable][,…]|
USING DESCRIPTOR descriptorName}
EXEC SQL CLOSE cursorName
Pada pernyataan dynamic OPEN memperbolehkan nilai untuk
ditempatkan sebagi pengganti menggunakan satu atau lebih host variable
dalam
USING
atau
passing
nilai
menggunakan
descriptor
name(SQLDA)dalam kasus USING DESCRIPTOR. Perbedaan dalam
pernyataan dynamic FTCH , terlihat dimana menggunakan descriptor name
untuk menerima baris dari query hasil table.
Tahap dasar general dynamic sql statement seperti :
 Menyatakan suatu host string pada DECLARE SECTION untuk
menahan text pada query
 Menyatakan pilihan SQLDA dan jika dibutuhkan ,maka SQLDA di jepit
 Menyediakan tempat penyimpanan untuk SQLDA
 Mengatur max kolom pada pilihan SQLDA dan dalam query dapat
dinyatakan dalm placeholders, max nomor akan terdapat pada SQLDA
 Meletakkan text query pada host string
 PREPARE query dari host string
 DECLARE cursor dari query
 Jika query mendapatkan placeholders:
o DESCRIBE variable yg terapit dalam SQLDA
o Mereset semua nomor pd placeholders ke nomor yg dapat
ditemukan oleh DESCRIBE
o Mendapatkan nilai dan tempat penyimpanan unutk variable yg
terapiy yg ditemukan oleh DESCRIBE

OPEN cursor dengan menggunakan SQLDA trapit atau jika tidak ada
SQLDA yg terapit yg digunakan menggunakan select SQLDA

DESCRIBE list kolom ke dalam pilihan SQLDA

Mereset nomor dari list kolom ke nomor yg telah ditemukan oleh
DESCRIBE

Mereset panjang dan type data pada setiap list kolom

FETCH setiap baris dari database ke lokasi data buffer yg
dititikberatkan pada pilihan SQLDA dan proses yg dipantaskan

Tidak menyediakan tempat penyimapnan yg digunakan untuk list
kolom item , placeholders,indicator,variable dan SQLDAs

CLOSE cursor
21.2.6 Using Dynamic Cursor to Change Data
Dalam section di atas kita telah mendiskusika bagaimana data dapat di ubah
melalui kursor,dengan menggunakan extension ke interaktif UPDATE dan
DELETE statement. Dapat juga digunakan dalam dunamic SQL
21.2.7 ISO Standard for Dynamic SQL
SQLDA
Sql desrcription area dalam iso standard banyak memberikan variable
pada data abstrak dalam object-oriented sense. Programmer hanya
mengakses pada SQLDA dengan menggunakan suatu metode.
SQLDA yg alokasi dan dialokasikan menggunakan pernyataan :
ALLOCATE DESCRIPTOR descriptorName[WITH MAX
occurrences]
DEALLOCATE DESCRIPTOR descriptorName
SQLDA dapat diakses dengan menggunakan pernyataan :
GET DESCRIPTOR descriptorName {hostVariabel =COUNT |
VALUE itemNumberhostVariabel1=itemName[,..]}
SET DESCRIPTOR descriptorName{ COUNT=hostVariabel |
VALUE itemNumberitemName1=itemVariabel[,..]}
Beberapa perintah ISO descriptor antara lain:
 TYPE – type data pada item
 LENGTH – panjangnya data item
 INDICATOR – nilai asosiasi indicator
 DATA – nilai data
Beberapa ISO descriptor dengan nama khusus menggunakan GET
DESCRIPTOR seperti:
 PRECISION – digit number
 SCALE – skala type nomor
 NAME – nama kolom
 NULLABLE – jika 1 , maka kolom adl null , jika 0 , maka kolom tidak
null