Memodifikasi Karakter Database AS400 Objek Besar Dari 64K RPG Variabel

Dengan sebagian besar dari kita para pengembang AS400 bekerja dengan volume besar data XML di antarmuka kami antara aplikasi pada sistem AS400 kami dan antara sistem lain, atau dengan data yang berasal dari antarmuka ke layanan web yang berjalan di platform atau sistem lain, kami menemukan masalah menemukan cara untuk menyimpan data ini dalam database db2 / 400 kami. Sampai sekarang, DB2 / 400 tidak memungkinkan kita untuk menyimpan atau memanipulasi dokumen XML secara asli dalam database (meskipun ini dialokasikan untuk i5 / os V7R1).

Ini adalah masalah sederhana untuk dipecahkan ketika kita mengakses database dari java menggunakan jdbc dan dapat memanipulasi CLOBS, tetapi jika kita menggunakan RPG untuk mengakses database, kita dibatasi dalam akses ke database AS400 dan CLOBS. Masalah lainnya adalah panjang catatan pada file db2 dibatasi hanya di bawah 32K.

Kita dapat menyimpan data dalam jumlah besar dalam database, dalam bentuk LOB (Objek Besar). Jenis yang dapat kami gunakan untuk tujuan penyimpanan XML kami adalah CLOB, yang dapat menyimpan data karakter termasuk XML.

Kita dapat menggunakan SQL yang tertanam dalam program RPG kita untuk menempatkan data XML kita ke dalam field clob database, tetapi kita memiliki beberapa kesulitan. Kita dapat menyimpan hingga 2Gb data dalam CLOB. RPG memiliki ukuran bidang maksimum 64K pada V5R4 (16M pada V6R1), tetapi tidak mudah mendapatkan 64K data kami di bidang RPG ke dalam database CLOB.

Contoh di bawah ini, berdasarkan salah satu dari Scott Klement, menunjukkan bagaimana Anda bisa mendapatkan data dari bidang RPG AS400 Anda ke CLOB.

The X / Open SQL Call Level Interface adalah standar untuk akses langsung sistem SQL Engine tanpa precompile, kita akan menggunakan ini dengan memanggil SQL CLI apis dari RPG daripada menggunakan embedded SQL. Ini memungkinkan akses ke fungsi-fungsi SQL secara langsung melalui prosedur panggilan ke program layanan yang disediakan oleh DB2 pada AS400. Menggunakan pemanggilan prosedur SQL Call Level Interface memungkinkan Anda untuk menyiapkan pernyataan SQL, mengeksekusi pernyataan SQL, mengambil baris data, dan bahkan melakukan fungsi lanjutan seperti mengakses katalog, dan mengikat variabel program ke kolom keluaran.

Jadi dengan menggunakan CLI, kita dapat melewati batasan AS400 tertanam SQL, dan lulus 64K data kami sebagai variabel host menggunakan pointer. Contoh yang menunjukkan cara memperbarui CLOB menggunakan metode ini ditunjukkan di bawah ini:

/ sertakan * libl / qtxtsrc, MGSQLCLI_H

************************************************** **********************

* updateClob – Perbarui Clob

************************************************** **********************

P updateClob B Export

D updateClob pi 10i 0

id Id 10i 0 const

d msg 65535 Konstanta

D id s 10s 0

D ptr s *

D rc s 10i 0

D msgLen s 10i 0

Msgstrize s 10i 0

D env s seperti (SQLHENV) inz (SQL_NULL_HENV)

d xmsg s 65535A

/Bebas

xmsg = msg;

// Buat lingkungan SQL & pegangan koneksi

SQLAllocEnv (env);

SQLSetEnvAttrI (env: SQL_ATTR_OUTPUT_NTS:

SQL_FALSE: ukuran% (SQLINTEGER));

SQLSetEnvAttrI (env: SQL_ATTR_ENVHNDL_COUNTER

: SQL_TRUE: ukuran% (SQLINTEGER));

SQLAllocConnect (env: conn);

// Mengatur Format Penamaan

SQLSetConnectAttrI (conn: SQL_ATTR_DBC_SYS_NAMING

: SQL_TRUE: ukuran% (SQLINTEGER));

// Setel Tingkat Komitmen ke * CHG

SQLSetConnectAttrI (conn: SQL_ATTR_COMMIT

: SQL_COMMIT_CHG: ukuran% (SQLINTEGER));

// Hubungkan ke Basis Data

SQLConnect (conn: '* LOCAL': SQL_NTS: * NULL

: SQL_NTS: * NULL: SQL_NTS);

// Buat pernyataan SQL

SQLAllocStmt (conn: stmt);

rc = SQLPrepare (stmt

: 'UPDATE FILE SET mymsg =? DI MANA myid =? '

: SQL_NTS);

// Tentukan parameter pernyataan

ptr =% addr (xmsg);

msgLen =% len (xmsg);

msgSize = ukuran% (xmsg);

rc = SQLBindParam (stmt: 1: SQL_CLOB: SQL_CLOB: msgSize

: 0: ptr: msgLen);

rc = SQLBindParam (stmt: 2: SQL_NUMERIC: SQL_NUMERIC

:% len (id):% decpos (id):% addr (id): 0);

// Jalankan Pernyataan

rc = SQLExecute (stmt);

// Bebaskan Sumber Daya SQL

SQLFreeStmt (stmt: SQL_DROP);

membersihkan();

kembali rc;

/ Akhir-Gratis

pe

* ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

* Cleanup (): Deallocate / Disconnect menangani SQL CLI

* ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

P pembersihan B

D pembersihan pi

/bebas

jika (stmt SQL_NULL_HSTMT);

SQLFreeStmt (stmt: SQL_DROP);

stmt = SQL_NULL_HSTMT;

berakhir jika;

jika (conn SQL_NULL_HDBC);

SQLDisconnect (sambung);

SQLFreeConnect (sambung);

conn = SQL_NULL_HDBC;

berakhir jika;

/ Akhir-Gratis

pe

Jadi menggunakan contoh di atas itu harus cukup lurus ke depan untuk pengembang memperbarui AS400 db2 CLOB dari 64K RPG Variabel menggunakan Antarmuka Tingkat Panggilan SQL.