如何在RPG中构建一个大字符串并将其写入DDL CLOB字段

时间:2017-05-25 20:26:34

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

跟进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);     

3 个答案:

答案 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,对于大于有效主变量的字段,您有两种选择。

  1. 使用定位器字段
  2. 使用文件字段
  3. 使用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文件的定位器示例。