精华内容
下载资源
问答
  • 存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在...MySQL存储过程的创建语法CREATE PROCEDURE过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [...

    存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

    MySQL存储过程的创建

    语法

    CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体

    DELIMITER // CREATE PROCEDURE myproc(OUT s int)

    BEGIN

    SELECT COUNT(*) INTO s FROM students;

    END//DELIMITER ;

    MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

    参数

    存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

    IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT:该值可在存储过程内部被改变,并可返回INOUT:调用时指定,并且可被改变和返回

    过程体

    过程体的开始与结束使用BEGIN与END进行标识。

    MySQL实例与讲解

    1. 创建一存储过程,求l+2+3+…+n,并打印结果。

    先使用MySQL语句创建存储过程,再使用call语句调用这一存储过程查看结果,可以看到由于未输入n的值,sum结果为0。

    DELIMITER //

    CREATE PROCEDUREaddresult()BEGIN

    DECLARE i INT;DECLARE sum INT;DECLARE n INT;SET i = 1;SET sum = 0;WHILE i <=n DOSET sum = sum +i;SET i = i + 1;END WHILE;SELECT SUM;END

    //DELIMITER ;

    在navicat 实现

    84289c17696073e3ed7f03657efd5138.png

    ad7cb831bd73eb481e1e5f60d9d95ac9.png

    2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。

    在第一题的addresult过程基础上,加上一条“set n=10”语句,设定n的值,调用该过程后打印结果,可以看到结果为sum=1+2+3+...+10=55。

    fcf2448864e8dbc52f2b195e5b64d7c2.png

    add85ccfd32464994dfe60f7bbff1010.png

    3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。

    426d73e04f71afdad6a7ebbd850c2b02.png

    ec6c8b630c908b4ca56e403e888f481d.png

    6a424ebca066ed0e21c42903cf54b90f.png

    这是输入10的结果

    也可以这样写,这样更简洁

    f30bb6a3de32b8af226648fe6386547e.png

    4.调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。

    bd832cc4a0752d290602cbc891b29ad1.png

    5. 修改上述存储过程为addresult2,将n参数设定默认值为100,并改设sum为输出参数,让主程序能够接收计算结果。

    将3中存储过程中的“in n int”修改为“out sum int”,并在存储过程中设定n默认值为100。

    8cf5f3eaed5190004611d371af06a24d.png

    17f2cd2f3b426093e182c0c1f253ac38.png

    a22b0d76e8eb0c02c428cabcfce918ae.png

    或者手动输入值

    b9d65d81bbc30bdcf62ffe9108916644.png

    a78d23a19bc5920f95242d37c1c8379e.png

    f23b2acfdeb93b8ab4387d9f5204040f.png

    如何接受返回参数的值呢?这里涉及到MySQL的变量

    MySQL变量一共有三种:

    全局变量

    全局变量又叫内置变量,是mysql数据库内置的变量 ,对所有连接都起作用。

    查看所有全局变量: show variables

    查看某个全局变量: select @@变量名

    修改全局变量: set 变量名=新值

    character_set_client: mysql服务器的接收数据的编码

    character_set_results:mysql服务器输出数据的编码

    会话变量

    只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!

    定义会话变量: set @变量=值

    查看会话变量: select @变量

    局部变量

    在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失。

    回到上面这个存储过程,如何接受返回参数的值呢?

    定义一个会话变量name, 使用name会话变量接收存储过程的返回值

    CALL pro_testOut(@NAME);

    查看变量值

    SELECT @NAME;

    OUT修饰的参数,调用时就是这样,如果你传入一个常量,就会报错

    参数inout的使用(既能输入一个值又能传出来一个值)

    传一个年龄,自动让年龄增长10岁

    d3ee6718cf84b4bbaef7c856cf5c0a26.png

    1489e535650e9da4b4852c5d56ab5e91.png

    1a2bdae56cb4322ab1783e6020a9a95a.png

    怎么OUT呢?例如

    @abcd是没有事先定义的变量,是NULL值

    这里直接调用的话也是为NULL

    @abc是之前out的值,所以调用加10等于5060

    333cfb513677ac20138953bfa7266544.png

    这样看会更清晰

    定义@ab=1,然后调用加10,得出11,这个也变量可以继续调用

    3f798dfc9259fb2d0958f0679dbdbdc3.png

    e16c6138cb4517eef3fb44649be68197.png

    更多后续参考

    参考:https://blog.csdn.net/weixin_41177699/article/details/80553643?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control

    简单易懂参考

    https://blog.csdn.net/xushouwei/article/details/52198065

    包含函数的也可以参考https://www.jianshu.com/p/f01235e7ea33

    展开全文
  • MySQL 存储过程参数IN OUT INOUT对比一、IN-- 创建测试存储过程delimiter //create procedure p_in ( IN num int )beginselect num;set num=100;select num;end;//delimiter ;set @num=100;call p_in(@num)二、OUT--...

    MySQL 存储过程参数IN OUT INOUT对比

    一、IN

    -- 创建测试存储过程

    delimiter //

    create procedure p_in ( IN num int )

    begin

    select num;

    set num=100;

    select num;

    end;

    //

    delimiter ;

    set @num=100;

    call p_in(@num)

    b4e669c8d656db4a888fcf50d0ea6b29.png

    9fdb8bdf22aa93d2333e153835e7d772.png

    二、OUT

    -- 创建测试存储过程

    delimiter //

    create procedure p_out ( OUT num int )

    begin

    select num;

    set num=100;

    select num;

    end;

    //

    delimiter ;

    set @num=100;

    call p_out(@num)

    ec8b4ab9bdffbab999fb167e9515e11f.png

    42f6fcc4b60eac2c3afad3dc06d2cb18.png

    三、INOUT

    -- 创建测试存储过程

    delimiter //

    create procedure p_inout ( INOUT num int )

    begin

    select num;

    set num=100;

    select num;

    end;

    //

    delimiter ;

    set @num=100;

    call p_inout(@num)

    118f3bf3aea847d992a12c9214e1ac92.png

    0df47d3363f862470d6bca4a8c713f19.png

    总结:

    IN 输入参数

    表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

    仅需要将数据传入存储过程,并不需要返回计算后的该值。

    只能当做传入参数

    OUT 输出参数

    该值可在存储过程内部被改变,并可返回

    不接受外部传入的数据,仅返回计算之后的值。

    只能当做转出参数

    INOUT 输入输出参数

    调用时指定,并且可被改变和返回

    需要数据传入存储过程经过调用计算后,再传出返回值

    可当做传入转出参数

    展开全文
  • MySQL存储过程in、out、inout参数,存储过程中的相关信息

    存储过程

    1.创建存储过程并查看全局变量

    mysql> create database yy;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use yy;
    Database changed
    mysql> set @num1=10,@num2=20,@num3=30;	//设置全局变量
    mysql> delimiter $$
    mysql> create procedure p(in num1 int,out num2 int,inout num3 int)
        -> begin
        -> select num1,num2,num3;
        -> set num1=100,num2=200,num3=300;
        -> select num1,num2,num3;
        -> end $$
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call p(@num1,@num2,@num3);
    

    在这里插入图片描述
    总结1:

    • in 和 inout 参数会将全局变量的值传入存储过程中,而 out 参数不会将全局变量的值传入存储过程中。在存储过程使用中,参数值 in、out、inout 都会发生改变。

    2.调用存储过程时全局变量值的变化

    mysql> select @num1,@num2,@num3;
    

    在这里插入图片描述
    总结2:

    • 当调用完存储过程后,发现 in 参数不会对全局变量的值引起变化,而 out 和 inout 参数调用完存储过程后,会对全局变量的值产生变化,会将存储过程引用后的值赋值给全局变量。
    • in参数赋值类型可以是变量还有定值,而out和inout参数赋值类型必须是变量。
    展开全文
  • MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢?一、MySQL 存储过程参数(in)MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对...

    MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢?

    一、MySQL 存储过程参数(in)

    MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

    drop procedure if exists pr_param_in;

    create procedure pr_param_in

    (

    in id int -- in 类型的 MySQL 存储过程参数

    )

    begin

    if (id is not null) then

    set id = id + 1;

    end if;

    select id as id_inner;

    end;

    set @id = 10;

    call pr_param_in(@id);

    select @id as id_out;

    mysql> call pr_param_in(@id);

    +----------+

    | id_inner |

    +----------+

    | 11 |

    +----------+

    mysql> select @id as id_out;

    +--------+

    | id_out |

    +--------+

    | 10 |

    +--------+

    可以看到:用户变量 @id 传入值为 10,执行存储过程后,在过程内部值为:11(id_inner),但外部变量值依旧为:10(id_out)。

    二、MySQL 存储过程参数(out)

    MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。

    drop procedure if exists pr_param_out;

    create procedure pr_param_out

    (

    out id int

    )

    begin

    select id as id_inner_1; -- id 初始值为 null

    if (id is not null) then

    set id = id + 1;

    select id as id_inner_2;

    else

    select 1 into id;

    end if;

    select id as id_inner_3;

    end;

    set @id = 10;

    call pr_param_out(@id);

    select @id as id_out;

    mysql> set @id = 10;

    mysql>

    mysql> call pr_param_out(@id);

    +------------+

    | id_inner_1 |

    +------------+

    | NULL |

    +------------+

    +------------+

    | id_inner_3 |

    +------------+

    | 1 |

    +------------+

    mysql> select @id as id_out;

    +--------+

    | id_out |

    +--------+

    | 1 |

    +--------+

    可以看出,虽然我们设置了用户定义变量 @id 为 10,传递 @id 给存储过程后,在存储过程内部,id 的初始值总是 null(id_inner_1)。最后 id 值(id_out = 1)传回给调用者。

    三、MySQL 存储过程参数(inout)

    MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

    drop procedure if exists pr_param_inout;

    create procedure pr_param_inout

    (

    inout id int

    )

    begin

    select id as id_inner_1; -- id 值为调用者传进来的值

    if (id is not null) then

    set id = id + 1;

    select id as id_inner_2;

    else

    select 1 into id;

    end if;

    select id as id_inner_3;

    end;

    set @id = 10;

    call pr_param_inout(@id);

    select @id as id_out;

    mysql> set @id = 10;

    mysql>

    mysql> call pr_param_inout(@id);

    +------------+

    | id_inner_1 |

    +------------+

    | 10 |

    +------------+

    +------------+

    | id_inner_2 |

    +------------+

    | 11 |

    +------------+

    +------------+

    | id_inner_3 |

    +------------+

    | 11 |

    +------------+

    mysql>

    mysql> select @id as id_out;

    +--------+

    | id_out |

    +--------+

    | 11 |

    +--------+

    从结果可以看出:我们把 @id(10),传给存储过程后,存储过程最后又把计算结果值 11(id_inner_3)传回给调用者。 MySQL 存储过程 inout 参数的行为跟 C 语言函数中的引用传值类似。

    通过以上例子:如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。

    展开全文
  • 存储过程1.创建存储过程并查看全局变量mysql> create database yy;Query OK, 1 row affected (0.00 sec)mysql> use yy;Database changedmysql> set @num1=10,@num2=20,@num3=30;//设置全局变量mysql> ...
  • 1、in模式参数输入模式的参数,用于接收参数,在子程序内部,不能进行修改。默认的参数模式:in。--定义打印的存储过程CREATE OR REPLACE ...123456--定义测试in模式的存储过程CREATE OR REPLACE PROCEDURE pro(p1...
  • oracle存储过程IN,OUT,IN OUT参数

    千次阅读 2017-08-26 00:08:45
    --存储过程输入输出参数 --1.【IN参数】 --创建存储过程:更新students表的学生年龄 create or replace procedure update_age(in_age in number) as begin update students set student_age=in_age; commit; end; ...
  • MySQL 存储过程参数IN OUT INOUT区别 MySQL 存储过程参数IN OUT INOUT对比 一、IN -- 创建测试存储过程 delimiter // create procedure p_in ( IN num int ) begin select num; set num=100;...
  • mysql三种参数模式,in, out, inout模式的使用实例
  • 存储过程1.创建存储过程并查看全局变量mysql> create database yy;Query OK, 1 row affected (0.00 sec)mysql> use yy;Database changedmysql> set @num1=10,@num2=20,@num3=30;//设置全局变量mysql> ...
  • oracle 存储过程in out inout三种参数模式  oracle过程中定义了in|out|in out3中参数模式,每个参数可以选择其一  in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会...
  • Oracle存储过程in、out、in out 模式参数 标签:oracle存储inout参数 2016-11-14 11:593272人阅读评论(0)收藏举报 分类: oracle(7) 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢?一、MySQL 存储过程参数(in)MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对...
  • 1.参数in的使用(代表输入,意思说你的参数要传到存过过程的过程里面去)//为了避免存储过程中分号(";")结束语句,我们使用分隔符告诉mysql解释器,该段命令是否已经结束了。/**案例功能:求1-n的和开发者:徐守威时间...
  • oracle过程中定义了in | out|in out3中参数模式
  • I've got a stored procedure in MySQL that gets the next unique ID from a table, to use as an ID for 2 other tables (not the best way to do it, I'm sure, but I'm modifying someone else's code here)....
  • 存储过程1.创建存储过程并查看全局变量mysql> create database yy;Query OK, 1 row affected (0.00 sec)mysql> use yy;Database changedmysql> set @num1=10,@num2=20,@num3=30;//设置全局变量mysql> ...
  • 1. in 参数 ...-- 声明存储过程 create or replace procedure pro_in(p_num in number) is begin dbms_output.put_line(p_num); -- p_num:=10;-- 添加此行编译报错,in 参数不能赋值 end pro_in;...
  • 存储过程 含义:一组预先编译好的sQL语句的集合...CREATE PROCEDURE 存储过程名(参数列表) BEGIN 存储过程体(一组合法的SQL语句) END 注意: 参数列表包含三部分: 参数模式 参数参数类型 举例: IN stuname VA...
  • 存储过程 1存储过程是一组为了完成特定功能的SQL语句集 ...5: OUTIN OUT 的形参不能有默认表达式,只有in参数可以设置默认值语法 create 【or replace】procedure procedure_name 【(parameter 【in |
  • MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢?一、MySQL 存储过程参数(in)MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对...
  • MySQL存储过程inout参数最简单的例子:[html]mysql> DELIMITER $$mysql> USE test $$Database changedmysql> DROP PROCEDURE IF EXISTS `sp_add`$$Query OK, 0 rows affected (0.00 sec)mysql> ...
  • 示例 DELIMITER $$ DROP ... 一个INOUT参数是由呼叫者初始化,可以由程序进行修改,并且由所述方法制备的任何变化是可见的呼叫者时,过程返回。 参考:http://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
  • MySQL 存储过程参数有三种类型:in、out、inout。 它们各有什么作用和特点呢? 一、MySQL 存储过程参数(in) MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改...
  • 当前位置:我的异常网» 数据库»oracle 存储过程in out inout三种参数形式和PROMPToracle 存储过程in out inout三种参数形式和PROMPT用法www.myexceptions.net网友分享于:2013-03-27浏览:114次oracle 存储过程in ...
  • mysql中存储过程inout参数无法返回值? mysql存储过程中,使用SELECT给变量赋值的方式,貌似不支持返回! 知道的小伙伴们,不吝赐教,着急 看图: ![图片说明]...
  • 存储过程1.创建存储过程并查看全局变量mysql> create database yy;query ok, 1 row affected (0.00 sec)mysql> use yy;database changedmysql> set @num1=10,@num2=20,@num3=30;//设置全局变量mysql> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,395
精华内容 958
关键字:

存储过程inout参数