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);
存储过程里面也能够使用函数:
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)
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)
用完了,要记得删除。不然占用资源。
存储过程是用户定义的一系列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 这个网址没打开?
Mysql中的Prepared Statement与Stored Precedure学习的更多相关文章
- libpq中调用prepared statement:
代码如下: [root@lex tst]# cat testlibpq.c /* * testlibpq.c * Test the C version of LIBPQ, the POSTGRES f ...
- Java向PostgreSQL发送prepared statement 与 libpq 向PostgreSQL发送prepared statement之比较:
Java 代码,在数据库端,并没有当成 prepared statetment 被处理. C代码通过libpq 访问数据库端,被当成了 prepared statement 处理.也许是因Postgr ...
- mysql 执行存储过程报错Prepared statement needs to be re-prepared
今日思语:不喜欢再见 说再见,因为有时明知道下一次再见已是遥遥无期或是不再见 错误如下: ERROR 1615 (HY000) at line 406 in file: 'update-mysql.s ...
- mysql中插入多条记录-微软批处理
当向mysql中插入大量数据时,可以使用微软的批处理方式.这样可以防止内存溢出又提高了效率.我写了一个mysql中插入多条记录的例子.赋值代码可以直接使用. 1.首先需要添加两个dll MySql.D ...
- mysql中变量赋值
http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变 ...
- MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
移植sql server 的存储过程到mysql中,遇到了sql server中的: IF @@ROWCOUNT < 1 对应到mysql中可以使用 FOUND_ROWS() 函数来替换. 1. ...
- MySQL 中基于 XA 实现的分布式事务
1 XA协议 首先我们来简要看下分布式事务处理的XA规范可知XA规范中分布式事务有AP,RM,TM组成: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务 ...
- PDO 使用prepared statement 预处理LIMIT等非表字段参数
由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...
- Mysql 中完善的帮助命令
Mysql 中完善的帮助命令 Mysql 中的帮助系统很完善,很多操作都可以通过命令行直接获得帮助,如下示例: Mysql 命令行帮助 [root@mysql1 mydata1]# mysql -S ...
随机推荐
- Sencha Touch 2.4 callParent() 用法
callParent() 用法 方法介绍 用来调用父类的同名方法,并传参,这在从一个框架类派生且要重写诸如onRender这样的方法时会经常看到. 传参方式 1.arguments Ext.defin ...
- 利用Openvswitch实现不同物理机中的Docker容器互连
1. 测试环境 75机(10.11.150.75):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server 74机(10.11.150 ...
- Simulate a seven-sided die using only five-sided
问题描述: 如题 转述一下问题,就是说你现在有一个正五面体骰子,然后你怎么用这个正五面体骰子去模拟一个正七面体骰子. 这个问题我接触到几种方法,下面一一阐述. 方法一: rand7()=( rand5 ...
- UITableView局部刷新
只刷新cell不刷新section,这问题还难住了一阵子 需要用到: - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnima ...
- 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)
题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...
- hdu 4068 SanguoSHA
搜索下就可以了…… 代码如下: #include<iostream> #include<cstring> #include<cstdio> #include< ...
- JS之DOM编程
为什么学dom编程? 通过dom编程,我们可以写出各种网页游戏 dom编程也是我们学习ajax技术的基础,所以我们必需掌握好dom编程. dom编程简介 DOM=Document Object Mo ...
- lintcode:数字组合 II
数字组合 II 给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T.C中每个数字在每个组合中只能使用一次. 注意事项 所有的数字(包括目标数字)均为正整数. 元素组合(a ...
- UNIX网络编程——网络IPC:套接字
UNIX网络编程——网络IPC:套接字 Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的 ...
- linux 屏幕录像(recordmydesktop)
需求:命令行工具进行屏幕录像ffcast ffmpeg 简单点的是recordmydesktop. 1. 安装: apt-get install gtk-recordmydesktop recordm ...