精华内容
下载资源
问答
  • 2022-02-15 14:05:45

    in 表示传入的参数

    ( in 参数名1 参数类型,in 参数名2 参数类型,....)
    
    delimiter  $
    create  procedure  func(in id int)
    begin
        select * from 表 where Id = id;--查询Id=id的信息
    end $
    delimiter;
     
    call func(101);--调用

    out 表示从内部传值给调用者

    ( out  参数名1 参数类型,in 参数名2 参数类型,....)
    delimiter  $
    --传入id,查询返回name
    create  procedure  func(in id int,out name varchar(20))
    begin
        select ename into name from 表 where Id = id;--查询Id=id的ename,并将值赋给name
    end $
    delimiter;
     
    call func(101,@name);--调用
    select @name;

    inout 综合了上面2种特性

    ( inout  参数名1 参数类型,in 参数名2 参数类型,....)
    delimiter  $
    create  procedure  func(in num int)
    begin
        set num = num * 10;
    end $
    delimiter;
     
    set @inout_num = 2;
    call func(@inout_num);
    select @inout_num;

    更多相关内容
  • 一个MySQL 存储过程传参数的问题想实现例如筛选条件为:where id in(1,2,3,...),下面有个不错的示例,感兴趣的朋友可以参考下
  • MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢? 一、MySQL 存储过程参数(in) MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数...
  • 存储过程 in参数 的使用 IN参数只用来向过程传递信息,为默认值。 -- 存储过程中 in 参数的 使用 DELIMITER ;; CREATE PROCEDURE name_in(IN `time` VARCHAR(50)) BEGIN SELECT NOW() ,`time`; END ;; CALL name_in...
  • 创建存储过程时可以输入输出参数,下面是一个mysql存储过程的创建示例,需要的朋友可以参考下
  • 本篇文章是对mysql存储过程中表名使用参数传入进行了详细的分析介绍,需要的朋友参考下
  • MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢
  • MySQL存储过程——参数传递

    千次阅读 2022-04-12 13:19:20
    MySQL存储过程——参数传递

    什么是存储过程

    1、mysql5.0开始支持存储过程

    2、存储过程就是一组sql语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于Java语言中的方法

    3、存储过程就数据sql语言层面的代码封装与重用

    存储过程的特性

    1、有输入输出参数,可以声明变量,有if/else,case ,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能

    2、函数的普通特性:模块化,封装,代码复用

    3、速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤。

    格式:

    delimiter 自定义结束符号
    
    create procedure 存储名( [in ,out ,inout] 参数名 数据类型...)
    
    begin
    
    sql 语句
    
    end 自定义的结束符号
    
    delimiter;
    
    DELIMITER $$
    
    CREATE PROCEDURE pro1()
    
    BEGIN
    
    SELECT NAME,age FROM emp2;
    
    END $$
    
    DELIMITER;
    
    CALL pro1(); ——调用存储过程

    1、局部变量(用户自定义,在begin/end块中有效)

    语法:declare var_name type[default var_value];
    
    举例:declare nickname varchar(32);
    
    DELIMITER $$
    
    CREATE PROCEDURE pro3()
    
    BEGIN
    
    DECLARE var_name VARCHAR(32) DEFAULT 'aaa';
    
    SET var_name='张三';
    
    #select var_name;
    
    SELECT NAME,age FROM emp2
    
    WHERE NAME=var_name;
    
    END $$
    
    DELIMITER;
    
    CALL pro3();
    
    还可以使用select...into 语句为变量赋值,基本语法如下:
    
    select col_name [...] into var_name[...] from table_name where condition
    
    当将查询结果赋值给变量时,该查询语句返回结果只能是单行单列。

    2、用户变量(当前会话有效,类比java的成员变量)

    语法:@var_name 不需要提前声明,使用即声明
    
    DELIMITER $$
    
    CREATE PROCEDURE proc6()
    
    BEGIN
    
    SET @var_name='张三';
    
    SELECT @var_name;
    
    END $$
    
    delimiter;
    
    CALL proc6()
    
    SELECT @var_name ——在begin外也可以使用

    3、系统变量

    1、系统变量分为全局变量和会话变量

    2、全局变量在mysql启动时由服务器自动初始化为默认值,可以通过my.ini这个文件来更改

    3、会话变量在新建连接时,由mysql来初始化,会将全局变量复制一份,作为会话变量,没进行修改的话,所有值是跟全局变量一样的

    4、会话变量修改只影响当前连接会话,全局变量会影响整个服务器

    5、有些可以利用语句进行动态修改,有些系统变量的值是只读的,对于那些可以修改的系统变量,我们可以用set进行更改。

    语法@@global.var_name(全局变量)
    
    show global variables; ——查看全局变量
    
    select @@global.auto_incerment_increment; ——查看某全局变量
    
    set global sort_buffer_size=40000; ——初始化或修改全局变量的值
    
    set @@global.sort_buffer_size =30000; ——初始化或修改全局变量的值(为32768,不能小于这个值)
    
    语法@@session.var_name(会话变量)
    
    show session variables; ——查看会话变量
    
    select @@session.auto_incerment_increment; ——查看某会话变量
    
    set session sort_buffer_size=40000; ——初始化或修改会话变量的值
    
    set @@session.sort_buffer_size =30000; ——初始化或修改会话变量的值(为32768,不能小于这个值)

    存储过程传参

    1、(in,可以传多个参数)(in param1 varchar(20),in param2 int ...)

    in表示传入的参数,可以传入数值或者变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。

    --输入员工的工号,返回员工的信息
    
    delemiter $$
    
    create procedure dec_param(in param_empno varchar(20))
    
    begin
    
    select * from emp where empno=param_empno;
    
    end $$
    
    delimiter ;
    
    call dec_param('1001');

    2、(out)

    表示从存储过程内部传值给调用者

    --传入员工的编号,返回员工的姓名(返回单个值)
    
    delimiter $$
    
    create procedure proc(in empno int ,out out_name varchar())
    
    begin
    
    select ename into out_name from emp where emp.empno=empno;
    
    end $$
    
    delimiter;
    
    call proc(1001,@o_ename);
    
    select @o_ename;
    
    传入员工的编号,返回员工的姓名和薪资(返回多个值)
    
    delimiter $$
    
    create procedure proc(in empno int ,out out_name varchar(),out out_sal decimal(7,2))
    
    begin
    
    select ename,sal
    
    into out_name,out_sal
    
    from emp where emp.empno=empno;
    
    end $$
    
    delimiter;
    
    call proc(1001,@o_ename,@o_sal);
    
    select @o_ename,@o_sal;

    3、inout

    inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入的值也可以修改变量的值(即使函数执行完)

    --传入员工名,拼接部门号,传入薪资,求出年薪
    
    delimiter $$
    
    create procedure proc(inout inout_ename varchar(50),inout inout_sal int)
    
    begin
    
    select concat(deptno,"_",inout_ename) into inout_ename from emp where ename=inout_ename;
    
    set inout_sal=inout_sal*12;
    
    end $$
    
    delimiter;
    
    set @inout_ename='关羽';
    
    set @inout_sal=3000;
    
    call proc(@inout_ename,@inout_sal );
    
    select @inout_ename;
    
    select @inout_sal;

    展开全文
  • 存储过程:create procedure Pro_GetUserInfo(in szEmpName varchar(1000))-> begin-> declare strSql varchar(1000);-> set strSql = concat('insert into TmpTable_UserInfo(EmpName,PcName,IP) select ...

    存储过程:

    create procedure Pro_GetUserInfo(in szEmpName varchar(1000))

    -> begin

    -> declare strSql varchar(1000);

    -> set strSql = concat('insert into TmpTable_UserInfo(EmpName,PcName,IP) select EmpName,PcName,IP from T_SC_UserManager where EmpName in (', szEmpName, ')');

    -> drop table if exists TmpTable_UserInfo;

    -> create temporary table TmpTable_UserInfo(EmpName varchar(32) not null, PcName varchar(32) not null, IP varchar(32) not null);

    -> set @sql1 = strSql;

    -> prepare stmt_p from @sql1;

    -> execute stmt_p;

    -> end

    ->

    调用:

    call Pro_GetUserInfo("'172.16.10.2','172.16.10.21'"); // 参数用双引号,其实用单引号也行,但是如果参数里有引号就乱套了

    下面的方法不行:

    create procedure Pro_GetUserInfo(in szEmpName varchar(1000))

    -> begin

    -> drop table if exists TmpTable_UserInfo;

    -> create temporary table TmpTable_UserInfo(EmpName varchar(32) not null, PcName varchar(32) not null, IP varchar(20) not null);

    -> insert into TmpTable_UserInfo(EmpName, PcName, IP) select EmpName, PcName, IP from T_SC_UserManager where EmpName in(szEmpName); // 不能直接传进来,如果直接传进来,展开为in("'172.16.10.2','172.16.10.21'"),带着双引号     -> end     ->

    展开全文
  • 网上有很多文章都有参考,但是很多再关键的地方都没有描述清楚,
  • MySQL 入门教程中,我们能够看到很多关于如何创建储存过程 和如何利用 IN 和 OUT 参数调用存储过程的示例。这些示例都很简单,能够很好的帮助你理解 MySQL 中创建带参数存储过程的语法。这些示例已在 MySQL 5.5 中...
  • 接到这个需求,本以为简单。...方法一 分割例:通过SQL Server存储过程传送数组参数删除多条记录eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录:CREATE PROCEDURE DeleteNews@ID ...

    接到这个需求,本以为简单。谁知道SQL不支持数组。于是想用','分割传进去,哪知道SQL居然没有split()函数,还得用substring & charindex,坑爹啊。

    方法一 分割

    例:通过SQL Server存储过程传送数组参数删除多条记录

    eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录:

    CREATE PROCEDURE DeleteNews

    @ID nvarchar(500)

    as

    DECLARE @PointerPrev int

    DECLARE @PointerCurr int

    DECLARE @TId int

    Set @PointerPrev=1

    while (@PointerPrev < LEN(@ID))

    Begin

    Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)

    if(@PointerCurr>0)

    Begin

    set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)

    Delete from News whereID=@TIDSET @PointerPrev = @PointerCurr+1

    End

    else

    Break

    End

    --删除最后一个,因为最后一个后面没有逗号,所以在循环中跳出,需另外再删除

    set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)

    Delete from News whereID=@TIDGO

    这个方法麻烦不?于是又有另外一种方法——临时表

    方法二 Table对象

    传3个参数,都是数组形式还有时间类型用存储过程更新

    @Oid = 1,2,3,4

    @Did = 111,222,333,444

    @DateArr = '2007-1-1,2007-1-2,2007-1-3,2007-1-4'

    CREATE proc Test999

    @Oid nvarchar(1000)    --ID1

    ,@Did nvarchar(1000)  --ID2

    ,@DateArr nvarchar(1000) --日期

    AS

    DECLARE @id1s varchar(8000), @id2s varchar(8000), @dates varchar(8000)

    set @id1s=@Oid

    set @id2s=@Did

    set @dates = @DateArr

    -- 调用函数实现处理

    SELECT @id1s=@id1s, @id2s=@id2s,@dates = @dates

    UPDATE A SET terminate_time = B.dt

    FROM [Table] A,(

    SELECT

    id1 = CONVERT(int, Desk_id.value),

    id2 = CONVERT(int, room_id.value),

    dt = CONVERT(datetime, terminate_time.value)

    FROM dbo.f_splitstr(@id1s) Desk_id, dbo.f_splitstr(@id2s) room_id, dbo.f_splitstr(@dates) terminate_time

    WHERE Desk_id.id = room_id.id

    AND Desk_id.id = terminate_time.id

    ) B

    WHERE A.Desk_id = B.ID1 AND A.room_id = B.ID2

    GO这个还用到一个函数f_splitstr

    CREATE FUNCTION dbo.f_splitstr(

    @str varchar(8000)

    )RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))

    AS

    BEGIN

    DECLARE @pos int

    SET @pos = CHARINDEX(',', @str)

    WHILE @pos > 0

    BEGIN

    INSERT @r(value) VALUES(LEFT(@str, @pos - 1))

    SELECT

    @str = STUFF(@str, 1, @pos, ''),

    @pos = CHARINDEX(',', @str)

    END

    IF @str > ''

    INSERT @r(value) VALUES(@str)

    RETURN

    END

    这个方法更加可怕~~~辗转百度,找到了一个还不错的方法,用OPENXML,这个SQL2000就支持了。

    方法三 xml

    应该用SQL2000 OpenXML更简单,效率更高,代码更可读:

    CREATE Procedure [dbo].[ProductListUpdateSpecialList]

    (

    @ProductId_Array NVARCHAR(2000),

    @ModuleId INT

    )

    AS

    delete from ProductListSpecial whereModuleId=@ModuleId

    -- If empty, return

    IF (@ProductId_Array IS NULL OR LEN(LTRIM(RTRIM(@ProductId_Array))) = 0)

    RETURN

    DECLARE @idoc int

    EXEC sp_xml_preparedocument @idoc OUTPUT, @ProductId_Array

    Insert into ProductListSpecial (ModuleId,ProductId)

    Select

    @ModuleId,C.[ProductId]

    FROM

    OPENXML(@idoc, '/Products/Product', 3)

    with (ProductId int ) as C

    where

    C.[ProductId] is not null

    EXEC sp_xml_removedocument @idoc

    哇,看起来还是很复杂的说。有木有更好的办法呢?

    既然是OPENXML,为啥不用XML呢?于是查到,SQL2005以上都支持XML。Good,找到一片天了。

    利用SQL2005的XML/XQuery功能,可以很方便的解决传数组参数的问题。

    declare @xml xml

    set @xml = '<?xml version="1.0"?>

    1

    2

    3

    '

    select N.value( '(text())[1]','int' ) RoomId from @xml.nodes('/ArrayOfInt/int') V(N)

    结果就是

    e8c02935185eba868e5609f3aa84d9e3.png

    注:上面的数据类型为XML

    这样就可以给存储过程传一个集合了,一般是数组,比如主键的集合。然后可用通过主键集合来查询记录。

    客户端可用使用序列化,把list转化成xml。不过在序列化过程中,遇到了一些小麻烦。

    1. .net默认是utf-16,SQL只认识utf-8

    2. 出现很讨厌的xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    可以用我这个类

    public static classSerializeHelper

    {private static readonly XmlSerializerNamespaces Namespaces = newXmlSerializerNamespaces();staticSerializeHelper()

    {//去掉 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    Namespaces.Add(string.Empty, string.Empty);

    }public static string SerializeXml(T obj)

    {

    XmlSerializer serializer= new XmlSerializer(typeof(T));using (MemoryStream stream = newMemoryStream())

    {

    serializer.Serialize(stream, obj, Namespaces);returnEncoding.UTF8.GetString(stream.ToArray());

    }

    }public static T DeserializeXml(stringobj)

    {

    XmlSerializer serializer= new XmlSerializer(typeof(T));using (StringReader reader = newStringReader(obj))

    {return(T)serializer.Deserialize(reader);

    }

    }

    }

    SQL与XML,XQuery结合起来,功能会很强大的。

    从这个事件也看出,我应该多关注SQL各个版本之间新增功能,比如SQL2008新增功能。否则遇到问题,找不到比较好的解决方案。

    OK,问题以完美的方式解决了,用最妙的方法解决问题,好开森哦~~~O(∩_∩)O!

    展开全文
  • mysql 存储过程 默认值解决办法

    千次阅读 2021-01-18 23:21:33
    mysql 存储过程 默认值//在mssql的实现方式CREATE PROCEDURE [dbo].[InsertNode]@Name nvarchar(50) = N ' ',@ServiceType int= 4,@LicStatus intASBEGININSERT INTO KV_Node([Name],[ServiceType],...
  • mysql存储过程传参问题

    千次阅读 2022-04-29 19:47:14
    如果仅仅想mysql存储过程,那就用in类型 如果仅仅从mysql存储过程返回值,那就用out类型 如果需要把数据mysql存储过程,还要经过一些计算再回传我们,此时,要使用inout类型 1.无参数 call 存储...
  • MySQL 存储过程参数

    千次阅读 2021-01-18 19:14:57
    MySQL 存储过程参数MySQL存储过程参数简介在现实应用中,开发的存储过程几乎都需要参数。这些参数使存储过程更加灵活和有用。 在MySQL中,参数有三种模式:IN,OUT或INOUT。IN- 是默认模式。在存储过程中定义IN参数...
  • MySQL存储过程参数

    2021-12-23 12:13:32
    MySQL存储过程参数 MySQL存储过程参数共有三种:IN \ OUT \ INOUT 注:未经过本文作者同意,严禁转载 输入参数 输入参数(IN):在调用存储过程中传递数据给存储过程的参数(在调用的存储过程必须具有实际值的...
  • MySql存储过程数组参数

    千次阅读 2018-09-17 10:38:40
    第二版想法为,把所有参数传入到存储过程,循环参数为一个数组,mysql存储过程里没有split函数, 取数组中的值通过substring截出,通过截的id值作为条件查询数据,查询到的数据有可能是 多条记录,所有想通过游标...
  • Mysql存储过程 1.创建存储过程语法(格式) DELIMITER $ CREATE PROCEDURE 存储过程名A(IN 传入参数名a INT,IN 传入参数名b VARCHAR(20),OUT 返回参数名c INT) BEGIN  内容.......... END $ 解析: IN 代表...
  • mysql存储过程的概念: 存储在数据库当中可以执行特定工作(查询和更新)的一组SQL代码的程序段。 mysql函数的概念: 函数是完成特定功能的SQL语句,函数分为内置函数和自定义函数(user-defined function UDF) ...
  • MySQL存储过程

    2021-03-14 16:49:20
    MySQL存储过程存储过程是一组预先编译好的SQL语句的集合好处:提高了代码的重用性简化操作减少了编译次数并且减少了和数据库连接次数,提高效率创建存储过程#语法参数列表包含三部分参数模式参数参数类型如...
  • MySQL 有输入输出参数存储过程实例
  • MySQL 5.0 版本开始支持存储过程。 简单的说,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;Python里面的函数; 存储过就是数据库 SQL 语言层面的代码封装与...
  • mysql存储过程教程(1)

    千次阅读 2021-02-07 17:30:12
    MySQL存储过程1.1 CREATE PROCEDURE (创建)CREATE PROCEDURE存储过程名(参数列表)BEGINSQL语句代码块END注意:由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数...
  • MySql传参调用存储过程

    千次阅读 2019-09-10 15:25:59
    一、创建存储过程 DROP PROCEDURE IF EXISTS PROC_ADD_USER; //如果存储过程存在,先删除掉存储过程 CREATE PROCEDURE PROC_ADD_USER(in userId char(32), in userName VARCHAR(255), in userAccount VARCHAR(255)) ...
  • MySQL存储过程例子,包含事务,输出参数,嵌套调用,学习mysql存储过程的朋友可以参考下。
  • MySQL存储过程参数或多参数传递

    千次阅读 2018-10-03 09:35:54
    MySQL开发的存储过程几乎都需要参数。这些参数使存储过程更加灵活和有用。 在MySQL中,参数有三种模式:IN,OUT或INOUT。 1,单参数 in DELIMITER $$USE dc3688$$CREATE PROCEDURE GetOfficeByCountry(IN country...
  • mysql存储过程参数类型

    千次阅读 2018-06-15 14:14:44
    存储过程可以理解成程序中封装的代码块,并且可以相互调用由于下面的例子会使用变量,那么先了解一下变量。变量分为用户变量和系统变量用户变量变量名以@开头创建用户变量mysql&gt; select 'hello' into @a; ...
  • Mysql存储过程调用

    千次阅读 2021-01-19 00:34:07
    1.1create procedure (创建)create procedure存储过程名 (参数列表)beginsql...要指定为其它参数,可在参数名之前使用关键词 out或inout在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 238,164
精华内容 95,265
关键字:

mysql存储过程传参数

mysql 订阅