我似乎找到问题了?难道MySQL的存储过程中,使用了游标的话,就不能用OUT返回值吗?我把存储过程中 OUT jyszqdm VARCHAR(100) 这一句去掉,然后在循环结束之后,加上一句: UPDATE table_temp SET _value = jyszq WHERE id = 1; 把得到的字符串变量jyszq,用UPDATE的语句,传给另外一张新表。 在新表中,就可以得到所想要的字符串。这是为什么??? 我的MySQL版本是5.532
现在我能确认循环结束之后,变量jyszq的值,是我想要的结果,但是用OUT返回给delphi的话,就不行。DELPHI取得返回值的方法,我应该是没有问题的。 因为如果我把mysql存储过程中的语句全部清空,然后改为最简单的 SET jysdm = 'abc';,再用OUT输出的话,在DELPHI中可以正常的得到值abc。
我现在只能这么做了。非常感谢。只是觉得MySQL不会这么弱吧?
用结果集方法: select jyszq;在DELPHI中 query.open; while not query.eof do begin //读数据 query.next; end;
CREATE PROCEDURE hrkip.routine_Sshq() BEGIN DECLARE done int default 0; DECLARE zqdm VARCHAR(45) default ''; DECLARE jysdm VARCHAR(45) default ''; DECLARE jyszq VARCHAR(100) default ''; DECLARE jyszqdm VARCHAR(100) default ''; DECLARE cur_zqhq CURSOR FOR SELECT zq_dm, jys_dm FROM zq LEFT JOIN jys ON jys.jys_id = zq.jys_id WHERE zq_cxhq = 1; DECLARE CONTINUE handler for not found set done = 1; OPEN cur_zqhq; REPEAT fetch cur_zqhq into zqdm, jysdm; IF not done THEN SET jyszq = CONCAT(jyszq, jysdm, zqdm, ','); END IF; until done end repeat; close cur_zqhq; SET jyszqdm = jyszq; END不知道楼主打算怎么使用存储过程的最终结果 ?如果只是使用存储过程的结果,为什么不创建函数,函数不是有返回值,直接接收使用即可 CREATE FUNCTION hrkip.routine_Sshq() RETURNS varchar(255) CHARSET utf8 BEGIN declare result varchar(255) default ''; DECLARE done int default 0; DECLARE zqdm VARCHAR(45) default ''; DECLARE jysdm VARCHAR(45) default ''; DECLARE jyszq VARCHAR(100) default ''; DECLARE jyszqdm VARCHAR(100) default ''; DECLARE cur_zqhq CURSOR FOR SELECT zq_dm, jys_dm FROM zq LEFT JOIN jys ON jys.jys_id = zq.jys_id WHERE zq_cxhq = 1; DECLARE CONTINUE handler for not found set done = 1; OPEN cur_zqhq; REPEAT fetch cur_zqhq into zqdm, jysdm; IF not done THEN SET jyszq = CONCAT(jyszq, jysdm, zqdm, ','); END IF; until done end repeat; close cur_zqhq; SET jyszqdm = jyszq; set result = jyszq; return result; END
DECLARE cur_zqhq CURSOR FOR SELECT zq_dm, jys_dm FROM zq LEFT JOIN jys ON jys.jys_id = zq.jys_id WHERE zq_cxhq = 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur_zqhq; REPEAT FETCH cur_zqhq INTO zqdm, jysdm; IF done = 0 THEN SET jyszq = CONCAT(jyszq, jysdm, zqdm, ','); END IF; select jyszq ; UNTIL done = 1 END REPEAT; SET jyszqdm = jyszq; END 加上这种然后再观察循环是否在工作。
on a.zq_cxhq=b.jys_id
where a.zq_cxhq=1结果是否正确。可以将上述结果插入到临时表中保存
select concat(b.jys_dm, a.zq_dm) from zq a inner join jys b
on a.zq_cxhq = b.jys_id
where a.zq_cxhq= 1;
+---------------------------+
| concat(b.jys_dm, a.zq_dm) |
+---------------------------+
| SH110007 |
| SH110015 |
| SH110017 |
| SH110020 |
| SH113001 |
| SH113005 |
| SH131810 |
| SH601318 |
| SH601872 |
| SH110007 |
| SH110015 |
| SH110017 |
| SH110020 |
| SH113001 |
| SH113005 |
| SH601318 |
| SH601872 |
+---------------------------+
17 rows in set (0.00 sec)
结果是正常的呀。
OUT jyszqdm VARCHAR(100)
这一句去掉,然后在循环结束之后,加上一句:
UPDATE table_temp SET _value = jyszq WHERE id = 1;
把得到的字符串变量jyszq,用UPDATE的语句,传给另外一张新表。
在新表中,就可以得到所想要的字符串。这是为什么???
我的MySQL版本是5.532
赋值,否则为NULL
现在我能确认循环结束之后,变量jyszq的值,是我想要的结果,但是用OUT返回给delphi的话,就不行。
现在我能确认循环结束之后,变量jyszq的值,是我想要的结果,但是用OUT返回给delphi的话,就不行。DELPHI取得返回值的方法,我应该是没有问题的。
因为如果我把mysql存储过程中的语句全部清空,然后改为最简单的 SET jysdm = 'abc';,再用OUT输出的话,在DELPHI中可以正常的得到值abc。
我现在只能这么做了。非常感谢。只是觉得MySQL不会这么弱吧?
select jyszq;在DELPHI中
query.open; while not query.eof do begin //读数据 query.next; end;
BEGIN
DECLARE done int default 0;
DECLARE zqdm VARCHAR(45) default '';
DECLARE jysdm VARCHAR(45) default '';
DECLARE jyszq VARCHAR(100) default '';
DECLARE jyszqdm VARCHAR(100) default '';
DECLARE cur_zqhq CURSOR FOR SELECT zq_dm, jys_dm FROM zq LEFT JOIN jys ON jys.jys_id = zq.jys_id WHERE zq_cxhq = 1;
DECLARE CONTINUE handler for not found set done = 1;
OPEN cur_zqhq;
REPEAT
fetch cur_zqhq into zqdm, jysdm;
IF not done THEN
SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
END IF;
until done end repeat;
close cur_zqhq;
SET jyszqdm = jyszq;
END不知道楼主打算怎么使用存储过程的最终结果 ?如果只是使用存储过程的结果,为什么不创建函数,函数不是有返回值,直接接收使用即可
CREATE
FUNCTION hrkip.routine_Sshq()
RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
DECLARE done int default 0;
DECLARE zqdm VARCHAR(45) default '';
DECLARE jysdm VARCHAR(45) default '';
DECLARE jyszq VARCHAR(100) default '';
DECLARE jyszqdm VARCHAR(100) default '';
DECLARE cur_zqhq CURSOR FOR SELECT zq_dm, jys_dm FROM zq LEFT JOIN jys ON jys.jys_id = zq.jys_id WHERE zq_cxhq = 1;
DECLARE CONTINUE handler for not found set done = 1;
OPEN cur_zqhq;
REPEAT
fetch cur_zqhq into zqdm, jysdm;
IF not done THEN
SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
END IF;
until done end repeat;
close cur_zqhq;
SET jyszqdm = jyszq;
set result = jyszq;
return result;
END
OUT jyszqdm VARCHAR(100)
)
BEGIN
DECLARE zqdm VARCHAR(45);
DECLARE jysdm VARCHAR(45);
DECLARE jyszq VARCHAR(100);
DECLARE done TINYINT(1) DEFAULT 0;
DECLARE cur_zqhq
CURSOR FOR SELECT zq_dm, jys_dm
FROM zq
LEFT JOIN jys
ON jys.jys_id = zq.jys_id
WHERE zq_cxhq = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur_zqhq;
REPEAT
FETCH cur_zqhq INTO zqdm, jysdm;
IF done = 0 THEN
SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
END IF;
select jyszq ;
UNTIL done = 1 END REPEAT;
SET jyszqdm = jyszq;
END
加上这种然后再观察循环是否在工作。
select @x;
最近从oracle平台切换到Mysql平台,也是这个小问题,纠结我两天,看来还是用临时表方法取代游标。
Mysql还要继续努力