mysqlprepare存储过程
DROPPROCEDUREIFEXISTS`p_create_view`
CREATEPROCEDUREp_create_view()
BEGIN
DECLAREtableNameVARCHAR(100);
DECLAREstopFlagINT;
DECLAREsql1VARCHAR(1000);
DECLAREcursor_nameCURSORFORSELECTTABLE_NAMEFROMinformation_schema.tablesWHERETABLE_NAMELIKE'test_2014%';
'02000'SETstopFlag=1;
SET@sql1='createviewtestasselectid,namefrom';
OPENcursor_name;
REPEAT
FETCHcursor_nameINTOtableName;
SELECTCONCAT(@sql1,tableName,'UNIONALLSELECTid,nameFROM')INTO@sql1FROMDUAL;
UNTILstopFlagENDREPEAT;
CLOSEcursor_name;
SELECTSUBSTR(@sql1,1,LENGTH(@sql1)-31)INTO@sql1FROMDUAL;
PREPAREstepFROM@sql1;
EXECUTEstep;
END;
㈡ mysql存储过程
存储过程在mysql中是新面孔,最近一直在用存储过程,但忘记了一个很重要的问题,如何得到存储过程的列表。
可能是对mysql太有信心了,一开始我没考虑过这个问题,直到我建立了55个存储过程后,才意识到问题的严重性,我无法用类似show tables获得表的列表一样用show PROCEDURES 来获得存储过程的列表。我试了show stored routines 、show storedroutines 、show routines等等,结果都在意料之中,得不到。
接着我想到了information_schema库,在以前,select * from information_schema.tables;是比show tables还要方便得到表信息的办法,于是我去了information_schema库中转了一圈,仍然一无所获。而完全没有去想一直用来保存用户和地址信息的mysql库。
就在今天为了建立可以调用存储过程的用户时,我访问了mysql库,在刚进的时候察觉了库中多了几个表,也没在意,在要离开的时候才注意到里面有一个表的名字叫proc,似乎是建立存储过程时使用的PROCEDURES前4位字母,于是select了一下,结果掘到了宝。存储过程的相关数据好好的保存在里面。看来以后也同样不能小看mysql库了。
想要得到你的存储过程列表,那么执行下面的语句吧。
select name,db from mysql.proc;
ps:还得知了存储过程的名称长度为64个字节,多于64则自动删除。可以使用中文-_-!!!
㈢ mysql存储过程中调用Prepare返回值
事实上MySQL还不支持从动态sql中返回结果,既不能用PrepareStatement来声明游标,游标只能用嵌入式SQL来声明。
所以你要实现这个功能就要考虑其它的办法,给你一个建议就是创建一个临时表(Create temporary TableName),将你查询出的结果存放的这个临时表里,然后你可以对这张临时表进行操作。但是也很复杂的!!!~
㈣ mysql存储过程中执行prepare出错
如果在
存储过程
调用的时候显式的调用了事务处理,那么,会
回滚
,否则执行到那里就在哪里生效。
㈤ mysql存储过程一个参数有多个逗号分割
这个应该可以使用字符串拼接,你是不是这样写存储过程:
create procere p_proc(var_in int)
begin
delete from [tableName] where [colName] in (var_in);
end
然后又这样调用:
call p_proc(1, 2, 3);
这样肯定不行,那么你可以这样:
create procere p_proc(var_in varchar(5000))
begin
set @sql = concat("delete from [tableName] where [colName] in (", var_in, ")");
prepare stmt_exe_sql from @sql;
execute stmt_exe_sql;
deallocate prepare stmt_exe_sql;
end
这样就相当于把(1, 2, 3)拼接成语句"delete from [tableName] where [colName] in (1, 2, 3)", 然后执行,就可以删除了。
㈥ Mysql 存储过程的问题
给一个简单的例子给你
DROP PROCEDURE IF EXISTS insertStudents;
CREATE PROCEDURE insertStudents(IN P_SNAME VARCHAR(20))
BEGIN
DECLARE V_STUID INT DEFAULT 0;
SET @V_BIRTHDAY ='';
SET @NAME=P_SNAME;
SET @V_BIRTHDAY=date_format(NOW(), '%Y%m%d%H%i%s');
SELECT MAX(STUID) INTO V_STUID FROM Students;
if V_STUID is null then
set V_STUID=1;
else
SET V_STUID=V_STUID+1;
end if;
SET @ID=cast(V_STUID AS CHAR);-- 将数字转化为字符
-- SET @ID=CONCAT(V_STUID,''); -- 将数字转化为字符
SET @INSERTSQL=CONCAT('INSERT INTO Students(STUID,SNAME,BIRTHDAY) VALUES(?,?,?)');
start transaction;
PREPARE stmtinsert FROM @INSERTSQL;
EXECUTE stmtinsert USING @ID,@NAME,@V_BIRTHDAY;
savepoint tran_a;
SET V_STUID=V_STUID+1;
SET @ID=cast(V_STUID AS CHAR);-- 将数字转化为字符
EXECUTE stmtinsert USING @ID,@NAME,@V_BIRTHDAY;
DEALLOCATE PREPARE stmtinsert;
rollback to tran_a;
commit;
END;
㈦ mysql 存储过程 数据库表名字段作为参数传递给存储过程的方法
直接将数据库表名字段作为字符类型传到存储过程中,存储过程拼接sql语句,再用exec执行。例如:
CREATE PROCEDURE [proc_test]
(@tablename varchar(100))
WITH
EXECUTE AS CALLER
AS
declare @sql varchar(1000);
set @sql='select * from '+@tablename
exec(@sql)
GO
再直接执行 exec proc_test '学生表'
㈧ mysql存储过程
MySQL存储过程创建的格式如下:
CREATE PROCEDURE 过程名 ([过程参数[,...]])[特性 ...] 过程体
举例代码如下:
CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END
存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
过程体的开始与结束使用BEGIN与END进行标识。
注意:MySQL在5.0以前并不支持存储过程
㈨ 怎么用mysql的存储过程创建表, 不要用这种方法:PREPARE DD FROM @sqlstr; EXECUTE DD; 能不能直接运行@s
如果你的表明是固定的 那么可以用CREATE TABLE直接创建,如果表明是动态的,那只有用PREPARE 了, 没办法
㈩ 五、MYSQL存储过程和函数
• create procere用来创建 存储过程 ,create function用来创建 函数
• Delimiter命令是改变语句的结束符 ,MySQL默认的结束符为;号,由于procere和function中的;号并不代表创建的结束,所以要替换成另外的结束符以便表示创建的结束
• rontine_body子句可以包含一个简单的SQL语句,也可以包含多个SQL语句, 通过begin…end将这多个SQL语句 包含在一起
• MySQL存储过程和函数中也可以包含类似create和drop等DDL语句
• comment子句用来写入对存储过程和函数的注释
• Language子句用来表示此存储过程和函数的创建语言
• 存储过程和函数被标注为deterministic表明当输入相同的参数是会返回相同的结果,反之如果是not deterministic则表示相同参数不会是相同结果,默认是not deterministic
• 相关属性短语只有咨询含义,并不是强制性的约束
• Drop procere/function语句用来 删除指定名称的存储过程或函数
• Begin…end语句通常出现在存储过程、函数和触发器中,其中 可以包含一个或多个语句 ,每个语句用;号隔开
• 标签label可以加在begin…end语句以及loop, repeat和while语句
• 语句中通过iterate和leave来控制流程,iterate表示返回指定标签位置,leave表示跳出标签
• Declare语句通常用来声明本地变量、游标、条件或者handler
• Declare语句只允许出现在begin … end语句中而且必须出现在第一行
• Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
• 本地变量可以通过declare语句进行声明
• 声明后的变量可以通过select … into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch … into var_list赋值
• 通过declare声明变量方法:
• MySQL支持if,case,iterate,leave,loop,while,repeat语句作为存储过程和函数中的 流程控制语句 ,另外return语句也是函数中的特定流程控制语句
• Case语句在存储过程或函数中表明了 复杂的条件选择语句
• IF语句在存储过程或函数中表明了 基础的条件选择语句
其中在 function 里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的 function 指定一个参数。
在 MySQL 中创建函数时出现这种错误的解决方法:
set global log_bin_trust_function_creators=TRUE;
• Iterate语句 仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环
• Leave语句表明 退出指定标签的流程控制语句块
• 通常会用在begin…end,以及loop,repeat,while的循环语句中
• Loop语句是存储过程或函数中表达 循环执行 的一种方式
• repeat语句是存储过程或函数中表达 循环执行 的一种方式
• while语句是存储过程或函数中表达 循环执行 的一种方式
• Return语句用在 函数中,用来终结函数的执行并将指定值返回给调用者
• Cursor游标用来 声明一个数据集
• 游标的声明必须在变量和条件声明之后,在handler声明之前
• Cursor close语句用来 关闭之前打开的游标
• Cursor declare语句用来声明一个游标和指定游标对应的数据集合, 通常数据集合是一个select语句
• Cursor fetch语句用来获取游标指定数据集的 下一行数据 并将各个字段值赋予后面的变量
• Open cursor语句用来打开一个之前已经 声明好的游标
• Declare condition语句命名 特定的错误条件 ,而该特定错误可以在declare…handler中指定 处理方法
• 比如在MySQL中1051error code表示的是unknown table的错误,如果要对这
个错误做特殊处理,可以用三种方法:
• Declare handler语句用来声明一个handler来处理一个或多个特殊条件,当其中的某个条件满足时则触发其中的statement语句执行
• Statement可以是一个简单SQL语句,也可以是begin…end组成的多个语句
• Handler_action子句声明当执行完statement语句之后应该怎么办
Condition_value的值有以下几种:
• 当condition发生但没有声明handler时,则存储过程和函数依照如下规则处理
• create trigger语句用来创建一个触发器,触发器的作用是当表上有对应SQL语句发生时,则触发执行
• 触发器创建时需要 指定对应的表名 tbl_name
• Definer关键词用来指定trigger的安全环境
• Trigger_time指定触发器的执行时间,BEFORE和AFTER指定触发器在表中的 每行数据修改前或者后 执行
• Trigger_event指定触发该触发器的具体 事件
• INSERT当新的一行数据插入表中时触发,比如通过执行insert,load data,replace语句插入新数据
• UPDATE当表的一行数据被修改时触发,比如执行update语句时
• DELETE当表的一行数据被删除时触发,比如执行delete,replace语句时
• 当执行insert into … on plicate key update语句时,当碰到重复行执行update时,则触发update下的触发器
• 从5.7.2版本开始,可以创建具有相同trigger_time和trigger_event的同一个表上的多个触发器,默认情况下按照创建的时间依次执行,通过 指定FOLLOWS/PRECEDES改变执行顺序 ,即FOLLOWS时表示新创建的触发器后执行,PRECEDES则表示新触发器先执行
• Trigger_body表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字段, OLD.col_name表示行数据被修改或删除之前的字段数据,NEW.col_name表示行数据被插入或修改之后的字段数据
• Drop trigger语句用来 删除一个触发器
• If exists短语用来避免删除不存在的触发器时引发报错
• 当你执行drop table时,表上的触发器也被drop掉了