Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

упроавление вложенными курсорами MSSQL2000   Найти похожие ветки 

 
stud ©   (2005-08-16 14:09) [0]

каким образом организовать "вложеный" цикл в sql 2000?
т.е. есть запрос типа:
declare contr_cur cursor for
select distinct
 .........
 where contracts.contract_type=1 and
       (contracts.contract_close_date is null or
       contracts.contract_close_date>getdate())

declare account_cur cursor for
 select account.account,
        account.rest_bal
        from account where account.contract_id=@contract_id */

open contr_cur
fetch next from contr_cur into @contract_num, @client_id, @contract_date_from, @contract_date_to,
                               @contract_id, @cl_name
while @@fetch_status=0 begin
  select @Temp_fetch=@@fetch_status
  fetch next from contr_cur into @contract_num, @client_id, @contract_date_from, @contract_date_to,
                               @contract_id, @cl_name
  open account_cur
  fetch next from account_cur into @cl_account, @ostatok
  while @@fetch_status=0 begin
     fetch next from account_cur into @cl_account, @ostatok
     insert into #kredit_port (contract_num, client_id, contract_date_from, contract_date_to, contract_id, cl_name, cl_account, ostatok)
     values (@contract_num, @client_id, @contract_date_from, @contract_date_to, @contract_id, @cl_name, @cl_account, @ostatok)
  end  
 deallocate account_cur
end
но при выборе данных вложенного набора значение @@Fetch_status=0 и происходит выход из внешнего цикла
как быть в такой ситуации?


 
Fay ©   (2005-08-16 14:13) [1]

второй объявляй внутри


 
stud ©   (2005-08-16 14:21) [2]

не помогает, в результате пустой набор, если выводить результаты отдельно для каждого курсора, имею все нужные данные
в документации сказано что fetch_status - глобальная переменная для текущего подключения, очевидно проблема в этом


 
DiamondShark ©   (2005-08-16 14:50) [3]

У тебя бред написан.

open contr_cur
fetch next from contr_cur into @contract_num, @client_id, @contract_date_from, @contract_date_to,
                              @contract_id, @cl_name
while @@fetch_status=0 begin
 open account_cur
 fetch next from account_cur into @cl_account, @ostatok
 while @@fetch_status=0 begin
    insert into #kredit_port (contract_num, client_id, contract_date_from, contract_date_to, contract_id, cl_name, cl_account, ostatok)
    values (@contract_num, @client_id, @contract_date_from, @contract_date_to, @contract_id, @cl_name, @cl_account, @ostatok)
    fetch next from account_cur into @cl_account, @ostatok
 end  
close account_cur
 fetch next from contr_cur into @contract_num, @client_id, @contract_date_from, @contract_date_to,
                              @contract_id, @cl_name
end

Так попробуй.


 
Fay ©   (2005-08-16 14:57) [4]

2 stud ©   (16.08.05 14:21) [2]
Вот пример.
use pubs
go

if object_id("T2") is not null drop table T2
if object_id("T1") is not null drop table T1

create table T1(
ID int not null identity(1, 1),
NAME varchar(30) not null,
constraint PK_T1 primary key (ID)
)

create table T2(
ID int not null identity(1, 1),
T1_ID int not null,
NAME varchar(30) not null,
constraint PK_T2 primary key (ID),
constraint FK_T2_T1 foreign key (T1_ID) references T1(ID)
)

insert into T1 values ("Один")
insert into T1 values ("Два")

insert into T2 values (1, "1-1")
insert into T2 values (1, "1-2")
insert into T2 values (1, "1-3")
insert into T2 values (2, "2-1")
insert into T2 values (2, "2-2")
insert into T2 values (2, "2-3")

declare
 @T1_ID int,
 @T2_ID int,
 @T1_NAME varchar(30),
 @T2_NAME varchar(30)

declare c1 cursor for select ID, NAME from T1

open c1
goto L1
while @@fetch_status = 0 begin
 declare c2 cursor for select ID, NAME from T2 where T1_ID = @T1_ID
 open c2
 goto L2
 while @@fetch_status = 0 begin
   print "T1.ID = " + cast(@T1_ID as varchar(8)) + ", T1.NAME = " + @T1_NAME + ", T2.ID = " + cast(@T2_ID as varchar(8)) + ", T2.NAME = " + @T2_NAME
   L2:
   fetch next from c2 into @T2_ID, @T2_NAME
 end
 close c2
 deallocate c2
 L1:
 fetch next from c1 into @T1_ID, @T1_NAME
end

close c1
deallocate c1


 
DiamondShark ©   (2005-08-16 15:05) [5]

goto внутрь цикла -- это сильно.


 
stud ©   (2005-08-16 15:06) [6]


> DiamondShark ©   (16.08.05 14:50) [3]


> stud ©   (16.08.05 14:21) [2][Ответить]


 
Fay ©   (2005-08-16 15:08) [7]

2 DiamondShark ©   (16.08.05 15:05) [5]
Мне так нравится. Удобно при внесении изменений и (IMHO) симпатичнее.


 
stud ©   (2005-08-16 15:16) [8]


> Fay ©   (16.08.05 14:57) [4][Ответить]

спасибо. переместил внуть цикла первого курсора определение второго курсора и заработало, хотя и не сразу))


 
Fay ©   (2005-08-16 15:18) [9]

2 stud ©   (16.08.05 15:16) [8]
Часто помогают уверенность и натиск 8)



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
5-1100761074
Stanislav
2004-11-18 09:57
2005.09.25
Не создаеься потомок Tcollectionitem


1-1125312847
kyn66
2005-08-29 14:54
2005.09.25
Поиск в ListBox на полное совпадение...?


3-1123057899
surkis
2005-08-03 12:31
2005.09.25
Поскажите компоненты и репорты


14-1125566980
palva
2005-09-01 13:29
2005.09.25
Подаете ли вы нищим?


2-1124027784
Андрей Молчанов
2005-08-14 17:56
2005.09.25
FreeAndNil(Form1) и Form1.Free