Mysql中的Prepared Statement与Stored Precedure学习
可以参考:
http://stackoverflow.com/questions/196652/prepared-statement-vs-stored-procedure
They are not really the same thing - with stored procedures, your database logic resides inside the database. Prepared statements basically avoid re-parsing queries if they are called multiple times - the performance benefit can vary greatly.
The choice to use one or the other is really dependent on your specific situation. I don't really use stored procs anymore as I like having all of my logic in one place.
参考 http://www.cnblogs.com/exmyth/p/3303470.html
创建存储过程
MySQL中,创建存储过程的基本形式如下:
- CREATE PROCEDURE sp_name ([proc_parameter[,...]])
- [characteristic ...] routine_body
其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。
【示例14-1】 下面创建一个名为num_from_employee的存储过程。代码如下:
- CREATE PROCEDURE num_from_employee (IN emp_id INT, OUT count_num INT )
- READS SQL DATA
- BEGIN
- SELECT COUNT(*) INTO count_num
- FROM employee
- WHERE d_id=emp_id ;
- END
上述代码中,存储过程名称为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT语句从employee表查询d_id值等于emp_id的记录,并用COUNT(*)计算d_id值相同的记录的条数,最后将计算结果存入count_num中。代码的执行结果如下:
- mysql> DELIMITER &&
- mysql> CREATE PROCEDURE num_from_employee
(IN emp_id INT, OUT count_num INT ) - -> READS SQL DATA
- -> BEGIN
- -> SELECT COUNT(*) INTO count_num
- -> FROM employee
- -> WHERE d_id=emp_id ;
- -> END &&
- Query OK, 0 rows affected (0.09 sec)
- mysql> DELIMITER ;
代码执行完毕后,没有报出任何出错信息就表示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。
#执行存储过程 CALL Pro_Employee(101,@pcount); SELECT @pcount;
创建存储函数
- mysql> DELIMITER &&
- mysql> CREATE FUNCTION name_from_employee (emp_id INT )
- -> RETURNS VARCHAR(20)
- -> BEGIN
- -> RETURN (SELECT name
- -> FROM employee
- -> WHERE num=emp_id );
- -> END&&
- Query OK, 0 rows affected (0.00 sec)
- mysql> DELIMITER ;
调用方法:
//调用存储函数
mysql> SELECT name_from_employee(3);
存储过程里面也能够使用函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | mysql> delimiter $$ mysql> CREATE FUNCTION isodd(input_number int ) //创建函数 -> RETURNS int -> BEGIN -> DECLARE v_isodd INT ; -> -> IF MOD(input_number,2)=0 THEN -> SET v_isodd= FALSE ; -> ELSE -> SET v_isodd= TRUE ; -> END IF; -> -> RETURN (v_isodd); -> -> END $$ Query OK, 0 rows affected (0.01 sec) mysql> CREATE PROCEDURE myProc(aNumber int ) //创建mysql存储过程 -> Begin -> IF (isodd(aNumber)) THEN -> SELECT ' is odd' ; -> ELSE -> SELECT ' is even' ; -> END IF; -> END $$ Query OK, 0 rows affected (0.02 sec) mysql> delimiter ; mysql> call myProc(2); //call 调用存储过程 + ----------+ | is even | + ----------+ | is even | + ----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> call myProc(1); //call 调用存储过程 + ---------+ | is odd | + ---------+ | is odd | + ---------+ 1 row in set (0.00 sec) |
1 2 3 4 5 | mysql> drop procedure myProc; //删除mysql存储过程 Query OK, 0 rows affected (0.00 sec) mysql> drop function isodd; //删除mysql函数 Query OK, 0 rows affected (0.00 sec)<br><br> |
用完了,要记得删除。不然占用资源。
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
存储过程和函数存在以下几个区别:
1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。(意思是存储过程要单独调用,一般用call来调用)
mysql常见的内置函数:
concat
pow 乘方
mod 取余
strcmp
http://php.net/manual/en/pdo.prepared-statements.php 这个网址没打开?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!