本章將介紹如何在Sybase下使用遊標sql
因業務須要,要批量處理一些數據,sql須要用到循環,因此要使用遊標,我寫了一個簡單的遊標,sql以下spa
DECLARE my_Cursor CURSOR FOR SELECT c_name,n_age FROM T_USER --聲明遊標 OPEN my_Cursor--打開遊標 DECLARE @name VARCHAR(32), @age INT --聲明兩個變量,用來接收遊標的值 FETCH my_Cursor INTO @name,@age --把遊標中的值賦給變量 WHILE @@SQLSTATUS = 0 BEGIN INSERT INTO T_NEW (name,age) VALUES (@name,@age) --把數據保存到另外一個表 FETCH my_Cursor INTO @name,@age --把遊標中下一行的值賦給變量 END CLOSE my_Cursor --關閉遊標 DEALLOCATE CURSOR my_Cursor --釋放遊標
但在Sybase下執行時,一直報錯,報錯內容以下:code
Error (7344) DECLARE CURSOR must be the only statement in a query batch.
通過不斷排查,最後發現問題所在:blog
在聲明遊標後,沒有任何結束標誌,Sybase下默認定義的語句沒有執行完畢,以後open遊標,就會因找不到遊標致使報錯。
解決方法:
在聲明遊標後,添加GO標識,GO表明一段語句的終結。
修改後的sql以下:class
DECLARE my_Cursor CURSOR FOR SELECT c_name,n_age FROM T_USER --聲明遊標 GO --表明一段語句的終結。若沒有GO,則定義的語句沒有執行完畢,後面執行將會報錯 OPEN my_Cursor--打開遊標 DECLARE @name VARCHAR(32), @age INT --聲明兩個變量,用來接收遊標的值 FETCH my_Cursor INTO @name,@age --把遊標中的值賦給變量 WHILE @@SQLSTATUS = 0 BEGIN INSERT INTO T_NEW (name,age) VALUES (@name,@age) --把數據保存到另外一個表 FETCH my_Cursor INTO @name,@age --把遊標中下一行的值賦給變量 END CLOSE my_Cursor --關閉遊標 DEALLOCATE CURSOR my_Cursor --釋放遊標
再次執行,妥妥的,沒毛病……變量