游标子查询 DB2

Cursor Subquery DB2

我正在尝试创建一个存储过程,returns 一个数据集,使用游标,包含多个子查询。该查询在作为独立脚本执行时有效,但在使用游标将其放入存储过程格式时无效。具体来说,似乎只有子查询的一行有外部查询 运行 反对它。

SELECT 
    contract.province,
    contract.contract_date
WHERE contract.CON_CONTRACT_DATE >='2015-01-01' 
AND contract.CON_CONTRACT_DATE < '2018-11-01'

Returns:

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

然后我将该查询嵌套到以下内容中:

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

我应该得到的是:

Province | 
---------
Ontario  |
Quebec   |

但我只得到:

Province | 
---------
Ontario  |

我的实际查询比这复杂得多,我知道你不会有一个子查询来给你主查询给你的东西(已经获得省份,为什么还要再次查询),但这是我得到的一般问题,尽管非常简化。

如有任何建议,我们将不胜感激。谢谢。

下面的结果是什么? 我在游标声明中添加了 'WITH HOLD' 子句,因为如果您用来调用 SP 的工具以自动提交模式运行并在结果集处理期间发出一些其他查询,这可能会有所帮助。这些查询将隐式关闭游标。您可以将此子句注释掉以检查结果是否不同。

--#SET TERMINATOR @

create or replace procedure test
dynamic result sets 1
begin
  DECLARE C2 CURSOR 
  WITH HOLD 
  WITH RETURN TO CALLER FOR
  with contract (Province, Con_Contract_date) as (values 
    ('Ontario', date('2017-06-11'))
  , ('Quebec', date('2017-07-12'))
  )
  SELECT province
  FROM (
  SELECT 
      contract.province,
      contract.con_contract_date
  FROM contract
  WHERE contract.CON_CONTRACT_DATE >='2015-01-01' 
  AND contract.CON_CONTRACT_DATE < '2018-11-01'
  );

  OPEN C2;
end@

CALL TEST@