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
© Copyright 2024 Paperzz