你这个比较复杂啊:(
DECLARE @dateLast DATETIME -- 上一条时间,用于比较DECLARE @date DATETIME
,@vin VARCHAR(10)
,@a INT
,@b INT
-- 1定义游标
DECLARE cur_ CURSOR FOR
SELECT C_DATE, vin, a, b
FROM TableX
OPEN @cur_
-- 2取第1条记录
FETCH NEXT FROM cur_ INTO @dateLast, @vin, @a, @b
--3循环处理
--30 取下1条记录
FETCH NEXT FROM cur INTO @date, @vin, @a, @b
WHILE @@FETCH_STATUS = 0
BEGIN
-- 31 比较日期
IF @date <> @dateLast + 1
BEGIN
--311 缺漏,则插入
INSERT INTO TableX(C_Date, vin, a, b)
SELECT @date + 1 -- 注意:新日期
,vin
,a
,b
FROM TableX
WHERE C_Date = @dateLast
-- 312
SET @dateLast = @dateLast + 1 --可能缺漏不止1天,所以依然要循环
END
ELSE
--39 取下一条
FETCH NEXT FROM cur INTO @date, @vin, @a, @b
END
--4 关闭游标
CLOSE cur_
DEALLOCATE cur_
你通过游标把所有数据都取了,可是语句set @word=@fgroup+@word2,只在@word保留了当前取得的数据,最后当然只有最后一行数据了,把set @word=@fgroup+@word2改成set @word=@word+@fgroup+@word2 试试。
用dbms_sql实现吧,参考下面语句
declare
v_cursorid number;
v_selectrecords varchar2(500);
v_numrows integer;
v_mynum integer;
v_mytext varchar(50);
begin
v_cursorid := dbms_sqlopen_cursor;
v_selectrecords := 'select from mytable';
dbms_sqlparse(v_cursorid,v_selectrecords,dbms_sqlnative);
dbms_sqldefine_column(v_cursorid,1,v_mynum);
dbms_sqldefine_column(v_cursorid,2,v_mytext,50);
v_numrows := dbms_sqlexecute(v_cursorid);
loop
if dbms_sqlfetch_rows(v_cursorid)=0 then exit;
end if;
dbms_sqlcolumn_value(v_cursorid,1,v_mynum);
dbms_sqlcolumn_value(v_cursorid,2,v_mytext);
dbms_outputput_line(v_mynum||' '||v_mytext);
end loop;
dbms_sqlclose_cursor(v_cursorid);
end;
declare cur_test cursor for select 专业名称 from dbo数据总表 where 条件 group by 专业名称
open cur_test
fetch cur_test into @专业代码名称
while(@@fetch_status = 0)
begin
--这里是你自己要做的 *** 作内容。比如查询变量值
select @专业代码名称
fetch next from cur_test into @专业代码名称
end
close cur_test
deallocate cur_test供xuanhao2016参考。如有帮助你采纳。可到IT实验室,天天件测试网论坛上进一步交流。
以上就是关于SQL游标问题全部的内容,包括:SQL游标问题、求助:MSSQL游标 next 后只能取一行数据、这个存储过程游标为什么不能执行sql语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)