As400 ISeries数据库中的非常大的字段

时间:2017-05-08 17:20:46

标签: db2 ibm-midrange clob db2-400 rpgle

我想将一个大的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作为指针还是可以提取文本?

2 个答案:

答案 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 ......

  1. 升级到受支持的操作系统版本(支持16MB变量)
  2. 使用文件参考
  3. 通过IFS文件访问CLOB内容

    选项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