Почему этот запрос не работает в Sybase? - PullRequest
3 голосов
/ 28 февраля 2011

Я работал с базой данных SQL Server. Теперь мне нужно работать с базой данных Sybase (используя Squirrel-клиент). Этот запрос не работает:

    DECLARE @tableName VARCHAR(500);
DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U';
OPEN my_cursor;
FETCH NEXT FROM my_cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
  BEGIN
      //Do something here
      FETCH NEXT FROM my_cursor;
  END
CLOSE my_cursor;
DEALLOCATE CURSOR my_cursor; 

Выдает ошибку - Incorrect syntax near the keyword 'FROM'. SQLState: ZZZZZ ErrorCode: 156 Error occured in: FETCH NEXT FROM my_cursor INTO @table_Name Теперь это прекрасно работает в базе данных SQL Server (после того, как я изменил последнюю строку на DEALLOCATE my_cursor. Кто-нибудь может сказать мне, где я иду не так?

Ответы [ 4 ]

7 голосов
/ 28 февраля 2011

Как указывает Митч, синтаксис выборки:

fetch cursor_name [into fetch_target_list]

Вам также необходимо объявить курсор в отдельном пакете, это означает, что вы должны поставить «GO» после оператора объявления. Затем вы обнаружите, что ваша переменная выпадает из области видимости, поэтому вам нужно переместить ее так, чтобы она шла после «GO».

Вам также нужно проверить @@ sqlstatus, чтобы увидеть, насколько успешной была выборка, а не @@ FETCH_STATUS, которая, я думаю, только MSSQL.

DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U'
go

DECLARE @tableName VARCHAR(500)
set nocount on
OPEN my_cursor
FETCH my_cursor INTO @tableName

WHILE @@sqlstatus = 0
  BEGIN
      --Do something here

      FETCH my_cursor INTO @tableName
      print @tablename
  END

CLOSE my_cursor
DEALLOCATE CURSOR my_cursor

И в конце строки в Sybase ASE не нужно использовать точки с запятой.

1 голос
/ 10 сентября 2012

Объявите @tablename после курсора.

1 голос
/ 28 февраля 2011
DECLARE @tableName VARCHAR(500);
DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U';

OPEN my_cursor;
FETCH my_cursor INTO @tableName;

WHILE @@FETCH_STATUS = 0
  BEGIN
      //Do something here

      FETCH my_cursor INTO @tableName;
  END

CLOSE my_cursor;
DEALLOCATE CURSOR my_cursor;
0 голосов
/ 16 февраля 2017

Прежде всего, Squirrel поддерживает 'go' в качестве разделителя пакетов SQL. Зайдите в пункт меню Сеанс -> Свойства сеанса ---> Вкладка «SQL».

Прокрутите вниз и установите «Разделитель операторов» как «go» (кавычки не нужны).

Тогда следуйте предыдущему ответу. «DECLARE CUROSR» может быть единственным оператором SQL в пакете, поэтому вы должны вставить «go» после него.

В следующем пакете повторно объявите все переменные, которые были объявлены в предыдущем пакете и на которые будут ссылаться во втором пакете.

Это должно работать. Вот как я годами тестировал код SQL с использованием курсоров.

...