Stored procedures DB2存储过程:声明内部“行集”
我正在将一些过程从PostgreSQL迁移到一个新的DB2环境。我已经完成了大部分工作,但找不到为内部行集/记录声明变量的方法 基本上,程序对Postgres的作用是:Stored procedures DB2存储过程:声明内部“行集”,stored-procedures,db2,db2-luw,Stored Procedures,Db2,Db2 Luw,我正在将一些过程从PostgreSQL迁移到一个新的DB2环境。我已经完成了大部分工作,但找不到为内部行集/记录声明变量的方法 基本上,程序对Postgres的作用是: DECLARE counts RECORD; BEGIN -- fill "counts" with one row of aggregated data SELECT COUNT(....) AS failed_inserts, COUNT(....) AS failed_update
DECLARE
counts RECORD;
BEGIN
-- fill "counts" with one row of aggregated data
SELECT
COUNT(....) AS failed_inserts,
COUNT(....) AS failed_updates,
COUNT(....) AS failed_deletes,
INTO counts
FROM (...)
-- check "counts" with some conditionals
IF counts.failed_inserts > 0
(...)
END IF;
(...)
-- return info depending on the data
RETURN (...);
END
我在IBM手册或在线其他地方找不到与声明计数等效的方法。我需要的行是静态的3列聚合数据。因此,如果可能的话,声明行硬编码就足够了
是否可以在DB2上的存储过程中声明记录/数据集/虚拟表
我们使用的是DB2 for Linux V10.5,而不是DB2 for iSeries
@mustaccio的回答指出了正确的解决方案:
在过程之外,创建所需的行类型:
创建类型empRow作为行失败\u插入整数,失败\u更新整数,失败\u删除整数
然后可以在过程中声明新类型
宣布newRow empRow 我不确定我是否完全理解您想要什么,但可能您正在查找行数据类型?大概是这样的:
DECLARE
TYPE counts_row AS ROW (
failed_inserts INT,
failed_updates INT,
failed_deletes INT
);
counts counts_row;
BEGIN
-- fill "counts" with one row of aggregated data
SELECT
COUNT(....) AS failed_inserts,
COUNT(....) AS failed_updates,
COUNT(....) AS failed_deletes,
INTO counts
FROM (...);
...
PS.未经测试
更多信息 除了创建或多或少特定于单个查询的永久**用户定义类型之外,您还可以使用以下方法实现相同的目的:
**永久性表示系统目录中定义的内容。谢谢您的指针。DB2不接受您的代码“一个意外的标记[…]”,但在您指出的手册章节的帮助下,我成功地完成了代码。我将编辑我的帖子。确保您的代码中没有混合PL/SQL和DB2SQLPL语法,如果您选择PL/SQL,请启用Oracle兼容性。
FOR counts AS c1 CURSOR FOR SELECT COUNT(.....) AS failed_inserts,
COUNT(....) AS failed_updates,
COUNT(....) AS failed_deletes,
FROM (...)
DO
IF counts.failed_inserts > 0 THEN
(....)
END IF;
END FOR;