zoukankan      html  css  js  c++  java
  • 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  这个网址没打开?

  • 相关阅读:
    label 选择: soft label or hard label?
    预训练模型 | MASS:更适合seq2seq类任务
    文本相似度计算/文本比较算法
    论文阅读 | Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment
    论文阅读 | Lite Transformer with Long-Short Range Attention
    预训练模型 | ELECTRA: Efficiently Learning an Encoder that Classifies Token Replacements Accurately
    Transformer 及其家族( Transformer-XL, Reformer... )
    java线程池01-ThreadPoolExecutor构造方法参数的使用规则
    快速排序算法
    mysql(4)—— 表连接查询与where后使用子查询的性能分析。
  • 原文地址:https://www.cnblogs.com/charlesblc/p/5988949.html
Copyright © 2011-2022 走看看