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中,创建存储过程的基本形式如下:

  1. CREATE PROCEDURE sp_name ([proc_parameter[,...]])  
  2.         [characteristic ...] routine_body 

其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。

【示例14-1】 下面创建一个名为num_from_employee的存储过程。代码如下:

  1. CREATE  PROCEDURE  num_from_employee (IN emp_id INT, OUT count_num INT )  
  2.           READS SQL DATA  
  3.           BEGIN  
  4.               SELECT  COUNT(*)  INTO  count_num  
  5.               FROM  employee  
  6.               WHERE  d_id=emp_id ;  
  7.           END 

上述代码中,存储过程名称为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT语句从employee表查询d_id值等于emp_id的记录,并用COUNT(*)计算d_id值相同的记录的条数,最后将计算结果存入count_num中。代码的执行结果如下:

  1. mysql> DELIMITER &&  
  2. mysql> CREATE  PROCEDURE  num_from_employee
    (IN emp_id INT, OUT count_num INT )  
  3.     -> READS SQL DATA  
  4.     -> BEGIN  
  5.     -> SELECT  COUNT(*)  INTO  count_num  
  6.     -> FROM  employee  
  7.     -> WHERE  d_id=emp_id ;  
  8.     -> END &&  
  9. Query OK, 0 rows affected (0.09 sec)  
  10. mysql> DELIMITER ; 

代码执行完毕后,没有报出任何出错信息就表示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。

#执行存储过程
CALL Pro_Employee(101,@pcount);

SELECT @pcount;

创建存储函数

  1. mysql> DELIMITER &&  
  2. mysql> CREATE  FUNCTION  name_from_employee (emp_id INT )  
  3.     -> RETURNS VARCHAR(20)  
  4.     -> BEGIN  
  5.     -> RETURN  (SELECT  name  
  6.     -> FROM  employee  
  7.     -> WHERE  num=emp_id );  
  8.     -> END&&  
  9. Query OK, 0 rows affected (0.00 sec)  
  10. 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  这个网址没打开?

原文地址:https://www.cnblogs.com/charlesblc/p/5988949.html