在SQLRPGLE程序中,我需要运行insert into语句将一些记录复制到另一个文件,该文件具有分配了新记录ID的复制记录。 为此,我按照以下步骤操作:
1)每次调用一个获取新记录ID的程序的原型称为
D ri_box12 PR 13S 0 D wkFileName 10A Value2)执行动态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-EXEC3)定义ri_box12过程
P ri_box12 B D ri_box12 PI 13S 0 D wkFileName 10A Value D wkID S 13S 0 C DO关键是ri_box12只被调用一次,因此所有复制的记录都具有相同的ID;多次运行程序再次复制具有新记录ID的所有记录。
** ...some instructions to give wkID a value C ENDDO C Return wkID P E
我做错了什么或我错过了什么?
比你非常
答案 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()
函数位于同一程序中。通常你会有这样的过程
步骤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