mysql isodd_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.

创建存储过程

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  这个网址没打开?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值