跟进very large fields in As400 ISeries database ...
我想在RPG中构建一个大字符串并将其写入DDL CLOB字段。
然而,即使我在RPG代码和DDL CLOB字段中使用CLOB字段,我似乎也限制为65531个字符,因为数据通过临时字符串值调用'wkClob_data'。我可以克服这个限制吗? 也许使用用户空间? [仍在V5R4上]
DDL:
CREATE TABLE MYLIB/MYFILE
(MYDEC DEC (5) NOT NULL WITH DEFAULT,
MYCHAR CHAR (30) NOT NULL WITH DEFAULT,
MYCLOB CLOB (100000) ALLOCATE(1000) NOT NULL WITH DEFAULT)
RPG:
D wkValue S 65530a varying
D wkClob S sqltype(CLOB:65530)
// file up wkClob_data with a big string..
Eval wkClob_data = someData + %trim(moreData);
Eval wkClob_len = %len(%trim(someData + %trim(moreData)));
exec SQL
INSERT INTO MYFILE (MYDEC, MYCHAR, MYCLOB)
VALUES (123, 'Some Description',:wkClob);
答案 0 :(得分:1)
我猜测在放弃之前我可能会在SQLRPGLE中尝试一下,然后创建一个我可以从RPG调用的java类。
exec SQL
INSERT INTO MYFILE (MYDEC, MYCHAR, MYCLOB)
VALUES (123, 'Some Description',:wkClob || :wkclob1 || :wkclob2);
exec SQL
update myfile set substring(myclob:32323412:11) = 'Hello World';
答案 1 :(得分:1)
数据来自哪里?
是否真的需要通过RPG计划? IBM i上也提供了C / C ++。 锤子永远是正确的工具,而不是一切都是钉子。
如果你坚持使用RPG,以下可能会工作......
D wkValue S 65530a varying
D wkClob1 S sqltype(CLOB:65530)
D wkClob2 S sqltype(CLOB:65530)
//<snip>
exec SQL
INSERT INTO MYFILE (MYDEC, MYCHAR, MYCLOB)
VALUES (123, 'Some Description',:wkClob1 CONCAT :wkClob2);
但老实说,正确的方法可能是直接利用SQL call level interface (SQL CLI)。
Who Knew You Could Do That with RPG IV?红皮书提供了一些有关在RPG中使用CLI的代码信息。
答案 2 :(得分:0)
根据the v5.4 Knowledge Center,对于大于有效主变量的字段,您有两种选择。
使用Locator字段,DB2将句柄返回给大对象(LOB),并且数据保留在服务器上。 SQL语句可用于将LOB子串或搜索到其他主机变量中。 C和COBOL的知识中心中存在示例,但嵌入式SQL对于RPG应保持不变。
以下是知识中心翻译为RPG IV的定位器示例
dcl-s empnum Char(6);
dcl-s resume SqlType(clob_locator);
dcl-s lobind Int(5);
dcl-s di_buffer SqlType(clob_locator);
dcl-s buffer SqlType(clob: 1024);
dcl-s di_begin_loc Int(20);
dcl-s di_end_loc Int(20);
dcl-proc lobloc;
exec sql
declare C1 cursor for
select empno, resume
from emp_resume
where resume_format = 'ascii'
and empno <> 'A00130';
exec sql open C1;
buffer_len = 0;
dow 1=1;
exec sql fetch C1 into :empnum, :resume :lobind;
if sqlcode <> 0;
// error, warning, or no data
leave;
endif;
if lobind < 0;
// LOB value is null
iter;
endif;
// Find the "Department Information" section
exec sql
values (posstr(:resume, 'Department Information'))
into :di_begin_loc;
// Find the "Education" section
exec sql
values (posstr(:resume, 'Education'))
into :di_end_loc;
// Get the Department information only into a new LOB
exec sql
values (substr(:resume, :di_begin_loc, :di_end_loc - :di_begin_loc))
into :di_buffer;
// Append the department info into a new CLOB field
exec sql
values (:buffer || :di_buffer) into :buffer;
enddo;
exec sql free locator :resume, :di_buffer;
return;
end-proc;
注意您可以使用定位器以及显示的选择插入或更新LOB字段。
使用File字段,DB2将LOB的内容传输到IFS中的文件或从IFS中的文件传输。流文件API可用于读取或写入文件。有一个示例类似于知识中心中LOB文件的定位器示例。