游标子查询 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@
我正在尝试创建一个存储过程,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@