Sybase ASE: как распечатать все строки таблицы с помощью курсора? - PullRequest
0 голосов
/ 31 января 2020

Следующий код должен печатать все строки, содержащиеся во временной таблице #table_A:

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                                                                      

open c_table_A                               
  fetch c_table_A                            
  while @@sqlstatus = 0                             
    begin                                           
      print '%1!', c_table_A                 
      fetch c_table_A                        
    end                                             
close c_table_A   


go  

Однако это приводит к следующему сообщению об ошибке:

DECLARE CURSOR must be the only statement in a query batch.  

Как можно Я печатаю все строки, содержащиеся в (временной) таблице?


Вот еще один способ задать мой вопрос:

Я пытаюсь сделать что-то подобное:

open c_table_A                               
  fetch c_table_A into @record_variable                           
  while @@sqlstatus = 0                             
    begin                                           
      print '%1!', @record_variable
      fetch c_table_A into @record_variable                       
    end                                             
close c_table_A   

Есть ли способ объявить переменную, содержащую целую строку таблицы в sybase?


PS: просто использование "select * from ..." не работает для меня. Мне нужно сделать некоторые вещи с каждой строкой перед печатью строки. (Предполагается, что мой вопрос сосредоточен на основной части, поэтому я не стал go подробно рассказывать о других вещах, которые мне нужно делать с каждой строкой)

1 Ответ

0 голосов
/ 04 февраля 2020

Спасибо за разъяснения.

В пакете 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
...