首页 > 技巧使用 > mysql中是否有类似于eval的写法的,答案在这里
2017
09-07

mysql中是否有类似于eval的写法的,答案在这里

在我们写sql的时候,经常可能会遇到同一个问题:mysql是否具备eval的功能从而使我的变量动态加载到对应的sql语句中:


<?php
 eval('echo "abc";');
?>
<sctipt>
  var s=eval("{'a':'123456'}");
</script>

//---您的mysql也想玩eval?


答案是肯定的,没有,但是不要灰心 有个一个很好用的方法来替代:


PREPARE statement_name FROM sql_text /*定义*/   
EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/   
DEALLOCATE PREPARE statement_name /*删除定义*/   
例子:



mysql> PREPARE prod FROM "INSERT INTO examlple VALUES(?,?)";   
mysql> SET @p='1';   
mysql> SET @q='2';   
mysql> EXECUTE prod USING @p,@q;   
mysql> SET @name='3';   
mysql> EXECUTE prod USING @p,@name;   
mysql> DEALLOCATE PREPARE prod; 


使用 PREPARE 的几个注意点: 

A:PREPARE stmt_name FROM preparable_stmt;预定义一个语句,并将它赋给 stmt_name ,tmt_name 是不区分大小写的。
B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。 
C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。
D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。 
E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。 
F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。 
G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。 
H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
I: PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用!



当然一个悲剧的坏消息最后告诉你:


  1. 这个东西好用但是不要妄想给他封装到哪个函数里面
  2. 这个虽然能解决问题不要想用到触发器里面,甚至造到存储过程中用触发器引用也是不被允许的
  3. 看完上面两点请冷静一下洗洗睡吧



      建议: 你可以 把他封装到存储过程中用动态语言调用 这个是可以玩得转的哦!









最后编辑:
作者:Tony
这个人很懒什么也没留!~

发布评论

表情