As400

327 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
327
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

As400

  1. 1. STORE PROCEDURE Store Procedure DB2 SQL For AS/400 memungkinkan sebuah aplikasi SQLmendefinisikan dan kemudian memanggil prosedur melalui pernyataan SQL. Store proceduredapat digunakan baik aplikasi DB2 SQL for AS/400 terdistribusi dan tidak terdistribusi. Satukeuntungan besar dalam menggunakan store procedure adalah bahwa untuk aplikasiterdistribusi, eksekusi satu perintah CALL pada aplikasi dapat membentuk sejumlahpekerjaan pada server aplikasi. Kita dapat mendefinisikan sebuah prosedur seperti sebuah prosedur SQL atau sebuahprosedure eksternal. Prosedure eksternal dapat mendukung bahasa pemrograman tingkattinggi (kecuali program dan prosedure System/36 *) atau prosedure REXX. Proseduretersebut tidak harus berisi pernyataan SQL, tetapi mungkin saja berisi pernyataan (statement)SQL. Sebuah prosedure SQL didefinisikan secara keseluruhan di SQL, dan dapatmengandung pernyataan SQL yang mencakup pernyataan cotrol SQL.Pembuatan store procedure membutuhkan pemahaman akan hal-hal berikut : • Store procedure didefinisikan melalui pernyataan CREATE PROCEDURE • Store procedure dipanggil melalui pernyataan CALL • Melewatkan parameter sesuai dengan prosedure yang dipanggil • Metode untuk mengembalikan status selesai ke program pemanggilan prosedur Kita dapat mendefinisikan store procedure menggunakan pernyataan CREATEPROCEDURE. Pernyataan CREATE PROCEDURE menambah prosedur dan definisiparameter ke tabel-tabel catalog, SYSPROCS, dan SYSPARMS. Pendefinisian ini kemudiandapat diakses dengan pernyataan SQL CALL pada sistem itu.MENDEFINISIKAN PROSEDUR EKSTERNALPernyataan CREATE PROCEDURE untuk prosedur eksternal terdiri dari : • Nama Prosedur • Definisi parameter dan atribut-atributnya • Pemberian informasi lain tentang prosedur yang akan digunakan system ketika prosedur dipanggil AS/400 | Universitas Gunadarma  1  
  2. 2. Perhatikan contoh berikut :EXEC SQL CREATE PROCEDURE P1(INOUT PARM1 CHAR(10))EXTERNAL NAME MYLIB.PROC1LANGUAGE CGENERAL WITH NULLS ;Pernyataan CREATE PROCEDURE di atas maksudnya adalah sebagai berikut: • Nama prosedur P1 • Mendefinisikan sebuah parameter yang digunakan baik sebagai parameter input dan output. Parameter tersebut adalah sebuah field character dengan panjang 10. Parameter dapat didefinisikan bertipe IN, OUT atau INOUT. Tipe parameter menentukan nilai untuk parameter ketika dimasukkan ke dan dari prosedur. • Mendefinisikan nama program yang berhubungan dengan prosedur tersebut, yaitu PROC1 dalam MYLIB. MYLIB.PROC1 adalah program yang dipanggil ketika prosedur dipanggil dengan pernyataan CALL. • Menunjukkan bahwa prosedur P1 (Program MYLIB.PROC1) ditulis dalam bahasa C. Bahasa pemrograman sangat penting jika ia memberi dampak terhadap tipe parameter yang dilewatkan. Hal ini juga memberi dampak bagaimana parameter dilewatkan ke prosedur (contoh, untuk prosedur ILE C, sebuah terminator NUL dilewatkan dalam bentuk parameter character, graphic, date, time dan timestamp). • GENERAL WITH NULLS menunjukkan bahwa parameter untuk prosedur boleh berisi nilai NULL. AS/400 | Universitas Gunadarma  2  
  3. 3. MENDEFINISIKAN PROSEDUR SQLPernyataan CREATE PROCEDURE untuk prosedur SQL : • Nama prosedur • Mendefinisikan parameter dan atribute-atributenya • Menyediakan informasi lain tentang prosedur yang akan digunakan ketika prosedur dipanggil Pertimbangkan contoh sederhana berikut yang mengambil nomor pegawai dan rata-ratasebagai parameter input dan mengubah gaji pegawai itu :EXEC SQL CREATE PROCEDURE UPDATE_SALARY_1(IN EMPLOYEE_NUMBER CHAR(10),IN RATE DECIMAL(6,2))LANGUAGE SQL MODIFIES SQL DATAUPDATE CORPDATA.EMPLOYEESET SALARY = SALARY * RATEWHERE EMPNO = EMPLOYEE_NUMBER ;Pernyataan CREATE PROCEDURE di atas maksudnya adalah : • Mendefinisikan parameter EMPLOYEE_NUMBER yang berfungsi sebagai parameter input dan bertipe character dengan panjang 6 dan parameter RATE sebagai parameter input dan bertipe decimal. • Menunjukkan bahwa prosedur adalah sebuah prosedur SQL yang mengubah data SQL. • Mendefinisikan badan prosedur sebagai sebuah pernyataan tunggal UPDATE. Ketika prosedur dipanggil, pernyataan UPDATE dijalankan menggunakan nilai yang disimpan dalam EMPLOYEE_NUMBER dan RATE. AS/400 | Universitas Gunadarma  3  
  4. 4. Sebagai pengganti pernyataan UPDATE, logika dapat ditambahkan ke prosedur SQLdengan menggunakan pernyataan kontrol SQL. Pernyataan kontrol SQL berisi hal-halberikut: • Pernyataan penugasan • Pernyataan CALL • Pernyataan CASE • Compound statement • Pernyataan FOR • Pernyataan IF • Pernyataan LOOP • Pernyataan REPEAT • Pernyataan WHILE Contoh berikut meminta masukan nomor pegawai dan tingkatan yang akan diperolehpada evaluasi akhir. Prosedur ini menggunakan pernyataan CASE untuk menentukanbesarnya kenaikan gaji dan bonus yang sesuai/cocok.EXEC SQL CREATE PROCEDURE UPDATE_SALARY_2(IN EMPLOYEE_NUMBER CHAR(6),IN RATING INT)LANGUAGE SQL MODIFIES SQL DATACASE RATINGWHEN 1UPDATE CORPDATA.EMPLOYEESET SALARY = SALARY * 1.10,BONUS = 1000WHERE EMPNO = EMPLOYEE_NUMBER; AS/400 | Universitas Gunadarma  4  
  5. 5. WHEN 2UPDATE CORPDATA.EMPLOYEESET SALARY = SALARY * 1.05,BONUS = 500WHERE EMPNO = EMPLOYEE_NUMBER;ELSEUPDATE CORPDATA.EMPLOYEESET SALARY = SALARY * 1.03,BONUS = 0WHERE EMPNO = EMPLOYEE_NUMBER;END CASE ;Pernyataan CREATE PROCEDURE di atas maksudnya adalah : • Nama prosedur UPDATE_SALARY_2 • Mendefinisikan parameter EMPLOYEE_NUMBER yang berfungsi sebagai parameter input dan bertipe character dengan panjang 6 dan parameter RATING sebagai parameter input dan bertipe integer. • Menunjukkan bahwa prosedur adalah sebuah prosedur SQL yang mengubah data SQL. • Mendefinisikan badan prosedur. Ketika prosedur dipanggil, nilai parameter RATING menguji dan mencocokan pernyataan UPDATE yang akan dijalankan. Pernyatan berganda dapat ditambahkan ke sebuah badan prosedur dengan menam-bahkancompound statement. Dalam compound statement, sejumlah pernyataan SQL dapatdigunakan. Sebagai tambahan, variabel SQL, kursor dan berbagai penanganan dapatdideklarasikan. AS/400 | Universitas Gunadarma  5  
  6. 6. Contoh berikut meminta masukan nomor departemen dan mendapatkan total gaji dariseluruh pegawai dalam departemen tersebut dan jumlah pegawai dalam departemen yangmendapatkan bonus.EXEC SQLCREATE PROCEDURE RETURN_DEPT_SALARY(IN DEPT_NUMBER CHAR(3),OUT DEPT_SALARY DECIMAL(15,2),LANGUAGE SQL READS SQL DATAP1 : BEGINDECLARE EMPLOYEE_SALARY DECIMAL(9,2) ;DECLARE EMPLOYEE_BONUS DECIMAL(9,2) ;DECLARE TOTAL_SALARY DECIMAL(15,2) ;DECLARE BONUS_CNT INT DEFAULT 0;DECLARE END_TABLE INT DEFAULT 0;DECLARE C1 CURSOR FORSELECT SALARY, BONUS FROM CORPDATA.EMPLOYEEWHERE WORKDEPT = DEPT_NUMBER;DECLARE CONTINUE HANDLER FOR NOT FOUNDSET END_TABLE = 1 ;DECLARE EXIT HANDLER FOR SQLEXCEPTIONSET DEPT_SALARY = NULL ;OPEN C1;FETCH C1 INTO EMPLOYEE_SALARY, EMPLOYEE_BONUS; AS/400 | Universitas Gunadarma  6  
  7. 7. WHILE END_TABLE = 0 DOSET TOTAL_SALARY = TOTAL_SALARY + EMPLOYEE_SALARY+ EMPLOYEE_BONUSIF EMPLOYEE_BONUS > 0 THENSET BONUS_CNT = BONUS_CNT + 1;END IF;FETCH C1 INTO EMPLOYEE_SALARY, EMPLOYEE_BONUS;END WHILE;CLOSE C1;SET DEPT_SALARY = TOTAL_SALARY;SET DEPT_BONUS_CNT = BONUS_CNT;END P1;Pernyataan CREATE PROCEDURE di atas maksudnya adalah : • Nama prosedur RETURN_DEPT_SALARY. • Mendefinisikan parameter DEPT_NUMBER yang berfungsi sebagai parameter input dan bertipe character dengan panjang 3, parameter DEPT_SALARY sebagai parameter output dan bertipe decimal, dan parameter DEPT_BONUS_CNT sebagai parameter output dan bertipe integer. • Menunjukkan bahwa prosedur adalah sebuah prosedur SQL yang membaca data SQL. • Mendefinisikan badan prosedur terdiri dari : Mendeklarasikan variabel SQL EMPLOYEE_SALARY dan TOTAL_SALARY bertipe decimal. Mendeklarasikan variabel SQL BONUS_CNT dan END_TABLE bertipe integer dan memberi harga awal 0. Mendeklarasikan kursor bernama C1 yang mengambil kolom dari tabel Employee. AS/400 | Universitas Gunadarma  7  
  8. 8. Mendeklarasikan sebuah continue handler untuk NOT FOUND, jika terpenuhi ubah variabel END_TABLE menjadi 1. Handler ini dilakukan ketika operasi FETCH tidak menemukan lagi record yang diinginkan. Ketika handler ini terjadi, SQLCODE dan SQLSTATE dirubah kembali ke 0 Mendeklarasikan exit handler untuk SQLEXCEPTION. Jika hal ini terjadi, DEPT_SALARY akan dibuat NULL dan pemrosesan compound statement dihentikan. Handler ini terjadi jika muncul kesalahan, contoh SQLSTATE tidak ‘00’, ‘01’ atau ‘02’. Jika handler ini terjadi, SQLCODE dan SQLSTATE dirubah menjadi 0. Jika handler untuk SQLEXCEPTION tidak ditentukan dan kesalahan yang muncultidak ditangani dalam handler yang lain, eksekusi compound statement dihentikan dankesalahan dikembalikan ke SQLCA. Indikasi yang sama menyebabkan SQLCA selaludikembalikan dari prosedur SQL. OPEN, FETCH dan CLOSE dari kursor C1. Jika pernyataan CLOSE tidak ada, kursor ditutup di akhir dari compound statement saat SET RESULT SETS tidak ditentukan dalam pernyataan CREATE PROCEDURE. Pernyataan WHILE yakni mengulang sampai akhir record ditemukan. Untuk masing- masing record yang terambil, TOTAL_SALARY ditambah dan jika bonus pegawai lebih dari 0, BONUS_CNT ditambah 1. Hasil DEPT_SALARY dan DEPT_BONUS_CNT sebagai parameter output. Contoh berikut meminta masukan nomor departemen. Hal ini untuk memastikan tabelEMPLOYEE_BONUS ada, dan masukkan semua pegawai yang mendapatkan bonus dalamdepartemen tersebut. Prosedur akan menghitung jumlah pegawai yang mendapatkan bonus.EXEC SQLCREATE PROCEDURE CREATE_BONUS_TABLE(IN DEPT_NUMBER CHAR(3),AS/400 hal. B.150 TSI PerbankanINOUT CNT INT) AS/400 | Universitas Gunadarma  8  
  9. 9. LANGUAGE SQL MODIFIES SQL DATACS1 : BEGIN ATOMICDECLARE NAME VARCHAR(30) DEFAULT NULL;DECLARE CONTINUE HANDLER FOR 42710SELECT COUNT(*) INTO CNTFROM DATALIB.EMPLOYEE_BONUS;DECLARE CONTINUE HANDLER FOR 23505SET CNT = CNT + 1;DECLARE UNDO HANDLER FOR SQLEXCEPTIONSET CNT = NULL;IF DEPT_NUMBER IS NOT NULL THENCREATE TABLE DATALIB.EMPLOYEE_BONUS(FULLNAME VARCHAR(30),BONUS DECIMAL(10,2))PRIMARY KEY (FULLNAME);FOR_1 : FOR V1 AS C1 CURSOR FORSELECT FIRSTNME, MIDINIT, LASTNAME, BONUSFROM CORPDATA.EMPLOYEEWHERE WORKDEPT = CREATE_BONUS_TABLE.DEPT_NUMBER;IF BONUS > 0 THENSET NAME = FIRSTNME | | ‘ ‘ | | MIDINIT | | ‘ ‘ | | LASTNAME; AS/400 | Universitas Gunadarma  9  
  10. 10. INSERT INTO DATALIB.EMPLOYEE_BONUS;VALUES(CS1.NAME, FOR_1.BONUS);SET CNT = CNT + 1;END IF;END FOR FOR_1;END IF;END CS1;Pernyataan CREATE PROCEDURE di atas maksudnya adalah : • Nama prosedur CREATE_BONUS_TABLE • Mendefinisikan parameter DEPT_NUMBER sebagai parameter input dengan tipenya character dan panjang 3 serta parameter CNT sebagai parameter input dan output bertipe integer. • Menunjukkan bahwa prosedur adalah sebuah prosedur SQL yang mengubah data SQL. • Mendefinisikan badan prosedur, terdiri dari : Deklarasikan Variabel SQL NAME bertipe varying character (VarChar) Deklarasi continue handler untuk SQLSTATE 42710, menyatakan tabel sudah ada. Jika tabel EMPLOYEE_BONUS sudah ada, handler akan dijalankan dan mengambil nomor record di dalam tabel. SQLCODE dan SQLSTATE dirubah ke 0 dan pemrosesan dilanjutkan dengan pernyataan FOR. Deklarasi continue handler untuk SQLSTATE 23505, yang artinya kunci duplikat. Jika prosedur berusaha untuk memasukkan sebuah nama yang sudah ada di dalam tabel, handler itu menambah nilai CNT dengan 1. Pemrosesan dilanjutkan pada pernyataan SET yang mengikuti pernyataan INSERT. Deklarasi handler UNDO untuk SQLEXCEPTION. Jika terjadi, maka akan kembali ke pernyataan sebelumnya, CNT diubah ke 0 dan pemrosesan dilanjutkan sesudah compound statement. Dalam kasus ini, jika tidak ada compound statement yang mengikuti, prosedur dikembalikan. AS/400 | Universitas Gunadarma  10  
  11. 11. Gunakan pernyataan FOR untuk deklarasi kursor C1 untuk membaca record dari tabel EMPLOYEE. Dengan pernyataan FOR, nama kolom dari daftar select digunakan sebagai variabel SQL yang berisi data dari baris yang terambil. Untuk masing-masing record, data dari kolom FIRSTNME, MIDINIT dan LASTNAME digabung dengan spasi diantaranya dan hasilnya diletakkan dalam variabel SQL NAME. Variabel SQL NAME dan BONUS dimasukkan ke tabel EMPLOYEE_BONUS. Karena tipe data dari item yang ada dalam daftar select harus diketahui saat prosedur dibuat, tabel yang digunakan dalam pernyataan FOR harus ada ketika prosedur dibuat. Kita juga dapat menggunakan dynamic SQL dalam prosedur SQL. Contoh berikutmembuat tabel yang berisi semua pegawai dalam departemen yang ditentukan. Nomordepartemen merupakan input ke prosedur dan digabungkan ke nama tabel.CREATE PROCEDURE CREATE_DEPT_TABLE (IN P_DEPT CHAR(3))LANGUAGE SQLBEGINDECLARE STMT CHAR(1000);DECLARE MESSAGE CHAR(20);DECLARE TABLE_NAME CHAR(30);DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONSET MESSAGE = ‘ok’;SET TABLE_NAME = ‘DEPT_’ yy P_DEPT YY ‘_T’;SET STMT = ‘DROP TABLE ‘ yy TABLE_NAME;PREPARE S1 FROM STMT;EXECUTE S1; AS/400 | Universitas Gunadarma  11  
  12. 12. SET STMT = ‘CREATE TABLE ‘ yy TABLE_NAME yy‘( EMPNO CHAR(6) NOT NULL,FIRSTNME VARCHAR(6) NOT NULL,MIDINIT CHAR(1) NOT NULL,LASTNAME CHAR(15) NOT NULL,SALARY DECIMAL(9,2))’;PREPARE S2 FROM STMT;EXECUTE S2;SET STMT = ‘INSERT INTO ‘ yy TABLE_NAME yy‘SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARYFROM EMPLOYEEWHERE WORKDEPT = ?’ ;PREPARE S3 FROM STMT;EXECUTE S3 USING P_DEPT;END;Pernyataan CREATE PROCEDURE di atas adalah : • Nama prosedur CREATE_DEPT_TABLE • Mendefinisikan parameter P_DEPT sebagai parameter input dan bertipe character dengan panjang 3. • Menunjukkan prosedur adalah prosedur SQL. • Mendefinisikan badan prosedur. Deklarasi variabel SQL STMT dan TABLE_NAME bertipe character Deklarasi sebuah handler CONTINUE. Prosedur mencoba untuk menghapus tabel yang sudah ada. Jika tabel tidak ada, EXECUTE pertama akan gagal. Dengan handler ini, pemrosesan akan berlanjut. Menetapkan variabel TABLE_NAME AS/400 | Universitas Gunadarma  12  
  13. 13. menjadi ‘DEPT_’ diikuti oleh character yang dilewatkan dalam parameter P_DEPT, diikuti oleh ‘_T’. Menetapkan variabel STMT ke pernyataan DROP, dan mempersiapkan serta menjalankan pernyataan tersebut. Menetapkan variabel STMT untuk pernyataan CREATE, dan mempersiapkan serta menjalankan pernyataan tersebut. Menetapkan variabel STMT untuk pernyataan INSERT dan mempersiapkan serta menjalankan pernyataan tersebut. Sebuah parameter tanda ditentukan dalam klausa WHERE. Ketika pernyataan dijalankan, variabel P_DEPT disertakan pada klausa USING. Contoh jika prosedur memanggil nilai ‘D21’ untuk departemen, tabel DEPT_D21_Tdibuat dan tabel diisi dengan seluruh data pegawai yang berada di departemen ‘D21’.PEMANGGILAN STORED PROCEDURE Pernyataan CALL memanggil sebuah stored procedure. Dalam pernyataan CALL,nama dari stored procedure dan argumennya ditetapkan. Argumen dapat berupa konstanta,register khusus, atau host variable. External Stored Procedure yang ditentukan dalampernyataan CALL tidak perlu memiliki hubungan dengan pernyataan CREATEPROCEDURE. Program yang dibuat dengan prosedur SQL hanya dapat dipanggil denganmenyebutkan nama prosedur yang ditentukan pada pernyataan CREATE PROCEDURE. Adatiga tipe pernyataan CALL yang membutuhkan pengalamatan sejak DB2 SQL for AS/400memiliki perbedaan aturan untuk masing-masing tipe, yaitu : • Pernyataan CALL yang dynamic atau embedded dimana sebuah prosedur yang didefinisikan telah ada • Pernyataan CALL embedded dimana tidak ada prosedur yang telah didefinisikan • Pernyataan CALL dynamic dimana tidak ada CREATE PROCEDURECatatan : Dynamic di sini berdasarkan pada : • Sebuah persiapan secara dinamik dan dijalankan pernyataan CALL AS/400 | Universitas Gunadarma  13  
  14. 14. • Sebuah Pernyataan CALL dikeluarkan dalam sebuah lingkungan yang interaktif (contoh melalui STRSQL atau Query Manager) • Sebuah pernyataan CALL dijalankan dalam sebuah pernyataan EXECUTE IMMEDIATE.Penggunaan pernyataan CALL dengan Definisi Prosedur Sudah Ada Tipe pernyataan CALL ini mendapatkan seluruh informasi tentang prosedur danatribut argumen dari definisi catalog CREATE PROCEDURE. Contoh PL/I berikutmenunjukkan sebuah pernyataan CALL yang berhubungan ke pernyataan CREATEPROCEDURE.DCL HV1 CHAR(10);DCL IND1 FIXED BIN(15);:EXEC SQL CREATE P1 PROCEDURE(INOUT PARM1 CHAR(10))EXTERNAL NAME MYLIB.PROC1LANGUAGE CGENERAL WITH MULLS;:EXEC SQL CALL P1 (:HV1 :IND1);: Ketika pernyataan CALL dikerjakan, pemanggilan ke program MYLIB/PROC1dibuat dan dua argumen diberikan. Jika bahasa pemrograman adalah ILE C, argumen pertamaadalah sebuah C NUL – string terdiri dari 11 character berisi indicators host variable HV1. AS/400 | Universitas Gunadarma  14  
  15. 15. Perlu dicatat bahwa pada pemanggilan sebuah prosedur ILE C, DB2 SQL for AS/400menambahkan satu character ke parameter yang dideklarasikan jika parameter dideklarasikanmenjadi variabel bertipe character, graphic, date, time atau timestamp. Argumen keduaadalah array. Dalam kasus ini, ada satu short integer jika ada satu parameter dalampernyataan CREATE PROCEDURE. Argumen ini memuat isi dari indicator variable IND1pada masukan ke prosedur. Saat parameter pertama dideklarasikan sebagai INOUT, SQL mengubah indicatorhost variable HV1 dan indicator variable IND1 dengan nilai yang diperoleh dariMYLIB.PROC1 sebelum pengembalian ke program user. Catatan : Nama prosedur yang ditentukan pada pernyataan CREATE PROCEDURE dan CALL harus sesuai dan tepat untuk maksud hubungan diantara kedua-nya yang dibuat selama SQL precompile dari program. Untuk sebuah pernyataan CALL embedded dimana baik pernyataan CREATEPROCEDURE dan DECLARE PROCEDURE sudah ada, pernyataan DECLAREPROCEDURE yang akan digunakan.Penggunaan Pernyataan CALL Embedded dengan Prosedur yang Didefinisikan TidakAda Sebuah pernyataan static CALL tanpa sebuah hubungan dengan pernyataan CREATEPROCEDURE dijalankan dengan aturan sebagai berikut: • Semua argumen host variable diperlakukan sebagai parameter bertipe INOUT • Tipe CALL adalah umum (tidak ada indikator argumen yang diberikan) • Program yang memanggil pendefinisiannya berdasarkan pada nama prosedur yang ditentukan pada CALL • Bahasa pemrograman untuk program yang dipanggil pendefinisiannya berdasarkan pada informasi yang diambil dari system tentang program.Contoh :DCL HV2 CHAR(10) ; AS/400 | Universitas Gunadarma  15  
  16. 16. :EXEC SQL CALL P2 ( : HV2) ;: Ketika pernyataan CALL dikerjakan, DB2 SQL for AS/400 berusaha untukmenemukan program berdasarkan pada standar penamaan SQL. Untuk contoh di atas,misalkan pilihan penamaan dari *SYS (penamaan system) digunakan dan sebuah parameterDFTRDBCOL belum ditentukan pada perintah CRTSQLPLI. Dalam kasus ini, dalam daftarlibrary dicari sebuah program bernama P2. Sejak tipe pemanggilan adalah GENERAL, tidakada tambahan argumen diberikan ke program untuk indicator variable. Catatan : jika sebuah indicator variable ditetapkan pada pernyataan CALL dan nilainya lebih kecil dari 0 ketika pernyataan CALL dijalankan, sebuah kesalahan diperoleh karena tidak ada cara untuk memberikan indikator ke prosedur. Misalnya program P2 ditemukan dalam daftar library, isi dari host variable HV2diberikan ke program yang ada di CALL dan mengembalikan argumen dari P2 ke hostvariable setelah P2 selesai dijalankan.Penggunaan Pernyataan CALL Embedded dengan SQLDA Tipe CALL embedded (dimana sebuah prosedur yang telah ada boleh didefinisikanatau tidak), sebuah SQLDA mungkin akan diberikan dibandingkan sebuah daftar parameter,seperti diilustrasikan dalam contoh berikut. Misalkan stored procedure ini membutuhkan 2parameter, tipe pertama SHORT INT dan kedua CHAR dengan panjang 4.#define SQLDA_HV_ENTRIES 2#define SHORTINT 500#define NUL_TERM_CHAR 460exec sql include sqlca;exec sql include sqlda; AS/400 | Universitas Gunadarma  16  
  17. 17. …typedef struct sqlda Sqlda;typedef struct sqlda* Sqldap;…main(){Sqldap dap;short col1;char col2[4];int bc;dap = (Sqldap) malloc(bc=SQLDASIZE(SQLDA_HV_ENTRIES));/* SQLDASIZE is a macro defined in the sqlda include */col1 = 431;strcpy(col2,"abc");strncpy(dap->sqldaid,"SQLDA ",8);dap->sqldabc = bc; /* bc set in the malloc statement above */dap->sqln = SQLDA_HV_ENTRIES;dap->sqld = SQLDA_HV_ENTRIES;dap->sqlvar[0].sqltype = SHORTINT;dap->sqlvar[0].sqllen = 2;dap->sqlvar[0].sqldata = (char*) &col1;dap->sqlvar[0].sqlname.length = 0; AS/400 | Universitas Gunadarma  17  
  18. 18. dap->sqlvar[1].sqltype = NUL_TERM_CHAR;dap->sqlvar[1].sqllen = 4;dap->sqlvar[1].sqldata = col2;...EXEC SQL CALL P1 USING DESCRIPTOR :*dap;...} Perlu dicatat bahwa nama dari prosedur yang dipanggil dapat juga disimpan dalamsebuah host variable dan host variable itu digunakan dalam pernyataan CALL tersebut....main( ){char proc_name[15];...strcpy (proc_name, "MYLIB.P3");...EXEC SQL CALL :proc_name ...;...} Pada contoh di atas, MYLIB.P3 mengharapkan parameter, kemudian juga mungkindigunakan sebuah daftar parameter atau sebuah SQLDA yang diberikan melalui klausaUSING DESCRIPTOR itu, sebagaimana ditunjukkan dalam contoh sebelumnya. AS/400 | Universitas Gunadarma  18  
  19. 19. Ketika sebuah host variable berisi nama prosedur yang digunakan dalam pernyataanCALL dan sebuah definisi catalog CREATE PROCEDURE ada, akan digunakan. Namaprosedur tidak dapat ditetapkan sebagai sebuah tanda parameter.Penggunaan Pernyataan CALL Dinamik dengan CREATE PROCEDURE tidak ada Aturan berikut berhubungan untuk memproses sebuah pernyataan CALL dinamikketika tidak ada definisi CREATE PROCEDURE : • Seluruh argumen diperlakukan sebagai parameter bertipe IN • Tipe CALL adalah GENERAL (tidak ada indikator argumen yang diberikan). • Program yang memanggil pendefinisiannya berdasarkan pada nama prosedur yang ditentukan pada CALL • Bahasa pemrograman untuk program yang dipanggil pendefinisiannya berdasarkan pada informasi yang diambil dari system tentang program.Berikut ini contoh pernyataan CALL dinamik menggunakan bahasa C.char hv3[10],string[100];:strcpy(string,"CALL MYLIB.P3 (P3 TEST)");EXEC SQL EXECUTE IMMEDIATE :string;: Contoh ini menggambarkan pernyataan CALL dinamik yang dijalankan melaluisebuah pernyataan EXECUTE IMMEDIATE. Pernyataan CALL ini dibuat dalam programMYLIB.P3 dengan satu parameter yang bertipe character berisi ‘P3 TEST’. Ketika menjalankan sebuah pernyataan CALL dan melewatkan sebuah konstanta,seperti yang sudah dijelaskan sebelumnya, panjang dari argumen yang diharapkan di dalamprogram harus tetap dijaga. Jika program MYLIB.P3 mengharapkan sebuah argumen yangberisi hanya 5 character, 2 character terakhir dari konstanta yang ditentukan di dalam contohakan hilang di program. AS/400 | Universitas Gunadarma  19  
  20. 20. Catatan : untuk alasan ini, maka simpanlah selalu host variable yang digunakan pada pernyataan CALL sehingga atribut dari prosedur dapat disesuaikan dengan tepat sehingga character tidak akan hilang. Untuk SQL host variable dynamic dapat ditentukan untuk argumen pernyataan CALL jika pernyataan PREPARE dan EXECUTE digunakan untuk memprosesnya.Untuk melewatkan konstanta numerik pada sebuah pernyataan CALL, perhatikan aturanberikut : • Seluruh konstanta integer dilewatkan sebagai fullword binary integer. • Seluruh konstanta decimal dilewatkan sebagai nilai packed decimal. Presisi dan skala ditentukan berdasarkan pada nilai konstanta. Misalnya, nilai 123.45 dilewatkan sebagai packed decimal(5,2). • Seluruh konstanta floating point dilewatkan sebagai double-precision floating point.Special register ditentukan pada sebuah pernyataan CALL dinamik dengan ketentuan : • CURRENT DATE dilewatkan sebagai sebuah character string 10-byte dalam format ISO. • CURRENT TIME dilewatkan sebagai sebuah character string 8-byte dalam format ISO. • CURRENT TIMESTAMP dilewatkan sebagai character string 26-byte dalam format IBM SQL. • CURRENT TIMEZONE dilewatkan sebagai sebuah packed decimal number dengan presisi 6 dan skala 0. • CURRENT SERVER dilewatkan sebagai sebuah varchar 18-byte.MELEWATKAN PARAMETER yang BIASA DIGUNAKAN untuk STOREDPROCEDURE Pernyataan CALL dapat melewatkan argumen untuk program yang ditulis dalamseluruh host language dan prosedur REXX yang telah didukung. Masing-masing bahasamendukung perbedaan tipe data yang disesuaikan di dalamnya. Jenis data SQL terdapat AS/400 | Universitas Gunadarma  20  
  21. 21. dalam kolom paling kiri dari tabel yang mengikutinya. Kolom lain dalam baris tersebut berisisebuah indikator dimana tipe datanya didukung oleh tipe parameter untuk particularlanguage. Jika kolom mengandung sebuah dash (-), tipe data tidak didukung sebagai sebuahtipe parameter untuk bahasa tersebut. Sebuah deklarasi host variable menunjukkan bahwaDB2 SQL for AS/400 mendukung tipe data ini sebagai sebuah parameter di bahasa ini.Deklarasi itu menunjukkan bagaimana host variable harus dideklarasikan untuk menerimadan diatur oleh prosedur secara benar. Ketika pemanggilan sebuah prosedur SQL, seluruhtipe data SQL didukung sehingga kolom yang tidak ada disediakan dalam tabel.Table Data Types of Parameters COBOL for AS/400 and SQL Data Type C and C++ CL ILE COBOL for AS/400 SMALLINT short - PIC S9(4) BINARY INTEGER long - PIC S9(9) BINARY PIC S9(p-s)V9(s) PACKED- TYPE(*DEC) DECIMAL(p,s) Decimal(p,s) DECIMAL Note: LEN(p s) Precision must not be greater than 18. PIC S9(p-s)V9(s) DISPLAY SIGN LEADING NUMERIC(p,s) - - SEPARATE Note: Precision must not be greater than 18. AS/400 | Universitas Gunadarma  21  
  22. 22. COMP-1 Note: OnlyREAL or FLOAT(p) float - supported for ILE COBOL for AS/400. COMP-2 DOUBLE Note: Only PRECISION or double - supported for ILE FLOAT or COBOL for FLOAT(p) AS/400. TYPE(*CHAR) CHARACTER(n) char ... [n+1] PIC X(n) LEN(n) Varying-Length Character String VARCHAR(n) char ... [n+1] - (see COBOL chapter) Note: Only supported for ILE COBOL for AS/400. Varying-Length Character String VARCHARVARCHAR(n) FOR (see COBOL structured form (see - BIT DATA chapter) Note: Only C chapter) supported for ILE COBOL for AS/400. PIC G(n) GRAPHIC(n) wchar_t ... [n+1] - DISPLAY-1 or PIC N(n) Note: Only AS/400 | Universitas Gunadarma  22  
  23. 23. supported for ILE COBOL for AS/400. Varying-Length Graphic String (see VARGRAPHIC COBOL chapter) VARGRAPHIC(n) structured form (see - Note: Only C chapter) supported for ILE COBOL for AS/400. TYPE(*CHAR) DATE char ... [11] PIC X(10) LEN(10) TYPE(*CHAR) TIME char ... [9] PIC X(8) LEN(8) TYPE(*CHAR) TIMESTAMP char ... [27] PIC X(26) LEN(26)INDICATOR VARIABLE dan STORED PROCEDURE Indicator Variable dapat digunakan dengan pernyataan CALL, host variabledigunakan untuk penyediaan parameter, untuk melewatkan informasi tambahan ke dan dariprosedur. Indicator variable adalah alat standar SQL yang menunjukkan keterkaitan hostvariable sebaiknya diartikan mengandung nilai null, dan ini adalah pemakaian utama mereka. Untuk menunjukkan bahwa sebuah keterkaitan host variable berisi nilai null, indicatorvariable, yakni sebuah integer dua-byte, telah diubah menjadi bernilai negatif. Sebuahpernyataan CALL dengan indicator variable diproses sebagai berikut : • Jika indicator variable bernilai negatif, berarti menunjukkan nilai null. Sebuah nilai default diberikan untuk host variable yang terkait pada CALL dan indicator variable yang dilewatkan tidak berubah. AS/400 | Universitas Gunadarma  23  
  24. 24. • Jika indicator variable tidak negatif, ini menunjukkan bahwa host variable berisi sebuah nilai non-null. Dalam kasus ini, host variable dan indicator variable yang dilewatkan tidak berubah. Perlu dicatat bahwa aturan pemrosesan ini sama untuk memasukkan parameter keprosedur dan output parameter yang dikembalikan dari prosedur. Ketika indicator variabledigunakan bersama dengan Stored Procedure, metode pemrograman yang benar untukmenangani adalah pertama, mengecek nilai dari indicator variable sebelum menggunakanhost variable yang terkait. Contoh berikut menggambarkan penanganan indicator variable dalam pernyataan CALL.Perlu dicatat bahwa pengecekan nilai indicator variable dilakukan sebelum menggunakanvariabel yang terkait. Metode yang melewatkan indicator variable ke prosedur PROC1(sebagai argumen ketiga) berisi sebuah array dengan nilai dua-byte.Misalnya sebuah prosedur didefinisikan sebagai berikut :CREATE PROCEDURE PROC1(INOUT DECIMALOUT DECIMAL(7,2), INOUT DECOUT2 DECIMAL(7,2))EXTERNAL NAME LIB1.PROC1 LANGUAGE RPGLEGENERAL WITH NULLS)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Program CRPG+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D INOUT1 S 7P 2D INOUT1IND S 4B 0D INOUT2 S 7P 2D INOUT2IND S 4B 0C EVAL INOUT1 = 1C EVAL INOUT1IND = 0C EVAL INOUT2 = 1C EVAL INOUT2IND = -2C/EXEC SQL CALL PROC1 (:INOUT1 :INOUT1IND , :INOUT2C+ :INOUT2IND)C/END-EXEC AS/400 | Universitas Gunadarma  24  
  25. 25. C EVAL INOUT1 = 1C EVAL INOUT1IND = 0C EVAL INOUT2 = 1C EVAL INOUT2IND = -2C/EXEC SQL CALL PROC1 (:INOUT1 :INOUT1IND , :INOUT2C+ :INOUT2IND)C/END-EXECC INOUT1IND IFLT 0C* :C* HANDLE NULL INDICATORC* : C ELSEC* :C* INOUT1 CONTAINS VALID DATAC* :C ENDIFC* :C* HANDLE ALL OTHER PARAMETERSC* IN A SIMILAR FASHIONC* :C RETURN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++End of PROGRAM CRPG++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Program PROC1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++D INOUTP S 7P 2D INOUTP2 S 7P 2D NULLARRAY S 4B 0 DIM(2)C *ENTRY PLIST AS/400 | Universitas Gunadarma  25  
  26. 26. C PARM INOUTPC PARM INOUTP2C PARM NULLARRAYC NULLARRAY(1) IFLT 0C* :C* INOUTP DOES NOT CONTAIN MEANINGFUL DATAC*C ELSEC* :C* INOUTP CONTAINS MEANINGFUL DATAC* :C ENDIFC* PROCESS ALL REMAINING VARIABLESC* C* BEFORE RETURNING, SET OUTPUT VALUE FOR FIRSTC* PARAMETER AND SET THE INDICATOR TO A NON-NEGATIV C* VALUE SOTHAT THE DATA IS RETURNED TO THE CALLING C* PROGRAMC*C EVAL INOUTP2 = 20.5C EVAL NULLARRAY(2) = 0C*C* INDICATE THAT THE SECOND PARAMETER IS TO CONTAIN C* THE NULLVALUE UPON RETURN. THERE IS NO POINTC* IN SETTING THE VALUE IN INOUTP SINCE IT WONT BEC* PASSED BACK TO THE CALLER.C EVAL NULLARRAY(1) = -5C RETURN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++End of PROGRAM PROC1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AS/400 | Universitas Gunadarma  26  
  27. 27. Mengembalikan Status Selesai ke Program Dipanggil Satu metode pengembalian sebuah status ke program SQL yang mengeluarkanpernyataan CALL adalah untuk mengkodekan tipe parameter INOUT tambahan danmenentukannya sebelum mengembalikan dari prosedur. Ketika prosedur sedang dipanggiloleh program yang ada, hal ini tidak mungkin selalu terjadi. Metode lain untuk pengembalian status ke program SQL yang mengeluarkanpernyataan CALL adalah mengirim sebuah escape message ke program yang dipanggil(program sistem operasi QSQCALL) yang meminta prosedur tersebut. Program yangdipanggil yang meminta prosedur adalah QSQCALL. Masing-masing bahasa memilikimetode untuk penandaaan kondisi dan pengiriman pesan. Merujuk ke masing-masing bahasauntuk menentukan cara yang tepat dalam pemberian tanda sebuah pesan. Ketika pesantersebut merupakan tanda, QSQCALL menghasilkan error SQLCODE/ SQLSTATE –443/38501.CONTOH – CONTOH PROGRAM Contoh ini menunjukkan bagaimana argumen-argumen dari pernyataan CALLdilewatkan ke prosedur untuk beberapa bahasa. Contoh Ini juga menunjukkan bagai-manamenerima argumen-argumen ke lokal variabel di prosedur.Contoh pertama menunjukkan pemanggilan program ILE C yang menggunakan definisiCREATE PROCEDURE untuk memanggil prosedur P1 dan P2. Prosedur P1 ditulis dalambahasa C dan memiliki 10 parameter. Prosedur P2 ditulis dalam PL/1 dan juga memiliki 10parameter. Misalnya dua prosedur didefinisikan sebagai berikut :EXEC SQL CREATE PROCEDURE P1 (INOUT PARM1 CHAR(10), INOUT PARM2 INTEGER, INOUT PARM3 SMALLINT, INOUT PARM4 FLOAT(22), INOUT PARM5 FLOAT(53), INOUT PARM6 DECIMAL(10,5), INOUT PARM7 VARCHAR(10), AS/400 | Universitas Gunadarma  27  
  28. 28. INOUT PARM8 DATE, INOUT PARM9 TIME, INOUT PARM10 TIMESTAMP)EXTERNAL NAME TEST12.CALLPROC2LANGUAGE C GENERAL WITH NULLSEXEC SQL CREATE PROCEDURE P2 (INOUT PARM1 CHAR(10), INOUT PARM2 INTEGER, INOUT PARM3 SMALLINT, INOUT PARM4 FLOAT(22), INOUT PARM5 FLOAT(53), INOUT PARM6 DECIMAL(10,5), INOUT PARM7 VARCHAR(10), INOUT PARM8 DATE, INOUT PARM9 TIME, INOUT PARM10 TIMESTAMP)EXTERNAL NAME TEST12.CALLPROCLANGUAGE PLI GENERAL WITH NULLSContoh 1. Prosedur ILE C dan PL/1 dipanggil dari Aplikasi ILE C/***********************************************************************//*********** START OF SQL C Application ***********************/#include <stdio.h>#include <string.h>#include <decimal.h>main(){EXEC SQL INCLUDE SQLCA;char PARM1[10];signed long int PARM2;signed short int PARM3;float PARM4; AS/400 | Universitas Gunadarma  28  
  29. 29. double PARM5;decimal(10,5) PARM6;struct { signed short int parm7l;char parm7c[10];} PARM7;char PARM8[10]; /* FOR DATE */char PARM9[8]; /* FOR TIME */char PARM10[26]; /* FOR TIMESTAMP *//*********************************************************//* Initialize variables for the call to the procedures *//*********************************************************/strcpy(PARM1,"PARM1");PARM2 = 7000;PARM3 = -1;PARM4 = 1.2;PARM5 = 1.0;PARM6 = 10.555;PARM7.parm7l = 5;strcpy(PARM7.parm7c,"PARM7");strncpy(PARM8,"1994-12-31",10); /* FOR DATE */strncpy(PARM9,"12.00.00",8); /* FOR TIME */strncpy(PARM10,"1994-12-31-12.00.00.000000",26);/* FOR TIMESTAMP *//************************************************//* Call the C procedure *//* *//***********************************************/EXEC SQL CALL P1 (:PARM1, :PARM2, :PARM3,:PARM4, :PARM5,:PARM6,:PARM7, :PARM8, :PARM9, :PARM10 );if (strncmp(SQLSTATE,"00000",5)){/* Handle error or warning returned on CALL statement */ AS/400 | Universitas Gunadarma  29  
  30. 30. }/* Process return values from the CALL. */:/**************************************************//* Call the PLI procedure *//* *//*************************************************//* Reset the host variables prior to making the CALL *//* */:EXEC SQL CALL P2 (:PARM1, :PARM2, :PARM3,:PARM4, :PARM5,:PARM6, :PARM7, :PARM8, :PARM9, :PARM10 );if (strncmp(SQLSTATE,"00000",5)){/* Handle error or warning returned on CALL statement */}/* Process return values from the CALL. */:}/******** END OF C APPLICATION **********************************//*************************************************************************/Contoh 2. CREATE PROCEDURE dan CALL/******** START OF C PROCEDURE P1 *******************************//* PROGRAM TEST12/CALLPROC2 *//**************************************************************************/#include <stdio.h>#include <string.h>#include <decimal.h>main(argc,argv)int argc; AS/400 | Universitas Gunadarma  30  
  31. 31. char *argv[];{char parm1[11];long int parm2;short int parm3,i,j,*ind,ind1,ind2,ind3,ind4,ind5,ind6,ind7, ind8,ind9,ind10;float parm4;double parm5;decimal(10,5) parm6;char parm7[11];char parm8[10];char parm9[8];char parm10[26];/* ******************************************************************//* Receive the parameters into the local variables - *//* Character, date, time, and timestamp are passed as *//* NUL terminated strings - cast the argument vector to *//* the proper data type for each variable. Note that *//* the argument vector could be used directly instead of *//* copying the parameters into local variables - the copy *//* is done here just to illustrate the method. *//* ***************************************************************//* Copy 10 byte character string into local variable */strcpy(parm1,argv[1]);/* Copy 4 byte integer into local variable */parm2 = *(int *) argv[2];/* Copy 2 byte integer into local variable */parm3 = *(short int *) argv[3];/* Copy floating point number into local variable */parm4 = *(float *) argv[4];/* Copy double precision number into local variable */parm5 = *(double *) argv[5];/* Copy decimal number into local variable */ AS/400 | Universitas Gunadarma  31  
  32. 32. parm6 = *(decimal(10,5) *) argv[6];/**************************************************************************//* Copy NUL terminated string into local variable. *//* Note that the parameter in the CREATE PROCEDURE was *//* declared as varying length character. For C, varying *//* length are passed as NUL terminated strings unless *//* FOR BIT DATA is specified in the CREATE PROCEDURE *//************************************************************************/strcpy(parm7,argv[7]);/***********************************************************************//* Copy date into local variable. *//* Note that date and time variables are always passed in *//* ISO format so that the lengths of the strings are *//* known. strcpy would work here just as well. *//***********************************************************************/strncpy(parm8,argv[8],10);/* Copy time into local variable */strncpy(parm9,argv[9],8);/*********************************************************************//* Copy timestamp into local variable. *//* IBM SQL timestamp format is always passed so the length*//* of the string is known. *//********************************************************************/strncpy(parm10,argv[10],26);/*******************************************************************//* The indicator array is passed as an array of short *//* integers. There is one entry for each parameter passed *//* on the CREATE PROCEDURE (10 for this example). *//* Below is one way to set each indicator into separate *//* variables. *//*****************************************************************/ind = (short int *) argv[11]; AS/400 | Universitas Gunadarma  32  
  33. 33. ind1 = *(ind++);ind2 = *(ind++);ind3 = *(ind++);ind4 = *(ind++);ind5 = *(ind++);ind6 = *(ind++);ind7 = *(ind++);ind8 = *(ind++);ind9 = *(ind++);ind10 = *(ind++);:/* Perform any additional processing here */:return;}/******** END OF C PROCEDURE P1 *******************************/Contoh 3. Prosedur P1/******** START OF PL/I PROCEDURE P2 *****************************//******** PROGRAM TEST12/CALLPROC *****************************//****************************************************************************/CALLPROC :PROC( PARM1,PARM2,PARM3,PARM4,PARM5,PARM6,PARM7,PARM8,PARM9,PARM10,PARM11);DCL SYSPRINT FILE STREAM OUTPUT EXTERNAL;OPEN FILE(SYSPRINT);DCL PARM1 CHAR(10);DCL PARM2 FIXED BIN(31);DCL PARM3 FIXED BIN(15);DCL PARM4 BIN FLOAT(22); AS/400 | Universitas Gunadarma  33  
  34. 34. DCL PARM5 BIN FLOAT(53);DCL PARM6 FIXED DEC(10,5);DCL PARM7 CHARACTER(10) VARYING;DCL PARM8 CHAR(10); /* FOR DATE */DCL PARM9 CHAR(8); /* FOR TIME */DCL PARM10 CHAR(26); /* FOR TIMESTAMP */DCL PARM11(10) FIXED BIN(15); /* Indicators *//* PERFORM LOGIC - Variables can be set to other values for *//* return to the calling program. */:END CALLPROC;Contoh 4. Prosedur P2 Contoh berikut menunjukkan sebuah prosedur REXX yang dipanggil dari sebuahprogram ILE C. Misal sebuah prosedur didefinisikan sebagai berikut :EXEC SQL CREATE PROCEDURE REXXPROC(IN PARM1 CHARACTER(20),IN PARM2 INTEGER,IN PARM3 DECIMAL(10,5),IN PARM4 DOUBLE PRECISION,IN PARM5 VARCHAR(10),IN PARM6 GRAPHIC(4),IN PARM7 VARGRAPHIC(10),IN PARM8 DATE,IN PARM9 TIME,IN PARM10 TIMESTAMP)EXTERNAL NAME TEST.CALLSRC(CALLREXX)LANGUAGE REXX GENERAL WITH NULLS AS/400 | Universitas Gunadarma  34  
  35. 35. Contoh 5. Contoh Prosedur REXX yang dipanggil dari Aplikasi C/**********************************************************************//*********** START OF SQL C Application ***********************/#include <decimal.h>#include <stdio.h>#include <string.h>#include <wcstr.h>/*---------------------------------------------------------------------------*/exec sql include sqlca;exec sql include sqlda;/* ***************************************************************//* Declare host variable for the CALL statement *//* **************************************************************/char parm1[20];signed long int parm2;decimal(10,5) parm3;double parm4;struct { short dlen; char dat[10];} parm5;wchar_t parm6[4] = { 0xC1C1, 0xC2C2, 0xC3C3, 0x0000 };struct { short dlen;wchar_t dat[10];} parm7 = {0x0009, 0xE2E2,0xE3E3,0xE4E4, 0xE5E5, 0xE6E6,0xE7E7, 0xE8E8, 0xE9E9, 0xC1C1, 0x0000 };char parm8[10];char parm9[8];char parm10[26];main(){/************************************************************************//* Call the procedure - on return from the CALL statement the */ AS/400 | Universitas Gunadarma  35  
  36. 36. /* SQLCODE should be 0. If the SQLCODE is non-zero, *//* the procedure detected an error. *//* ********************************************************************/strcpy(parm1,"TestingREXX");parm2 = 12345;parm3 = 5.5;parm4 = 3e3;parm5.dlen = 5;strcpy(parm5.dat,"parm6");strcpy(parm8,"1994-01-01");strcpy(parm9,"13.01.00");strcpy(parm10,"1994-01-01-13.01.00.000000");EXEC SQL CALL REXXPROC (:parm1, :parm2, :parm3,:parm4, :parm5,:parm6,:parm7, :parm8, :parm9, :parm10);if (strncpy(SQLSTATE,"00000",5)){/* handle error or warning returned on CALL */:}:}/****** END OF SQL C APPLICATION ************************************//********************************************************************************//********************************************************************************//****** START OF REXX MEMBER TEST/CALLSRC CALLREXX ******//********************************************************************************//* REXX source member TEST/CALLSRC CALLREXX *//* Note the extra parameter being passed for the indicator *//* array. */ AS/400 | Universitas Gunadarma  36  
  37. 37. /* *//* ACCEPT THE FOLLOWING INPUT VARIABLES SET TO THE *//* SPECIFIED VALUES : *//* AR1 CHAR(20) = TestingREXX *//* AR2 INTEGER = 12345 *//* AR3 DECIMAL(10,5) = 5.5 *//* AR4 DOUBLE PRECISION = 3e3 *//* AR5 VARCHAR(10) = parm6 *//* AR6 GRAPHIC = GC1C1C2C2C3C3 *//* AR7 VARGRAPHIC = *//* GE2E2E3E3E4E4E5E5E6E6E7E7E8E8E9E9EAEA *//* AR8 DATE = 1994-01-01 *//* AR9 TIME = 13.01.00 *//* AR10 TIMESTAMP = *//* 1994-01-01-13.01.00.000000 *//* AR11 INDICATOR ARRAY = +0+0+0+0+0+0+0+0+0+0 *//*****************************************************************************//* Parse the arguments into individual parameters *//*****************************************************************************/parse arg ar1 ar2 ar3 ar4 ar5 ar6 ar7 ar8 ar9 ar10 ar11/*****************************************************************************//* Verify that the values are as expected *//****************************************************************************/if ar1<>"TestingREXX" then signal ar1tagif ar2<>12345 then signal ar2tagif ar3<>5.5 then signal ar3tagif ar4<>3e3 then signal ar4tagif ar5<>"parm6" then signal ar5tag AS/400 | Universitas Gunadarma  37  
  38. 38. if ar6 <>"GAABBCC" then signal ar6tagif ar7 <>"GSSTTUUVVWWXXYYZZAA" then ,signal ar7tagif ar8 <> "1994-01-01" then signal ar8tagif ar9 <> "13.01.00" then signal ar9tagif ar10 <> "1994-01-01-13.01.00.000000" then signal ar10tagif ar11 <> "+0+0+0+0+0+0+0+0+0+0" then signal ar11tag/******************************************************************************//* Perform other processing as necessary .. *//*****************************************************************************/:/*****************************************************************************//* Indicate the call was successful by exiting with a *//* return code of 0 *//****************************************************************************/exit(0)ar1tag:say "ar1 did not match" ar1exit(1)ar2tag:say "ar2 did not match" ar2exit(1)::/************ END OF REXX MEMBER **************************************/ AS/400 | Universitas Gunadarma  38  

×