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

Db2 如何在RPG中构建一个大字符串并将其写入DDL CLOB字段,db2,ibm-midrange,clob,db2-400,rpgle,Db2,Ibm Midrange,Clob,Db2 400,Rpgle,后续行动 我想在RPG中构建一个大字符串,并将其写入DDL CLOB字段 然而,即使我在RPG代码中使用CLOB字段和DDL CLOB字段,我似乎也只能使用65531个字符,因为数据通过临时字符串值调用“wkClob_data”传递。我能克服这个限制吗? 可能使用用户空间??[仍在V5R4上] DDL: 角色扮演: 在我放弃并创建了一个可以从RPG调用的java类之前,我正在猜测我可能会在SQLRPGLE中尝试什么 exec SQL

后续行动

我想在RPG中构建一个大字符串,并将其写入DDL CLOB字段

然而,即使我在RPG代码中使用CLOB字段和DDL CLOB字段,我似乎也只能使用65531个字符,因为数据通过临时字符串值调用“wkClob_data”传递。我能克服这个限制吗? 可能使用用户空间??[仍在V5R4上]

DDL:

角色扮演:


在我放弃并创建了一个可以从RPG调用的java类之前,我正在猜测我可能会在SQLRPGLE中尝试什么

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';

在我放弃并创建了一个可以从RPG调用的java类之前,我正在猜测我可能会在SQLRPGLE中尝试什么

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';

数据来自哪里

它真的需要通过RPG程序吗?IBMi上也提供了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);   
D WKS 65530a值变化
D wkClob1 S sqltype(CLOB:65530)
D wkClob2 S sqltype(CLOB:65530)
//
执行SQL
插入MYFILE(MYDEC、MYCHAR、MYCLOB)
值(123,‘一些描述’,:wkClob1 CONCAT:wkClob2);
但老实说,正确的方法可能是直接利用这个机会


红皮书中有一些关于从RPG使用CLI的代码信息

数据来自哪里

它真的需要通过RPG程序吗?IBMi上也提供了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);   
D WKS 65530a值变化
D wkClob1 S sqltype(CLOB:65530)
D wkClob2 S sqltype(CLOB:65530)
//
执行SQL
插入MYFILE(MYDEC、MYCHAR、MYCLOB)
值(123,‘一些描述’,:wkClob1 CONCAT:wkClob2);
但老实说,正确的方法可能是直接利用这个机会

红皮书中有一些关于从RPG使用CLI的代码信息

根据,对于大于有效主机变量的字段,您有两个选项

  • 使用定位器字段
  • 使用文件字段
  • 使用Locator字段,DB2返回一个大对象(LOB)的句柄,数据保留在服务器上。SQL语句可用于将LOB子串或搜索到其他主机变量中。C和COBOL的知识中心中有一些示例,但对于RPG,嵌入式SQL应该保持不变

    下面是从知识中心翻译成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;
    
    dcl-s empnum字符(6);
    dcl-s恢复SqlType(clob_定位器);
    dcl-s lobind Int(5);
    dcl-s di_缓冲区SqlType(clob_定位器);
    dcl-s缓冲区SqlType(clob:1024);
    dcl-s开始位置Int(20);
    dcl-s di_end_loc Int(20);
    dcl proc lobloc;
    执行sql
    为声明C1游标
    选择empno,继续
    从emp_恢复
    其中resume_格式='ascii'
    以及empno‘A00130’;
    execsqlopenc1;
    缓冲区长度=0;
    道指1=1;
    execsqlfetchc1到:empnum,:resume:lobind;
    如果sqlcode为0;
    //错误、警告或无数据
    离开
    endif;
    如果lobind<0;
    //LOB值为空
    iter;
    endif;
    //查找“部门信息”部分
    执行sql
    值(posstr(:resume,“部门信息”)
    分为:开始位置;
    //查找“教育”部分
    执行sql
    价值观(posstr(:简历,“教育”))
    分为:底端位置;
    //仅在新LOB中获取部门信息
    执行sql
    值(substr(:resume,:di_begin_loc,:di_end_loc-:di_begin_loc))
    进入:di_缓冲区;
    //将部门信息附加到新的CLOB字段中
    执行sql
    值(:buffer | |:di|u buffer)转换为:buffer;
    enddo;
    exec-sql-free定位器:resume,:di_buffer;
    返回;
    结束进程;
    
    注意您可以使用定位器以及所示的选择按钮插入或更新LOB字段

    通过文件字段,DB2将LOB的内容传输到IFS中的文件或从中传输。流文件API可用于读取或写入文件。知识中心中有一个类似于LOB文件定位器示例的示例。

    根据,对于大于有效主机变量的字段,您有两个选项

  • 使用定位器字段
  • 使用文件字段
  • 使用Locator字段,DB2返回一个大对象(LOB)的句柄,数据保留在服务器上。SQL语句可用于将LOB子串或搜索到其他主机变量中。C和COBOL的知识中心中有一些示例,但对于RPG,嵌入式SQL应该保持不变

    下面是从知识中心翻译成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;
    
    dcl-s empnum字符(6);
    dcl-s恢复SqlType(clob_定位器);
    dcl-s lobind Int(5);
    dcl-s di_缓冲区SqlType(clob_定位器);
    dcl-s缓冲区SqlType(clob:1024);
    dcl-s开始位置Int(20);
    dcl-s di_end_loc Int(20);
    dcl proc lobloc;
    执行sql
    为声明C1游标
    选择empno,继续
    从emp_恢复
    其中resume_格式='ascii'
    以及empno‘A00130’;
    execsqlopenc1;
    缓冲区长度=0;
    道指1=1;
    execsqlfetchc1到:empnum,:resume:lobind;
    如果sqlcode为0;
    //错误、警告或无数据
    离开
    endif;
    如果lobind<0;
    //LOB值为空
    iter;
    endif;
    //查找“部门信息”部分
    执行sql
    值(posstr(:resume,“部门信息”)
    分为:开始位置;
    //查找“教育”部分
    执行sql
    价值观(posstr(:简历,“教育”))
    分为:底端位置;
    //仅在新LOB中获取部门信息
    执行sql