sql - 让 SQL UPDATE 像 native IO 一样在记录锁上抛出错误消息

标签 sql db2 ibm-midrange db2-400 rpgle

我对 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/

相关文章:

sql - SQL 查询中不同的关键字用法

php - 改写sql查询

hibernate - 如何在 Hibernate 中限制数据库级别的用户访问

sql - 内连接与笛卡尔积的性能

sql - 如何在 SQL 中的一行中连接多行?

pdf - 将 PDF 添加到 AFP 输出

entity-framework - 是否可以将 Entity Framework 与 DB2 iSeries AS/400 一起使用

Mysql NOT IN 子句查询不返回我想要的

visual-studio - 用于 AS/400 RPGILE 编程的最佳 IDE 是什么?您可以使用 Visual Studios IDE 连接到 400 吗?

SQL Server 代理未报告因 PowerShell 脚本中未捕获的异常而导致的失败