Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 08:00   #1
Veroonya
Пользователь
 
Аватар для Veroonya
 
Регистрация: 09.10.2008
Сообщений: 30
Вопрос the cursor is read only

Чем может быть вызвана такая ошибка? " the cursor is read only"
Код:
declare @startdate1 datetime, @startdate2 datetime, @enddate1 datetime, @enddate2 datetime

declare @table table (DOCUMENTSTYPE int, PERSONOUID int, startdate1 datetime, enddate1 datetime, startdate2 datetime,
enddate2 datetime)

INSERT INTO @table 
select doc.DOCUMENTSTYPE, doc.PERSONOUID, doc.ISSUEEXTENSIONSDATE as stdate1, doc.COMPLETIONSACTIONDATE as enddate1, 
max(docum.ISSUEEXTENSIONSDATE) as stdate2, docum.COMPLETIONSACTIONDATE as enddate2
from WM_ACTDOCUMENTS doc
inner join WM_ACTDOCUMENTS docum
ON doc.DOCUMENTSTYPE=docum.DOCUMENTSTYPE  and doc.PERSONOUID=docum.PERSONOUID
where docum.COMPLETIONSACTIONDATE is null
group by doc.DOCUMENTSTYPE, doc.PERSONOUID, doc.ISSUEEXTENSIONSDATE, doc.COMPLETIONSACTIONDATE, 
docum.COMPLETIONSACTIONDATE
having max(docum.ISSUEEXTENSIONSDATE)<doc.ISSUEEXTENSIONSDATE
order by doc.PERSONOUID,doc.DOCUMENTSTYPE

DECLARE cur2 curSOR FOR 
SELECT startdate1 from @table
ORDER BY PERSONOUID, DOCUMENTSTYPE, startdate1

DECLARE cur1 curSOR FOR 
SELECT COMPLETIONSACTIONDATE
from WM_ACTDOCUMENTS doc  inner join @table t1 ON 
t1.DOCUMENTSTYPE=doc.DOCUMENTSTYPE and t1.PERSONOUID=doc.PERSONOUID and 
doc.ISSUEEXTENSIONSDATE=t1.startdate2 and doc.COMPLETIONSACTIONDATE=t1.enddate2
order by doc.PERSONOUID, doc.DOCUMENTSTYPE, t1.startdate1
FOR UPDATE OF COMPLETIONSACTIONDATE

BEGIN TRANSACTION

OPEN cur1
OPEN cur2

FETCH NEXT FROM cur1 
INTO @enddate2
FETCH NEXT FROM cur2
INTO @startdate1
while @@FETCH_STATUS = 0 
begin
UPDATE WM_ACTDOCUMENTS 
SET COMPLETIONSACTIONDATE= @startdate1-1
where current of cur1
fetch next from cur1 into @enddate2
fetch next from cur2 into @startdate1
end

close cur1
deallocate cur1

close cur2
deallocate cur2
Поясню запрос:
1. Выбираются начальная и конечная дата двух документов, даты начала которых идут подряд.
2. Поля Personouid и documentstype
определяют владельца и тип докумета соответственно.
3. Необходимо исправить в каждом документе дату окончания на дату начала следующего документа (минус 1 день)
Veroonya вне форума Ответить с цитированием
Старый 17.03.2009, 15:13   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Не MS SQL случаем?
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 19.03.2009, 17:55   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

может я чота не понимаю, но имхо конструкция FOR UPDATE в любом SQL-е (где оно поддерживается) означает блокирование данных для других транзакций

соответственно, либо не лочить, либо ...
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
error creating cursor handle? Geddar Общие вопросы Delphi 2 31.05.2008 15:19
Cursor NeiL Общие вопросы Delphi 4 13.02.2008 20:45
Cursor in Control NeiL Общие вопросы Delphi 1 09.02.2008 16:00