这个存储过程错在哪里?

jacky_explorer 2002-04-19 06:07:28
运行下面这个存储过程,提示我游标是只读的,但明是for update of IDO(可以更新的呀,不好意思,菜鸟)
CREATE PROCEDURE [mycursor] AS
declare hu_mycursor scroll cursor
for select ID0 from depart for update of ID0
open hu_mycursor
declare @row int
set @row=@@cursor_rows
while @row>0
begin
declare @get_id int
fetch hu_mycursor into @get_id
if @get_id<200
update depart set ID0=ID0+ID0*0.2
where current of hu_mycursor
else
update depart set ID0=ID0-ID0+0.2
where current of hu_mycursor
set @row=@row-1
end
close hu_mycursor
deallocate hu_cursor
...全文
31 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_zing 2002-04-26
  • 打赏
  • 举报
回复
如果是对游标中所有记录进行循环,为什么不用
while @@fetch_status=0
begin
...
fetch next ...
end
这样的形式呢?
x_zing 2002-04-26
  • 打赏
  • 举报
回复
你仔细查查@@cursor_rows的用法,在你这里使用不当!@@cursor_rows保存最近一次启动时游标的行数。由此应该可以理解:
@@cursor_rows是-1,是因为你使用fetch语句从游标中取走一行。
jacky_explorer 2002-04-26
  • 打赏
  • 举报
回复
经过调试,现在发现问题在于@@cursor_rows,它的值应该是select ID0 from depart所选出的记录数,但是调试时,发现他等于-1,,为什么?
jacky_explorer 2002-04-22
  • 打赏
  • 举报
回复
是的!但是我改为numeric也是一样的!Read only Cursor!同时我将'+'号改为
'*'号也是一样的!

x_zing 2002-04-22
  • 打赏
  • 举报
回复
不要使用scroll选项,此选项与你的for update 语句冲突!在你这个例子中不用scroll中也可通过!
jacky_explorer 2002-04-22
  • 打赏
  • 举报
回复
是的!但是我改为numeric也是一样的!Read only Cursor!
rwq_ 2002-04-22
  • 打赏
  • 举报
回复
update depart set ID0=ID0-ID0+0.2 where .....

这个你确定修改后的ID0是INT类型?
jacky_explorer 2002-04-22
  • 打赏
  • 举报
回复
仍然是游标只读,盼望答复!
kaikaihe 2002-04-20
  • 打赏
  • 举报
回复
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

Transact-SQL 扩展语法
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

SQL-92 参数
cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。

INSENSITIVE

定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。

SCROLL

指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 中的子句与所请求的游标类型的功能发生冲突,则 Microsoft® SQL Server™ 隐性地将游标转换为另一种类型。有关更多信息,请参见隐性游标转换。

READ ONLY

Prevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。
liu800323 2002-04-20
  • 打赏
  • 举报
回复
CREATE PROCEDURE [mycursor] AS
declare @xx int
declare hu_mycursor scroll cursor
for select ID0 from depart
open hu_mycursor
fetch hu_mycursor into xx
declare @row int
set @row=@@cursor_rows
while @row>0
begin
declare @get_id int
fetch hu_mycursor into @get_id
if @get_id<200
update depart set ID0=ID0+ID0*0.2
else
update depart set ID0=ID0-ID0+0.2
set @row=@row-1
fetch hu_mycursor into xx
end
close hu_mycursor
deallocate hu_cursor
yhwebus 2002-04-20
  • 打赏
  • 举报
回复
up
hanwen 2002-04-19
  • 打赏
  • 举报
回复
会不会是这个,比如:ID0=10, ID0=ID0-ID0+0.2 ,ID0=0了呢
ID0是int型啊
jacky_explorer 2002-04-19
  • 打赏
  • 举报
回复
字段ID0是int

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧