Спасибо за разъяснения.
В пакете SQL, а не в хранимой процедуре, объявление курсора должно быть отделено от пакета, который его использует, следовательно, между declare cursor
и последующим пакетом должен быть go
.
Нет способа определить "переменную строки" в Sybase ASE, извините. Каждый столбец, возвращаемый в переменную, должен иметь объявленную переменную. В приведенном ниже примере @id и @foo объявлены как те же типы, что и столбцы id и foo в таблице. Другие СУБД имеют «типы данных записи», но, к сожалению, это не Sybase ASE.
Прежде чем использовать курсор, который на большой таблице будет относительно медленным, вы можете выполнить другую обработку в отборное заявление. Если имеется условная логика c case ... when ... then ... else ... end
, которая может оказаться полезной, хотя вызов хранимой процедуры непосредственно из оператора выбора невозможен, вы можете вызвать пользовательскую функцию SQL. Возможно, это отдельный вопрос, если вам нужна помощь.
Я также добавил оператор deallocate cursor
, который является частью синтаксиса и освобождает внутренние рабочие пространства, связанные с вашим соединением.
Вы может потребоваться выполнить set nocount on
перед запуском пакета, он удаляет иногда раздражающее сообщение (1 row affected)
.
set nocount on
go
create table #table_A
(
ID int NULL ,
foo int NULL
)
go
insert into #table_A values (1, 2)
insert into #table_A values (2, 3)
go
declare c_table_A cursor
for select *
from #table_A
order
by 1
go
declare
@id int,
@foo int
open c_table_A
fetch c_table_A into @id, @foo
while @@sqlstatus = 0
begin
print 'id: %1! foo: %2!', @id, @foo
fetch c_table_A into @id, @foo
end
close c_table_A
go
deallocate cursor c_table_A
go