MySql存储过程参数问题

yhy1987 2009-02-05 03:57:22
存储过程返回的值是一行一行的,但每行又不是某个表的所有数据,可能是两个表的某些数据,想把数据一条一条的存放返回,该怎么弄啊!
DELIMITER $$;
DROP PROCEDURE IF EXISTS `mydata`.`GETROWNUM`$$
CREATE PROCEDURE `mydata`.`GETROWNUM` ()
BEGIN
declare mycount int;
set @mycount=0;
select (@mycount:=@mycount+1) as rownum,t01.* from t01 where t01.unitid='A1A10A1';
END$$
DELIMITER ;$$
就这个存储过程想把查询结果返回,那个返回的参数怎么写?
...全文
550 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
anonymous__ 2009-03-17
  • 打赏
  • 举报
回复
DROP PROCEDURE IF EXISTS genseq ;

CREATE PROCEDURE genseq
( IN v_seqtype VARCHAR(2),
OUT v_seqence VARCHAR(30)
)
/*
标识类:
位置(点)标识:1(业务区代码)+1(P)+4(yymm)+8(流水号)
区域标识:1(业务区代码)+1(L)+4(yymm)+8(流水号)
日志/代办标识:1(业务区代码)+1(B)+4(yymm)+8(流水号)
计划标识:1(业务区代码)+1(S)+4(yymm)+8(流水号)
网格系统客户标识:1(业务区代码)+1(D)+4(yymm)+8(流水号)
网格系统集团/个人客户标识:1(业务区代码)+1(C)+4(yymm)+9(流水号)
组织节点代码(组织结构):采用分级编码。
操作员Id(客户经理):操作员工号:6(节点代码)+3(流水号)
6位节点代码的含义:1(业务区C)+1(营业区)+1(营销单位)+3(营业厅)
代码规则在每个表中规定
流水类:
业务流水号:8(YYYYMMDD)+6(HHMISS)+9(流水号)+2(业务类型)+1(业务区代码)
业务类型:
位置(点)类PT
区域类LT
日志/代办类LG
计划类SD
预警类WN
网格系统客户类CT
*/
BEGIN_PROC:
BEGIN
DECLARE v_seqkind CHAR(1); /*流水类型*/
DECLARE v_currval DECIMAL(14,0); /*表中当前值*/
DECLARE v_vallen INT ; /*最大长度*/
DECLARE v_recursive CHAR(1); /*是否重复*/
/**/
DECLARE v_currval1 DECIMAL(14,0); /*增1后流水值 数*/
DECLARE v_currval1S VARCHAR(30); /*增1后流水值 串*/
DECLARE v_tmpseq VARCHAR(30); /*临时流水*/
DECLARE v_maxval VARCHAR(14); /*最大流水值 串*/
DECLARE v_maxvald DECIMAL(14,0); /*最大流水值 数*/
DECLARE v_currtime VARCHAR(30); /*当前时间 串*/
DECLARE v_currym CHAR(4); /*当前年月串*/

SET v_seqtype =TRIM(v_seqtype);
SELECT
seqkind AS v_seqkind,
currval AS v_currval,
vallen AS v_val_len,
recursive AS v_recursive
FROM seqinfo WHERE TRIM(seqtype) = v_seqtype ;

/*1--没有流水类型错误*/
IF (v_seqkind IS NULL) THEN
SELECT 1 AS ErrorCode;
LEAVE BEGIN_PROC;
END IF;

/*计算最大序号*/
SET v_maxval = '';

WHILE LENGTH(v_maxval)<v_vallen do
SET v_maxval=CONCAT(v_maxval,'9');
/*set v_currym =''; */
END WHILE ;

SET v_maxvald =CONVERT(v_maxval,DECIMAL(14,0));

SET v_currval1=v_currval+1;
IF (v_currval1 > v_maxvald) THEN
IF (recursive = '1') THEN
SET v_currval1 = 1;
ELSE
/*2--流水溢出错误*/
SELECT 2 AS ErrorCode;
LEAVE BEGIN_PROC;
END IF;
END IF;

/*将流水转换成字符串*/
SET v_currval1S = TRIM(CONVERT(v_currval1,CHAR(30)));


WHILE LENGTH(v_currval1S)<v_vallen DO
SET v_currval1S = CONCAT('0',v_currval1S);
END WHILE ;

/*取当期时间串*/
SELECT DATE_FORMAT(sysdate(), '%Y%m%d%H%i%s') AS v_currtime;
SET v_currym=SUBSTR(v_currtime,3,4);

/*开始拼流水号*/
IF (v_seqkind = '1') THEN
SET v_seqence=CONCAT('C',v_seqtype,v_currym,v_currval1S);
ELSE
SET v_seqence=CONCAT(v_currtime,v_currval1S,v_seqtype,'C');
END IF;

SELECT 0 AS ErrorCode;

END BEGIN_PROC
yhy1987 2009-02-16
  • 打赏
  • 举报
回复
不用存储过程也能解决问题,就先不管了吧!
老哥讲数据库 2009-02-09
  • 打赏
  • 举报
回复
存储过程的返回结果是一个结果集包,里面是若干个结果集.
每个SELECT语句都会得到一个结果集,之后将所有的结果集作成包返回.
若你的结果是多条记录的话,其实已经是一个包了.
dragonfly001 2009-02-06
  • 打赏
  • 举报
回复
为什么要一条一条的返回呢,你可以一次返回到datatable里面,一条一条的读取啊,或者一下放到数据库一个零时表里,一条一条的读取啊。

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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