0

我正在将一些过程从 PostgreSQL 迁移到新的 DB2 环境。我已经完成了大部分工作,但我找不到为内部行集/记录声明变量的方法。

基本上,该程序在 Postgres 上的作用是:

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的答案指向正确的解决方案

在过程之外创建所需的行类型:
CREATE TYPE empRow AS ROW (failed_inserts INTEGER, failed_updates INTEGER, failed_deletes INTEGER);

然后您可以在过程中声明新类型 DECLARE newRow empRow;

4

2 回答 2

0

不确定我完全理解您想要什么,但您可能正在寻找ROW数据类型?像这样的东西:

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。未测试。

手册中的更多信息。

于 2014-10-21T11:41:28.367 回答
0

代替创建或多或少特定于单个查询的永久**用户定义类型,您还可以使用以下FOR语句实现相同目的:

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;

** 永久意味着在系统目录中定义的东西。

于 2014-10-21T20:26:01.030 回答