1 可能存在问题,游标取值没有发生变化
2 原因可能是游标定义不当,导致游标取值没有变化。
另外,也有可能是在游标循环中没有对游标取值进行更新。
3 对于游标定义不当的问题,需要重新检查游标定义是否准确,对于游标循环中没有对游标取值进行更新的问题,可以直接在游标循环中对游标取值进行更新,保证游标的正确性。
这 句话的位置错了
FETCH NEXT FROM mycursor INTO @orderid
declare @orderid NVARCHAR(50)
DECLARE mycursor CURSOR FOR
select ID from GM_Order
OPEN mycursor
FETCH NEXT FROM mycursor INTO @orderid
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @orderid
FETCH NEXT FROM mycursor INTO @orderid
END
CLOSE mycursor
DEALLOCATE mycursor
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
不知道mysql这个跟oracle里面,是不是一致的,下面是我学习的时候总结的
如果一个过程要返回一个结果集,那么要引用游标来处理这个结果集。
create or replace procedure Test
(
varEmpName empename%type
)
As
begin ------会报错错误原因没有into子句
select from emp where ename like '%'||varEmpName||'%';
end;
这个程序我们无法用into,因为在Oracle里面没有一个类型去接受一个结果集这个时候我们可以声明游标对象去接受他
有俩种方法:
一种是声明系统游标,一种是声明自定义游标,然后后面 *** 作一样,参数类型为
in out 或out
(1)声明个人系统游标(推荐)
create or replace p_temp_procedure
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select from tablename;
end
调用
declare
cur_calling sys_refcursor;
begin
p_temp_procedure(cur_calling); --这样这个游标就有值了
for rec_next in cur_calling loop
end loop;
end;
(2)在包头中申明一个游表类型,然后调用者申明一个这个类型的游标变量,传给返回游标的存储过程 ,存储过程out这个结果集,这种方法很麻烦游标类型不能像索引表一样使用create or replace type方法来创建,所以只能在包中申明,并且需要使用/来执行,后面的存储过程才认这个游标类型(不推荐,但是建议要知道并且要会这种方式,毕竟它有它存在的道理)
--定义全局变量
create or replace package pkg_package
as
type type_cursor is ref cursor;
type type_record is record
(
test01 varchar2(32),
test02 varchar2(32),
test03 varchar2(32)
);
end;
/
--创建返回游标的存储过程
create or replace procedure p_temp_procedure
(
cur_out_arg out pkg_packagetype_cursor
)
is
begin
open cur_out_arg for select from test;
end;
/
--调用
declare
cur_out_arg pkg_packagetype_cursor;
rec_arg pkg_packagetype_record;
begin
p_temp_procedure(cur_out_arg);
fetch cur_out_arg into rec_arg;
dbms_outputput_line(rec_argtest01);
dbms_outputput_line(rec_argtest02);
dbms_outputput_line(rec_argtest03);
end;
不知道你 什么版本的 mysql
1、
我使用的 mysql, 好像没有 create or replace procedure 这样的语法。
只能 create procedure
可能是我的 mysql 版本太低了吧
2、
MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
这个不知道是不是也是我mysql 版本太低的问题。
create or replace procedure proc_updateDist
修改为
create procedure proc_updateDist ()
3、游标部分, 缺少了 DECLARE CONTINUE HANDLER
以及 判断什么时候退出循环的语句。
>
--传入id,输出name和sex的存储过程,这里同个id有多条数据,所以需要用到游标。
DELIMITER //
CREATE PROCEDURE p5(IN v_id INT)
BEGIN
DECLARE nodata INT DEFAULT 0;#注意:这个变量声明必须放在游标声明前面
DECLARE v_name VARCHAR(30);
DECLARE v_sex CHAR(3);
DECLARE c_ns CURSOR FOR SELECT NAME,sex FROM t WHERE id = v_id;
DECLARE EXIT HANDLER FOR NOT FOUND SET nodata = 1;#当读到数据的最后一条时,设置变量为1
OPEN c_ns;
WHILE nodata = 0 DO#判断是不是到了最后一条数据
FETCH c_ns INTO v_name,v_sex;
SELECT v_name,v_sex,nodata;
END WHILE;
CLOSE c_ns;
END
//
--执行该存储过程
mysql> call p5(2);
+--------+-------+--------+| v_name | v_sex | nodata |
+--------+-------+--------+
| song | 女 | 0 |
+--------+-------+--------+
1 row in set (004 sec)
+--------+-------+--------+
| v_name | v_sex | nodata |
+--------+-------+--------+
| dan | 男 | 0 |
+--------+-------+--------+
1 row in set (005 sec)
Query OK, 0 rows affected, 1 warning (005 sec)
--注意:CONTINUE 会继续当前的block 中的语句, 它在set done=1 后继续执行下一个语句。EXIT 则在 set done=1 后离开当前的语句块
所以这里用了EXIT(**阴影部分)
如果是continue,结果如下:
mysql> call p5(2);-> //
+--------+-------+
| v_name | v_sex |
+--------+-------+
| song | 女 |
+--------+-------+
1 row in set (000 sec)
+--------+-------+
| v_name | v_sex |
+--------+-------+
| dan | 男 |
+--------+-------+
1 row in set (001 sec)
+--------+-------+
| v_name | v_sex |
+--------+-------+
| dan | 男 |
+--------+-------+
1 row in set (002 sec)
Query OK, 0 rows affected, 1 warning (003 sec)
mysql存储过程是这样的
create procedure sp_get_user_count
(
out v_count int
)
begin
select count(1) into v_count from t_user;
select from t_dept;
select from t_class;
end;
由于mysql不能返回游标,那么使用mybatis框架在取的时候应该怎么取呢?怎样确定取出来的是t_dept的还是t_class
<!--这段应改怎么写啊?-->
<select id="selectAll" >
call sp_get_user_count()
</select>
以上就是关于mysql存储过程游标取值没有变化全部的内容,包括:mysql存储过程游标取值没有变化、mysql 游标循环读取下一行的问题、请教:mysql数据库有个游标吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)