我对 IBM i 有点陌生,并且有 Java/C# 背景。因此,如果我使用了错误的术语,请纠正我。我们目前使用的是 IBM i 7.1,并将在明年内转向 7.3。
我的任务是更新文件中的记录。我在这里编写了两个 RPGLE 程序,它们执行相同的操作。
native I/O:
**free
dcl-f table1 usage(*update) keyed;
setll ('001': 'Y') table1;
reade ('001': 'Y') table1;
dow not %eof(table1);
letter = 'X';
update table1;
reade ('001': 'Y') table1;
enddo;
*inlr = *ON;
return;
嵌入式 SQL:
**free
exec sql UPDATE table1
SET letter = 'X'
WHERE GroupCode = '001' AND Newbie = 'Y';
*inlr = *ON;
return;
在我看来,这是 SQL 因其简洁性而比 native I/O 拥有强大优势的时代之一。
这是我的问题。我的公司依赖 CPF 消息。与许多公司一样,我们并不完美,并且拥有遗留代码。其中有很多,有时我们会得到记录锁。发生这种情况时,系统会向系统发送一条错误消息,并等待有人登录并回答。
这会导致我们调用我们的内部支持人员,通常当有人联系时,锁定文件的程序已完成,我们只需回答 R 即可重试,更新会从上次停止的地方继续进行。这种情况发生的频率并不高,以至于我们可以花时间修复调度过程和所有程序的记录锁,但这种情况发生的频率足够高,没有这种能力会给我们带来巨大的痛苦。
使用 native I/O 时会抛出这些消息。使用嵌入式 SQL,设置 SQLSTATE 和 SQLCODE 变量,程序将继续运行,而不向系统发送任何消息。我可以检查这个变量,编写自己的消息,并在出现问题时向系统发送消息。然而;这不太理想。如果我手动提供重试选项,则无法从中断处恢复更新。我必须再次运行整个更新语句。
我查看了编译器选项、控制选项、sql 选项和 sql 命令,但没有一个能够提供我正在寻找的能力。
简而言之,我想知道,有没有一种方法可以让嵌入式 SQL 在出现不受监控的错误消息时表现得像 native I/O?
最佳答案
简而言之...不。
SQL 是一种不同的范例。 DB2 for i 中的 SQL 错误处理就像任何其他语言中的 SQL 中的错误处理一样......
您可能希望在 promise 控制下运行您的UPDATE
。然后检查sqlstate。如果没有错误,COMMIT
事务。
否则,ROLLBACK
交易,并显示您的消息。此时,重试选项将循环并重新发出 SQL UPDATE
。
社论
添加完所有这些之后,您的 SQL 版本看起来并不那么简洁,不是吗?哎呀,RPG 版本实际上可以减少到 5 或 6 行……如果你想走老路并使用输入主文件。并不是说我现在会推荐它。
RPG 与 DB 的紧密集成对您有很大帮助。 SQL 很棒,我一直在使用它,但有时多一点控制会更好。值得庆幸的是,在 IBM i 上有 SQL 的替代方案。
关于sql - 让 SQL UPDATE 像 native IO 一样在记录锁上抛出错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46007219/