mysql 存储过程

    xiaoxiao2021-12-15  33

    存储过程     一般在大型的数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后,再次调用不需要再次编译,用户只需要指定存储过程名字并给定参数就可以执行完成任务。     MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。     创建:         Create procedure 存储过程名(    [in|out|inout] 参数 datatype  )          Begin        Sql语句;        Sql语句;          ...          End 注:存储过程只是先编译sql语句,所以当sql语句中有错误的表或属性时,系统不会提示,而且存储过程会创建成功。只有当调用执行时才提示错误。            (  设置mysql控制台的结尾符号: 默认的以";"结尾,我们可以自己设置结束符号,语法是:       delimiter //   -----》表示以"//"作为结束符号 ) create procedure tat(n1 int, n2 int) begin    declare n3 int;    set n3 = n1 + n2;    select n3 as sum; end create procedure ttb(in n int) begin if n is null then  set n = 1202;  end if;  select *  from t_student where sid=n ;  end  # 调用存储过程:  Call 存储过程名( ); 删除存储过程:  Drop procedure (if exists) 存储过程名; 带参数的存储过程   参数分3类:            IN:表示存储过程需要给它一个值   (默认)            OUT:表示存储过程会返回一个值            INOUT:既可以传值进去也可以带值出来         例:创建一个可以传值到存储过程内的存储过程 delimiter //  create procedure pr_st ( IN a int)      begin        select * from t_student where sid = a;      end// delimiter;   调用:call pr_st(1210)  例:创建一个可以返回值出来的存储过程 delimiter //  create procedure pr_st ( OUT a int)      begin        select max(sscore) into a from t_student ;      end      // delimiter; 调用:call pr_st( @a );       Select @a; 例:创建一个可以返回和传入值的存储过程 delimiter //  create procedure pr_st ( IN a int, OUT b int)      begin        select sage into b from t_student where sid = a;      end      // delimiter; 调用:call pr_st( 1210,@a );       Select @a; 注:limit 后面不允许有参数,所以存储过程里面的limit后面不能用参数 例:创建一个可以返回和传入值的存储过程(同一个参数) delimiter //  create procedure pr_st ( INOUT a int)      begin        select sage from t_student where sid = a into a;      end      // delimiter; 调用:set @b = 1210;      Call pr_st(@b);      Select @b; delimiter //  create procedure pr_st ( IN a int,IN b varchar(10))      begin        insert into t_dept(did,dname) values(a,b);      end      // delimiter; call(1111,'abc'); MySQL 存储过程特点 创建 MySQL 存储过程的简单语法为: create procedure 存储过程名字() (    [in|out|inout] 参数 datatype ) begin    MySQL 语句; end; MySQL 存储过程参数如果不显式指定"in"、"out"、"inout",则默认为"in"。习惯上,对于是"in" 的参数,我们都不会显式指定。 1. MySQL 存储过程名字后面的"()"是必须的,即使没有一个参数,也需要"()" 2. MySQL 存储过程参数,不能在参数名称前加"@",如:"@a int"。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加"@",虽然 MySQL 客户端用户变量要加个"@"。 create procedure pr_add (    @a int,- 错误    b int   - 正确 ) 3. MySQL 存储过程的参数不能指定默认值。 4. MySQL 存储过程不需要在 procedure body 前面加 "as"。而 SQL Server 存储过程必须加 "as" 关键字。 create procedure pr_add (    a int,    b int  ) as             - 错误,MySQL 不需要 "as" begin    mysql statement ...; end; 5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。 create procedure pr_add (    a int,    b int ) begin    mysql statement 1 ...;    mysql statement 2 ...; end; 6. MySQL 存储过程中的每条语句的末尾,都要加上分号 ";"    ...    declare c int;    if a is null then       set a = 0;    end if;    ... end; 7. MySQL 存储过程中的注释。    /*      这是个      多行 MySQL 注释。   /    declare c int;    - 这是单行 MySQL 注释 (注意- 后至少要有一个空格)    if a is null then 这也是个单行 MySQL 注释       set a = 0;    end if;    ... end; 8. 不能在 MySQL 存储过程中使用 "return" 关键字。    set c = a + b;    select c as sum;    /*    return c;- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。   / end; 9. 调用 MySQL 存储过程时候,需要在过程名字后面加"()",即使没有一个参数,也需要"()" call pr_no_param(); 10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。 call pr_add(10, null); 展示数据库有哪些存储过程:      Select name from mysql.proc where db='数据库名'    Show procedure status where db='数据库名'
    转载请注明原文地址: https://ju.6miu.com/read-1000288.html

    最新回复(0)