DB2 - 在光标中聚合大小写

Posted

技术标签:

【中文标题】DB2 - 在光标中聚合大小写【英文标题】:DB2 - Aggregate with Case in Cursor 【发布时间】:2018-12-06 15:48:28 【问题描述】:

我正在尝试创建一个存储过程,该过程使用游标返回一个数据集,其中包含多个子查询上的聚合函数。该查询在作为独立脚本执行时有效,但在使用游标将其放入存储过程格式时它不起作用。使用聚合时,代码运行良好。在 case 语句上使用聚合时,存储过程创建失败。

输入表数据:

Province |  Contract Date
---------------------------
Ontario  |  June 11th, 2017
Ontario  |  June 21st, 2017
Quebec   |  July 12th, 2017

查询:

DECLARE C2 CURSOR WITH HOLD WITH RETURN TO CALLER FOR
SELECT 
    count(province) as province_total
    FROM (
       SELECT 
          contract.province,
          contract.contract_date
       WHERE contract.CON_CONTRACT_DATE >='2015-01-01' 
       AND contract.CON_CONTRACT_DATE < '2018-11-01'
    );

返回:

Province_Total |  
----------------
3              |  

所以这给了我省的总数。我正在尝试统计特定省份出现的次数。我正在使用以下查询:

CREATE PROCEDURE test
DYNAMIC RESULT SETS 1  
BEGIN

DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT 
    count(province) as province_total,
    sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
    sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
    FROM (
       SELECT 
          contract.province,
          contract.contract_date
       FROM dbo.contract as contract
       WHERE contract.CON_CONTRACT_DATE >='2015-01-01' 
       AND contract.CON_CONTRACT_DATE < '2018-11-01'
    );
   OPEN C1;
   END

我应该得到的是:

Province_Total | Ontario_Total | Quebec_Total
----------------------------------------------
3              | 2             | 1

但我在尝试创建程序时遇到错误。具体来说:

SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "".  Expected tokens may include:  "".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.13.80

根据我在 DB2 上处理此错误消息的经验,当出现语法“错误”时会抛出该错误消息。语句结束字符';'否则会被识别。

有什么方法可以在 DB2 中获得我想要的结果?一般需要使用游标,因为我需要返回结果集

任何建议将不胜感激。谢谢。

编辑:使用 DB2 9.5

【问题讨论】:

旁注:您提供的语句不需要使用子查询。此外,您不需要选择contract.contract_date,因为您不输出该列。我不知道这是否只是您试图获得一个最小示例,或者您的查询实际上是否看起来像那样。 嘿,是的,这只是我试图获得一个最小的例子! 【参考方案1】:

2 个问题。

您必须将您的默认语句分隔符更改为示例中的新分隔符。

您的示例中缺少 FROM 子句。

如果从 DB2 CLP 运行它应该是这样的。

--#SET TERMINATOR @
CREATE PROCEDURE test
DYNAMIC RESULT SETS 1  
BEGIN

DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT 
    count(province) as province_total,
    sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
    sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
    FROM (
       SELECT 
          contract.province,
          contract.contract_date
    FROM MY_TABLE
       WHERE contract.CON_CONTRACT_DATE >='2015-01-01' 
       AND contract.CON_CONTRACT_DATE < '2018-11-01'
    );
   OPEN C1;
   END@

【讨论】:

啊,FROM 很好,意味着将其包含在示例中。不确定更改语句分隔符是什么意思。 #SET TERMINATOR @ 是你的顶线吗? 这是 db2 命令行处理器的示例。它理解这样的指令。运行语句的工具应该有自己的方式来更改默认语句分隔符。 更改数据库默认终止符有效。谢谢。

以上是关于DB2 - 在光标中聚合大小写的主要内容,如果未能解决你的问题,请参考以下文章

db2中获取某个表/索引占用空间的大小

如何在 DB2 中找出当前事务日志的大小?

DB2 varchar 字符大小写?

使用 DB2 检索不区分大小写的 SQL 选择查询

在db2 如何计算表空间和表缓存空间?有会的么?

在不同浏览器中,input里面的输入光标大小表现形式却大不相同