DB2 - объединение с регистром в курсоре - PullRequest
0 голосов
/ 06 декабря 2018

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

1 Ответ

0 голосов
/ 06 декабря 2018

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@
...