Курсорный подзапрос DB2 - PullRequest
       12

Курсорный подзапрос DB2

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

Я пытаюсь создать хранимую процедуру, которая возвращает набор данных, используя курсор, который содержит несколько подзапросов.Запрос работает, когда выполняется как отдельный скрипт, но при переводе его в формат хранимой процедуры с использованием курсора он не работает.В частности, создается впечатление, что внешний запрос выполняется только в одной строке подзапроса.

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

Возвращает:

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  |

Мой фактический запрос намного сложнее, чем этот,Я понимаю, что у вас не будет подзапроса, чтобы дать вам то, что даст основной запрос (уже полученная провинция, зачем вам нужно запрашивать его снова), но это общая проблема, которую я получаю, хотя и очень упрощенная.

Любой совет будет принята с благодарностью.Благодаря.

1 Ответ

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

Каков результат следующего?Я добавил предложение 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@
...