fuck啊啊啊啊啊啊啊啊啊啊;
昨晚搞了一个晚上,早上又搞了一个晚上,可查看的书少之又少,全部都是一笔带过;
看帖无数,看来看去都是那几个转帖,要不就是无法符合我的要求,没法依葫芦画瓢;算本人愚钝了,
本人想完成一个很简单的功能:
编写一存储过程,根据传进去的 表名 和 条件;返回该表的总记录数,例如(下边代码是错误的,思路是对的)DROP PROCEDURE IF EXISTS getTotalCounts;
create  procedure getTotalCounts(in tableName varchar(100),in whereText varchar(100),out totalCounts int)
comment '获取表总记录数'
beginset @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,有些又直接用 + 号就行;两者有什么区别?不多说了,关键是能写出我上边那个存储过程,好等我依葫芦画瓢!~~~谢谢了!

解决方案 »

  1.   

    1 表名是动态的则必须拼接动态sql执行,这是语法
    2 带@变量整个session有效,不带@则只在存储过程中有效
    3 字符传拼接必须用concat
      

  2.   


    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);
      

  3.   

    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)
      

  4.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html手册中不是有例子吗?
      

  5.   


    很感谢这个大哥啊,在你的指点下,终于解决问题了!不过你调用存储 语句我调试的时候,out 类型变量没有存储到 总记录数,不知道为什么,我要先把查出来的数据放到@total变量,执行结束后再 set totalCounts = @total;才可以