iSeries:SQLRPGLE如何为SELECT语句中的每条记录调用过程

时间:2016-06-17 11:13:33

标签: sql ibm-midrange rpgle

在SQLRPGLE程序中,我需要运行insert into语句将一些记录复制到另一个文件,该文件具有分配了新记录ID的复制记录。 为此,我按照以下步骤操作:

1)每次调用一个获取新记录ID的程序的原型称为
    

    D ri_box12        PR            13S 0
    D   wkFileName                  10A   Value
    
2)执行动态SQL语句     
    C                   EVAL      SQL_STM='insert into PGMR46/STD05GR0F'
    C                                    +' (select CART, CARV, '
    C                                    +%char(ri_box12('STD05GR0F'))
    C                                    +'  from arasso0f)'
    C/EXEC SQL
    C+ execute immediate :SQL_STM
    C/END-EXEC
    
3)定义ri_box12过程    
    P ri_box12        B
    D ri_box12        PI            13S 0
    D   wkFileName                  10A   Value
    D   wkID          S             13S 0
    C                   DO
** ...some instructions to give wkID a value C ENDDO C Return wkID P E
关键是ri_box12只被调用一次,因此所有复制的记录都具有相同的ID;多次运行程序再次复制具有新记录ID的所有记录。

我做错了什么或我错过了什么?

比你非常

2 个答案:

答案 0 :(得分:1)

首先,您不需要在此处使用动态SQL。静态SQL可以工作,并且出于安全性和性能原因,首选静态SQL。

/free    
 exec SQL
   insert into PGMR46/STD05GR0F
     select CART, CARV, ri_box12('STD05GR0F')
     from arasso0f
 end-exec;

但是,为了使RPGLE功能的CALL正常工作,你缺少一件。

您必须定义所谓的外部用户定义函数(UDF)。这是一次性步骤。您基本上通知SQL查询引擎RPGLE函数存在以及它的界面是什么样的。

您通常不希望上述INSERT语句与ri_box12()函数位于同一程序中。通常你会有这样的过程

  1. 创建一个包含ri_box12()
  2. 的* SRVPGM(或* PGM)
  3. 创建指向ri_box12()
  4. 的UDF
  5. 创建使用UDF的程序/存储过程
  6. 步骤3是包含INSERT SQL语句的程序。

    步骤2只是运行一个如下所示的SQL语句:

    create function ri_box12(
      filename char(10)
      ) returns numeric(13,0)
      language RPGLE
      parameter style general
      returns null on null input
      program type sub
      external name 'MYSRVPGM(RIBOX_12)';
    

    您可以/应该为该功能指定许多其他设置。请查看SQL参考手册的CREATE FUNCTION (External Scalar)部分。

    我强烈建议您阅读External Procedures, Triggers, and User-Defined Functions on IBM DB2 for i Redbook

答案 1 :(得分:0)

不确定OP的函数ri_box12是什么,但如果只是一个序号,那么SQL SEQUENCE可能是实现这种效果的手段;有关示例,请参阅以下脚本化SQL:

int startIndex = htmlStyle.indexOf("<p>");
        int endIndex = htmlStyle.indexOf("</p>");
        while (startIndex >= 0) {
            endIndex = endIndex + 4;// to include </p> in the substring
            System.out.println(htmlStyle.substring(startIndex, endIndex));
            startIndex = htmlStyle.indexOf("<p>", startIndex + 1);
            endIndex = htmlStyle.indexOf("</p>", endIndex + 1);
        }

IBM i 7.2->Database->Reference->SQL reference->Concepts->Sequences
IBM i 7.2->Database->Reference->SQL reference->Statements->CREATE SEQUENCE
IBM i 7.2->Database->Reference->SQL reference->Language elements->Expressions->Sequence reference