mysql存储过程出错

一直用oracle和sqlserver实在不会用MYsql谁帮我看看下面这段问题出在哪createPROCEDURE`ngcs`.`sp_GetPageRecord`(I... 一直用oracle和sqlserver 实在不会用MYsql 谁帮我看看下面这段问题出在哪
create
PROCEDURE `ngcs`.`sp_GetPageRecord` (
IN TableName VARCHAR (100),
IN PrimaryKey VARCHAR (50),
IN Col1 VARCHAR (2000) = '*',
IN WhereSql VARCHAR (1000) = '',
IN Sort VARCHAR (200) = '',
IN PageSize INT = 10,
IN CurrPage INT = 1,
IN IsDesc BIT = 0
)
展开
 我来答
applebookcake
推荐于2016-08-21
知道答主
回答量:14
采纳率:0%
帮助的人:9.7万
展开全部
mysql> create PROCEDURE sp_GetPageRecord( IN TableName VARCHAR(100), IN Primar
yKey VARCHAR(50), IN Col1 VARCHAR(255) , IN WhereSql VARCHAR(255) , IN Sort V
ARCHAR(200) , IN PageSize INT , IN CurrPage INT, IN IsDesc BIT(1) ) BEGIN END;
Query OK, 0 rows affected (0.00 sec)

当然首先要确认下MySQL版本。MySQL从5.0版本开始支持存储过程
一、VARCHAR类型最多支持255个字符,超过255个字符可以考虑用TEXT变量。TEXT变量支持最大到65536个字节。
二、不支持参数中的DEFAULT值。也就是说 = ...这样的要去掉。
三、必须要有过程体,过程体的开始与结束使用BEGIN与END进行标识。
四、BIT类型支持1-64位的存储。
五、存储过程中SELECT ... INTO var_list中var_list不能用存储过程的参数。
六、下面需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
七、存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回

在mysql命令提示符下逐行输入下面的语句。
delimiter //
create procedure `demo_out_total`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT
total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE v_sql VARCHAR(500);
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set v_sql = CONCAT('select count(*) into @total from ',tbl_name, ' where ',whereClause, '
;');
select v_sql;
SET @total = 0;
SET @v_sql = v_sql;
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;
select @total;
set total_tbl = @total;
END;
//

/* sp demo_out_total2 use curson */
create procedure `demo_out_total2`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE c_total CURSOR for SELECT total from tmptable ;
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set @v_sql = 'drop table tmptable if exist tmptable;';
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

set @v_sql = CONCAT('create table tmptable as select count(*) total from ',tbl_name,' where ',whereClause,';');
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

OPEN c_total;
FETCH c_total INTO total_tbl;
CLOSE c_total;
END;
//
delimiter ;

set @tbl_name = 'tb2';
set @whereClause = 'tid= 237';
set @total_tbl = 0;
call demo_out_total(@tbl_name,@whereClause,@total_tbl);
select @total_tbl;

详见MySQL存储过程详解:
http://wenku.baidu.com/link?url=_W2ft5HNybWw5fBTPIFWEx-tkDyAs3gyKMT4KLOOfDbqog902bRMk2F2bCMAD-gAbNvgADf0wGk0s43QSoA2_Ci3ztQOKdO25uS85BJSdHK

MySQL存储程序入门指南:
http://www.cnblogs.com/wxb-km/archive/2012/11/18/2775780.html

MySQL create procedure语句参考:
http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html
http://dev.mysql.com/doc/refman/5.6/en/cursors.html
http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

MySQL数据类型存储要求:
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
huyue1216
2014-03-13
知道答主
回答量:2
采纳率:0%
帮助的人:2758
展开全部
建设 重装mysql
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式