我想将一个大的XML字符串(可能超过32K或64K)保存到AS400文件字段中。 DDS或SQL文件都可以。下面的SQL文件示例。
CREATE TABLE MYLIB/PRODUCT
(PRODCODE DEC (5 ) NOT NULL WITH DEFAULT,
PRODDESC CHAR (30 ) NOT NULL WITH DEFAULT,
LONGDESC CLOB (70K ) ALLOCATE(1000) NOT NULL WITH DEFAULT)
我们会使用RPGLE来读取和写入字段。
目标是在客户端通过ODBC连接提取数据。
AS400字符字段似乎有32K限制,所以这不是很好的选择。
我有哪些选择?我一直在阅读CLOB,但似乎有限制将大字符串写入CLOBS并远程读取CLOB字段。请注意,客户端(仍然)在AS400 OS的v5R4上。
谢谢!
查尔斯'下面的答案显示了如何提取数据。我想插入数据。此代码运行,但抛出了一个' 22501' SQL错误。
D wLongDesc s 65531a varying
D longdesc s sqltype(CLOB:65531)
/free
//eval longdesc = *ALL'123';
eval Wlongdesc = '123';
exec SQL
INSERT INTO PRODUCT (PRODCODE, PRODDESC, LONGDESC)
VALUES (123, 'Product Description', :LongDesc );
if %subst(sqlstt:1:2) <> '00';
// an error occurred.
endif;
// get length explicitly, variables are setup by pre-processor
longdesc_len = %len(%trim(longdesc_data));
wLongDesc = %subst(longdesc_data:1:longdesc_len);
/end-free
C Eval *INLR = *on
C Return
附加问题:这种技术是否适合存储我想在以后通过ODBC连接提取的数据? ODBC读取CLOB作为指针还是可以提取文本?
答案 0 :(得分:4)
在v5r4,RPGLE实际上支持64K字符变量。
但是,对于常规char / varchar字段,DB限制为32K。
您需要将CLOB用于大于32K的任何内容。
如果你能活64K(左右)
CREATE TABLE MYLIB/PRODUCT
(PRODCODE DEC (5 ) NOT NULL WITH DEFAULT,
PRODDESC CHAR (30 ) NOT NULL WITH DEFAULT,
LONGDESC CLOB (65531) ALLOCATE(1000) NOT NULL WITH DEFAULT)
您可以使用RPGLE SQLTYPE
支持
D code S 5s 0
d wLongDesc s 65531a varying
D longdesc s sqltype(CLOB:65531)
/free
exec SQL
select prodcode, longdesc
into :code, :longdesc
from mylib/product
where prodcode = :mykey;
wLongDesc = %substr(longdesc_data:1:longdesc_len);
DoSomthing(wLongDesc);
预编译器将使用如此定义的DS替换longdesc:
D longdesc ds
D longdesc_len 10u 0
D longdesc_data 65531a
您可以直接使用它,确保最多只使用longdesc_len
或将其转换为VARYING,就像我上面所做的那样。
如果绝对必须处理大于64K ......
选项2是我从未见过的......我找不到任何例子。刚刚在这篇旧文章中看到过它。 http://www.ibmsystemsmag.com/ibmi/developer/general/BLOBs,-CLOBs-and-RPG/?page=2
答案 1 :(得分:0)
此示例显示如何在Db2数据库中写入CLOB字段...在Charles和Murphy先生的反馈的帮助下。
* ----------------------------------------------------------------------
* Create table with CLOB:
* CREATE TABLE MYLIB/PRODUCT
* (MYDEC DEC (5 ) NOT NULL WITH DEFAULT,
* MYCHAR CHAR (30 ) NOT NULL WITH DEFAULT,
* MYCLOB CLOB (65531) ALLOCATE(1000) NOT NULL WITH DEFAULT)
* ----------------------------------------------------------------------
D PRODCODE S 5i 0
D PRODDESC S 30a
D i S 10i 0
D wLongDesc s 65531a varying
D longdesc s sqltype(CLOB:65531)
D* Note that variables longdesc_data and longdesc_len
D* get create automatocally by SQL pre-processor.
/free
eval wLongdesc = '123';
longdesc_data = wLongDesc;
longdesc_len = %len(%trim(wLongDesc));
exec SQL set option commit = *none;
exec SQL
INSERT INTO PRODUCT (MYDEC, MYCHAR, MYCLOB)
VALUES (123, 'Product Description',:longDesc);
if %subst(sqlstt:1:2)<>'00' ;
// an error occurred.
endif;
Eval *INLR = *on;
Return;
/end-free