powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE12 курсор
6 сообщений из 6, страница 1 из 1
ASE12 курсор
    #32644073
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, подкиньте пож ссылку на доку по использованию курсоров в ХП на ASE12, либо подскажите синтаксис как правильно реализовать следующее.

В процедуре необходимо пройтись по выборке(курсору) ,
внутри как в цикле, реализовать какие-то правила и выгрузить толко те записи которые необходимы. Так же интересует возможность создания вложенных курсоров, когда двигаясь по одному курсору мы создаем другие
...
Рейтинг: 0 / 0
ASE12 курсор
    #32644362
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ASE12 курсор
    #32644494
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while 1=1
begin

fetch <cursor name> into ...
if @@sqlstatus = 2 break
if @@sqlstatus = 1
begin
select @error = 1
raiserror 20000 'Ошибка при работе с курсором <cursor name>'
break
end

-- обработка строки


-- пример обработки ошибки

if @@error <> 0 or @@rowcount <> 1
begin
select @error = 1
raiserror 20000 'Ошибка ...'
break
end

end

автор хотел сказать что с каждым
fetch <cursor name> into ...
я получаю следующую запись
тогда вопрос если я заранее знаю что в курсоре 2 записи то
fetch <cursor name>
fetch <cursor name>
такая последовательность
без into должна вывести в ресалтдатасет две записи - не работает выводит одну
либо я не понял как происходит движение по курсору либо......
...
Рейтинг: 0 / 0
ASE12 курсор
    #32644683
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maks_f
с каждым

fetch <cursor name> into ...

я получаю следующую запись

тогда вопрос если я заранее знаю что в курсоре 2 записи то
fetch <cursor name>
fetch <cursor name>
такая последовательность без into должна вывести в ресалтдатасет две записи - не работает выводит одну
либо я не понял как происходит движение по курсору либо......


Нет, такая последовательность выводит ДВА резалтсета, по одной записи в каждом. Первую в первом, вторую во втором. Две (или более) записи сразу вывести нельзя, по крайней мере в ASE 12.
Для клиентского приложения это будут два полноценных резалтсета, таких, какие бы сформировал SELECT.

Я бы рекомендовал следать для того, что ты хочешь, временную таблицу, куда помещать в цикле курсора ПК нужных записей, а затем после курсора уже все выводить.
...
Рейтинг: 0 / 0
ASE12 курсор
    #32644840
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toMasterZIV

Обычный селект выдает две записи а процедура выдает все равно 1
ладно по поводу временных таблиц полностью согласен однако при попытке в ASE 12 создать таблицу
вот так create table #ert( field1 integer)

выдает ошибку The 'CREATE TABLE' commands not allowed within a multi-statement transaction in the 'tempdb' database

как это победить пока не нашел
...
Рейтинг: 0 / 0
ASE12 курсор
    #32644953
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Maks_f]toMasterZIV
при попытке в ASE 12 создать таблицу
вот так

create table #ert( field1 integer)

выдает ошибку

The 'CREATE TABLE' commands not allowed within a multi-statement transaction in the 'tempdb' database

как это победить
/quot]

Для этого можно сделать одно из двух
1) Переместить CREATE TABLE #... так, чтобы он был ДО начала транзакции.
Это более правильный метод, поскольку создание таблицы в tempdb внутри транзакции заблокирует tempdb практически эксклюзивно за этим процессом на время всей транзакции.

2) Поставить опцию 'ddl in tran' в базе данных tempdb в ON (а также еще и в model чтобы значение опции сохранялось после перезагруки сервера).

Можно сделать и то и другое вместе, шаги не взаимоисключающие.
Это все никак не связано с работой кода TSQL внутри процедуры, т.е. что в процедуре, что в батче - все работает одинаково.
В триггере первый способ невозможен, поскольку транзакция в нем всегда уже открыта.

С созданием временных таблиц внутри процедуры, которая использует транзакции, связана только одна дополнительная особенность :
только первая процедура в стеке вызовов процедур, которая реально начинает транзакцию (@@trancount переходит 0->1), может создать в транзакции временную таблицу с # в начале. Причина такого поведения неивестна. Если у вас нет вложенных процедур, то все в порядке. Если вы собираетесь вызывать из вашей процедуры другие процедуры, причем делать это внутри транзакции, и создавать временные таблицы вам тоже нужно в транзакции, то создавайте ВСЕ таблицы в этой головной процедуре.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE12 курсор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]