彻底崩溃了!求救 Mysql 存储过程语句

chenluozhi 2011-04-04 11:08:04
fuck啊啊啊啊啊啊啊啊啊啊;
昨晚搞了一个晚上,早上又搞了一个晚上,可查看的书少之又少,全部都是一笔带过;
看帖无数,看来看去都是那几个转帖,要不就是无法符合我的要求,没法依葫芦画瓢;算本人愚钝了,


本人想完成一个很简单的功能:
编写一存储过程,根据传进去的 表名 和 条件;返回该表的总记录数,例如(下边代码是错误的,思路是对的)



DROP PROCEDURE IF EXISTS getTotalCounts;
create procedure getTotalCounts(in tableName varchar(100),in whereText varchar(100),out totalCounts int)
comment '获取表总记录数'
begin

set @table_name=tableName;
set @total = totalCounts;
set @where_text=whereText;
set @s=' select count(*) into @total from ' + @table_name+ ' where '+ where_text;
prepare stmt from @s;
execute stmt;
set totalCounts = @total;
DEALLOCATE prepare stmt;
end;



 CallableStatement proc =con.prepareCall("{call getTotalCounts(?,?,?)}");   
proc.setString(1, "blog_article");
proc.setString(2,"cate_id>0");
proc.registerOutParameter(3,Types.INTEGER);
proc.execute();


本人以前很少接触存储过程啊,疑问比较多;那个mysql在线帮助文档没什么用的,一个好的例子都没有。
1、本人记得对于 (out test) 类型的参数,如果要用的话,直接调用 select xxx into test from xxx 就可以把查询结果插入到test 就可以了;上边那个个存储过程 为什么不能写成:



begin
select count(*) into totalCounts from tableName where where_Text;
end

如果这样写多简单啊,非要搞个什么

prepare stmt from @s;
execute stmt;

2、有些地方定义 declare str varchar(100)变量,有些地方直接@str(@出来的变量是什么类型的?) 一个变量;在使用的时候,真是乱七八糟的。

3、在网上我看到 有些人连接字符串用concat,有些又直接用 + 号就行;两者有什么区别?

不多说了,关键是能写出我上边那个存储过程,好等我依葫芦画瓢!~~~谢谢了!
...全文
91 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxq19851204 2011-04-04
  • 打赏
  • 举报
回复

DELIMITER $$

DROP PROCEDURE IF EXISTS `getTotalCounts` $$
CREATE PROCEDURE `getTotalCounts`(in tableName varchar(100),in whereText varchar(100),out totalCounts integer(11))
BEGIN
set @table_name=tableName;
set @where_text=whereText;

set @s=concat('SELECT count(*) as totalCounts FROM ',@table_Name,' Where ', @where_text);
prepare stmt from @s;
execute stmt;
END $$

DELIMITER ;

调用:
CALL getTotalCounts("Customers","Left(customername,1)='b'",@a);

rucypli 2011-04-04
  • 打赏
  • 举报
回复
1 表名是动态的则必须拼接动态sql执行,这是语法
2 带@变量整个session有效,不带@则只在存储过程中有效
3 字符传拼接必须用concat
chenluozhi 2011-04-04
  • 打赏
  • 举报
回复
报什么错我就不给出来了,因为我的写法 至少改了10遍!~错误类型 有好几种具体没做记录
chenluozhi 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lxq19851204 的回复:]
SQL code

DELIMITER $$

DROP PROCEDURE IF EXISTS `getTotalCounts` $$
CREATE PROCEDURE `getTotalCounts`(in tableName varchar(100),in whereText varchar(100),out totalCounts integer(11))
BEGIN
se……
[/Quote]

很感谢这个大哥啊,在你的指点下,终于解决问题了!不过你调用存储 语句我调试的时候,out 类型变量没有存储到 总记录数,不知道为什么,我要先把查出来的数据放到@total变量,执行结束后再 set totalCounts = @total;才可以
iihero_ 2011-04-04
  • 打赏
  • 举报
回复
就按3楼4楼的解决即可。
woowss 2011-04-04
  • 打赏
  • 举报
回复
回复,拿分
chenluozhi 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acmain_chm 的回复:]
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html

手册中不是有例子吗?
[/Quote]

官方那个“瓢”不好画,我就为了解决这道题而已,还叫看那么多文字。。。我给分,如果您肯帮忙就帮下吧,我很感谢您;如果您很忙或者不喜欢,我也不介意,OK~?
ACMAIN_CHM 2011-04-04
  • 打赏
  • 举报
回复
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html

手册中不是有例子吗?


lxq19851204 2011-04-04
  • 打赏
  • 举报
回复
mysql> use c1
Database changed
mysql> CALL getTotalCounts("Customers","Left(customername,1)='b'",@a);
+-------------+
| totalCounts |
+-------------+
| 13 |
+-------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

56,675

社区成员

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

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