【问题标题】:very large fields in As400 ISeries databaseAs400 ISeries 数据库中的非常大的字段
【发布时间】:2017-05-08 17:20:45
【问题描述】:

我想将一个大的 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 操作系统的 v5R4 上。

谢谢!


Charles 下面的回答显示了如何提取数据。我想插入数据。此代码运行,但引发“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 读取为指针还是可以提取文本?

【问题讨论】:

  • 你在插入之前没有加载longdesc,它只是有无效的随机数据。
  • 在插入前添加longdesc_data = wLongDesc; longdesc_len = %len(%trim(wLongDesc));
  • 您可能还想将exec sql set option commit = *none; 添加到 c 规范的顶部,这样您就不必记住设置您的承诺控制选项。适当更改*none
  • 这是试验java的好时机。 java中的字符串没有实际限制。 ( 2^31 幂之类的)。用于写入数据库的 java 程序。也许将 xml 的 ifs 路径传递给 java 程序。祝你好运。提示在 IFS 上使用 eclipse 存储创建一个可运行的 jar 文件。

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


【解决方案1】:

在 v5r4 中,RPGLE 实际上支持 64K 字符变量。

但是,对于常规 char/varchar 字段,数据库限制为 32K。

对于大于 32K 的任何内容,您都需要使用 CLOB。

如果你能忍受 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);

预编译器会将 longdesc 替换为如下定义的 DS:

 D longdesc        ds
 D  longdesc_len                 10u 0
 D  longdesc_data             65531a

您可以直接使用它,确保最多只使用 longdesc_len 或将其转换为 VARYING,就像我在上面所做的那样。

如果绝对必须处理大于 64K...

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

选项 2 是我从未见过使用过的选项....而且我找不到任何示例。刚看到这篇老文章里提到过。。 http://www.ibmsystemsmag.com/ibmi/developer/general/BLOBs,-CLOBs-and-RPG/?page=2

【讨论】:

    【解决方案2】:

    此示例展示了如何在 Charles 和 Murphy 先生的反馈帮助下写入 Db2 数据库中的 CLOB 字段。

     * ----------------------------------------------------------------------         
     * 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                                 
    

    【讨论】:

    • 这里有一个问题:使用这种技术是否可以超过 RPG 字段的 65,535 个字符限制?
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多