RPG Distinct and Join SQL 语句的问题

Problems with a RPG Distinct and Join SQL statement

我有两个数据库,我正在尝试加入它们并从中获取不同的值。一种 table 包含订购商品的列表,另一种包含有关该商品的更多信息。我只使用 Join 做额外的 where 语句检查。问题是,如果在 SQL 语句为 运行 且游标打开后该值发生变化,它似乎不遵守项目详细信息文件中的 where 语句检查。

SELECT DISTINCT 
    OrdItem                                            
FROM
    OrdMst 
INNER JOIN 
    ItmMst ON OrdMst.OrdItem = ItmMst.Item              
WHERE 
    OrdMst.ID = 'MR' 
    AND OrdMst.TYPE = 'F' 
    AND ItmMst.ItmType IN ('1', '2') 
ORDER BY 
    OrdMst.OrdItem;

最好将任何单个数据库语句视为瞬时 activity。数据库收集所有结果并为您提供一个游标,以便您可以遍历这些结果(例如,请参阅@Charles(下方)的 select 部分 here). In postgres (and I would assume by default elsewhere), the result set isn't mutating along with the database. DB2 users should see the ,因为 DB2 显然支持变异结果。

请注意,大多数数据库包使用 "lazy" 结果集评估。这使您无需重复评估查询即可执行添加条件和排序语句等操作。如果您认为自己看到了突变,那可能是由于您的查询执行延迟所致。

我们通常 expect/want 数据库以不同方式工作。作为原因的一个简单示例,想象一下您正在对记录进行操作的情况。您 select 记录并按 last_modified 订购。您对记录进行了一些操作并更新了 last_modified。如果记录集发生变化,操作将永远无法完成,因为您会一直将修改的内容粘贴在记录集的末尾。

由于记录集未发生变化,您想要实现的目标是什么?你最好询问如何根据不变的数据库实现该目标(我们称之为 XY problem)。

我没有看到任何角色扮演游戏..

假设您将发布的语句用作 RPG 中 DECLARE CURSOR 语句的一部分,那么还有控制游标行为的附加子句。

来自documentation
ASENSITIVE(默认)
指定游标可能表现为 SENSITIVE 或 INSENSITIVE 取决于 select 语句的优化方式。

敏感
指定打开游标后对数据库所做的更改是 在结果中可见 table。光标对任何东西都有一定程度的敏感性 更新或删除其结果 table 之后的行 游标被打开。游标总是对定位更新或 使用相同的游标删除。此外,光标可以具有灵敏度 在此游标之外所做的更改。如果数据库管理器不能 更改对光标可见,然后返回错误。数据库 当游标出现时,管理器无法使游标可见更改 隐式变为只读。 (参见游标的结果 table。)如果 SENSITIVE 是 指定后,SELECT 语句不能包含数据更改-table-引用。

不敏感
指定一旦游标打开,它对 由这个或任何其他激活执行的插入、更新或删除 团体。如果指定了 INSENSITIVE,则游标是只读的并且是 打开游标时创建临时结果。除此之外 SELECT 语句不能包含 UPDATE 子句和应用程序 必须允许数据的副本 (ALWCPYDTA(*OPTIMIZE) 或 ALWCPYDTA(*YES)).