Я пытаюсь создать хранимую процедуру, которая возвращает набор данных, используя курсор, который содержит несколько агрегатных функций над подзапросами.Запрос работает, когда выполняется как отдельный скрипт, но при переводе его в формат хранимой процедуры с использованием курсора он не работает.При использовании агрегата код работает нормально.При использовании агрегата в операторе 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