Как сделать вложенный курсор в sybase ase - PullRequest
0 голосов
/ 11 июля 2019

Могу я спросить, как правильно сделать вложенный курсор в sybase?Я получаю две ошибки в своем коде ниже.

  1. Необходимо объявить переменную @ notes
  2. Объявление курсора должно быть единственным оператором в пакете запроса.

Текущая попытка кодирования:

DECLARE c3 cursor FOR
select distinct cust_ac_no from tempdb..M3_SHP_ACCOUNT_NOTES
where cust_ac_no in ('851243048')
--,'851261620
--order by cust_ac_no, inst_seq_no, ord_no, ref_no, acv_no
GO

DECLARE 
@exec_str1 varchar(8000),
@exec_str2 varchar(8000),
@cust_ac_no varchar(10),
@c_ac varchar(10),
@notes varchar(4000),
@notes2 varchar(8000)

--select @exec_str1 = "select distinct notes from tempdb..M3_SHP_ACCOUNT_NOTES where cust_ac_no = "

OPEN c3
FETCH c3 into @cust_ac_no

WHILE @@sqlstatus = 0

  BEGIN

  DECLARE c2 cursor FOR
  select distinct notes from tempdb..M3_SHP_ACCOUNT_NOTES
  where cust_ac_no = + "'" + @cust_ac_no + "'"
  order by cust_ac_no, inst_seq_no, ord_no, ref_no, acv_no
  GO


  OPEN c2
  FETCH c2 into @notes

  WHILE @@sqlstatus = 0
  BEGIN

  print @notes

  FETCH c2 into @notes  
  END
  CLOSE c2
  DEALLOCATE c2

  print @cust_ac_no
  FETCH c3 into @cust_ac_no
  END

CLOSE c3
DEALLOCATE c3

1 Ответ

0 голосов
/ 11 июля 2019

Основываясь исключительно на предоставленном коде, мне кажется, что это можно сделать одним курсором.

Допущения:

  • , в то время как в примере показан только один cust_ac_no, использование предложения 'in()' заставляет меня думать, что нам может понадобиться обработать список cust_ac_no, поэтому я напишу это для поддержки нескольких cust_ac_no в списке
  • в примере кода показано, что cust_ac_no печатается после были напечатаны соответствующие notes

Одно из возможных решений с одним курсором:

declare c3 cursor
for
select distinct
       cust_ac_no,
       notes
from   tempdb..M3_SHP_ACCOUNT_NOTES
where  cust_ac_no in ('851243048')  -- could be multiple cust_ac_no's
order by cust_ac_no, inst_seq_no, ord_no, ref_no, acv_no
go

declare @cust_ac_no        varchar(10),
        @cust_ac_no_prev   varchar(10),
        @notes             varchar(4000)

select @cust_ac_no_prev = NULL

open c3

fetch c3 into @cust_ac_no, @notes

while @@sqlstatus = 0
begin
    if @cust_ac_no_prev is NULL
        select @cust_ac_no_prev = @cust_ac_no

    -- print cust_ac_no *after* its associated notes have been printed;
    -- this should be done when we fetch a new cust_ac_no:

    if @cust_ac_no_prev != @cust_ac_no
        print @cust_ac_no_prev

    print @notes

    fetch c3 into @cust_ac_no, @notes
end

-- print the last fetched cust_ac_no:

print @cust_ac_no

close c3
deallocate c3
go
...