精华内容
下载资源
问答
  • 1. 存储过程的类型:(1) 用户自定义存储过程自定义存储过程即用户使用T_SQL语句编写的、为了实现某一特定业务需求,在用户数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,...

    1. 存储过程的类型:

    (1) 用户自定义存储过程

    自定义存储过程即用户使用T_SQL语句编写的、为了实现某一特定业务需求,在用户数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,返回输出参数等。创建自定义存储过程时,存储过程名前加上"##"表示创建了一个全局的临时存储过程;存储过程前面加上"#"时,表示创建的局部临时存储过程。局部临时存储过程只能在创建它的回话中使用,会话结束时,将被删除。这两种存储过程都存储在tempdb数据库中。

    用户定义的存储过程分为两类:T_SQL 和CLR

    T_SQL:存储过程是值保存的T_SQL语句集合,可以接受和返回用户提供的参数,存储过程也可能从数据库向客户端应用程序返回数据。

    CLR存储过程是指引用Microsoft.NET Framework公共语言的方法存储过程,可以接受和返回用户提供的参数,它们在.NET Framework程序集是作为类的公共静态方法实现的。

    (2) 扩展存储过程

    扩展存储过程是以在SQL SERVER环境外执行的动态连接(DLL文件)来实现的,可以加载到SQL SERVER实例运行的地址空间中执行,扩展存储过程可以用SQL SERVER扩展存储过程API编程,扩展存储过程以前缀"xp_"来标识,对于用户来说,扩展存储过程和普通话存储过程一样,可以用相同的方法来执行。

    (3) 系统存储过程

    系统存储过程是 SQL Server系统自身提供的存储过程,可以作为命令执行各种操作。

    系统存储过程主要用来从系统表中获取信息,使用系统存储过程完成数据库服务器的管理工作,为系统管理员提供帮助,为用户查看数据库对象提供方便,系统存储过程位于数据库服务器中,并且以sp_开头,系统存储过程定义在系统定义和用户定义的数据库中,在调用时不必在存储过程前加数据库限定名。例如:sp_rename系统存储过程可以修改当前数据库中用户创建对象的名称,sp_helptext存储过程可以显示规则,默认值或视图的文本信息,SQL SERVER服务器中许多的管理工作都是通过执行系统存储过程来完成的,许多系统信息也可以通过执行系统存储过程来获得。

    系统存储过程创建并存放在与系统数据库master中,一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其它用户所使用。

    2.Sql存储过程

    (1)创建存储过程

    使用 create Procedure语句来创建存储过程,存储过程名称在该语句之后,as关键字标示存储过程主体的开始,存储过程有多个sql语句组成,例如下面的语句创建一个名为usp_getAllEmployees的存储过程,用于从employeeDepartment表中检索数据

    Create Procedure usp_getAllEmployees

    As

    Select LastName,FirstName,JobTitle,Department

    From employeeDepartment

    要执行一个存储过程,可以使用execute语句:

    Execute usp_getAllEmployees

    存储过程的参数

    存储过成人能够通过参数与调用程序通讯。参数定义应当出现在存储过程名称的后面,as的前面,当程序执行存储过程时,可通过存储过程的参数向该存储过程传递值,也可以output参数将值返回至调用程序

    1、指定参数的名称和数据类型

    参数名称应当以@开始,以后的字符可以是遵守对象标识符的任意字符,并以@@开头,因为这是用于内置函数的标识符号,例如下面创建的usp_GetProduct存储过程包含@standardCost和@listPrice两个参数,参数的数据类型均是money

    Create produce usp_GetProduct

    @standardCost money,@listPrice money

    As

    Select name, standardCost, listPrice from product

    Where standardCost>@ standardCost and listPrice> @listPrice

    执行存储过程时,既可以通过显式的方式指定参数名称并分配适当的值,也可以直接分配参数值,如果使用了显式方式,则按任意顺序提供参数,如果未指定参数名称,则必须按参数在存储过程定义的时候的顺序来提供。

    Excute usp_GetProduct @ listPrice=100,@standardCost=10

    Excute usp_GetProduct 10 ,100

    2、为参数指定默认值

    在参数定义中可以为可选参数指定一个,默认值,执行该存储过程时,如果未指定其他值,则使用默认值

    Create produce usp_GetProduct

    @standardCost money=0,@listPrice money

    As

    Select name, standardCost, listPrice from product

    Where standardCost>@ standardCost and listPrice> @listPrice

    执行该存储过程,可以只为@listPrice指定参数

    Excute usp_GetProduct @ listPrice=100

    由于具有默认参数通常是可选参数,所以建议将他们放置在参数列表的末尾以便于调用。

    对于字符参数,在参数传递时可以指定通配符

    3、指定输出参数

    默认情况下,所有的参数均为输出参数,要指定输出参数,必须在参数定义中使用output关键字。当存储过程退出时,它将向调用程序返回输出参数的当前值。,例如,下面创建的存储过程定义了一个输出参数@productCount,用于返回ListPrice大于指定产品的数量

    Create produce usp_GetProduct

    @productCount int output,

    @listPrice money

    As

    set @productCount= (select count(id) from product

    Where listPrice> @listPrice)

    2. 修改存储过程

    如果需要修改存储过程中的语句或者参数,可以删除并重新创建该存储过程,也可以使用alter producedure语句更改该存储过程。删除并重新建时,与该存储过程关联的所有权限将丢失,更改时,将更改过程或者参数定义,但为该存储过程定义的权限将保留,将不会影响任何相关的存储过程或触发器

    Alrter produce usp_GetProduct

    @standardCost money=0,@listPrice money

    As

    Select name, standardCost, listPrice from product

    Where standardCost>@ standardCost and listPrice> @listPrice

    3. 存储过程的重新编译

    1、指定在下次执行时重新编译

    可以使用sp_recompile系统存储过程指定在下次执行存储过程或触发器进行重新编译

    2、从sql server 2005开始,引入了对存储过程执行语句级重新编译的功能,也就是说在重新编译存储过程时,值编译导致重新编译的语句,而不编译整个存储过程。

    要使用此功能,应当在语句中包含recomple查询提示,recomeple指示数据库引擎在执行查询后,丢弃为其生成的查询计划,从而在下次执行时强制编译查询计划,如果未指定recompile。数据库将缓存查询计划并从新使用它们

    3、每次执行时重新编译村重过程

    在创建存储过程时指定with recompile选项,强制在执行存储过程时对其进行重新编译,指定该选项时,数据库引擎将部位该存储过程缓存执行计划,而是在每次执行时都重新编译

    4.创建带游标参数的存储过程

    if (object_id('book_cursor', 'P') is not null)

    drop proc book_cursor

    go

    create proc book_cursor

    @bookCursor cursor varying output

    as

    set @bookCursor=cursor forward_only static for

    select book_id,book_name,book_auth from books

    open @bookCursor;

    go

    --调用book_cursor存储过程

    declare @cur cursor,

    @bookID int,

    @bookName varchar(20),

    @bookAuth varchar(20);

    exec book_cursor @bookCursor=@cur output;

    fetch next from @cur into @bookID,@bookName,@bookAuth;

    while(@@FETCH_STATUS=0)

    begin

    fetch next from @cur into @bookID,@bookName,@bookAuth;

    print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName

    +' ,bookAuth: '+@bookAuth;

    end

    close @cur --关闭游标

    DEALLOCATE @cur; --释放游标

    5.创建分页存储过程

    if (object_id('book_page', 'P') is not null)

    drop proc book_page

    go

    create proc book_page(

    @TableName varchar(50), --表名

    @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*)

    @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)

    @WhereString varchar(500) =N'', --条件语句(不用加where)

    @PageSize int, --每页多少条记录

    @PageIndex int = 1 , --指定当前为第几页

    @TotalRecord int output --返回总记录数

    )

    as

    begin

    --处理开始点和结束点

    Declare @StartRecord int;

    Declare @EndRecord int;

    Declare @TotalCountSql nvarchar(500);

    Declare @SqlString nvarchar(2000);

    set @StartRecord = (@PageIndex-1)*@PageSize + 1

    set @EndRecord = @StartRecord + @PageSize - 1

    SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句

    SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句

    --

    IF (@WhereString! = '' or @WhereString!=null)

    BEGIN

    SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;

    SET @SqlString =@SqlString+ ' where '+ @WhereString;

    END

    --第一次执行得到

    --IF(@TotalRecord is null)

    -- BEGIN

    EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数

    -- END

    ----执行主语句

    set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));

    Exec(@SqlString)

    END

    --调用分页存储过程book_page

    exec book_page 'books','*','book_id','',3,1,0;

    --

    declare @totalCount int

    exec book_page 'books','*','book_id','',3,1,@totalCount output;

    select @totalCount as totalCount;--总记录数。

    399c7c5bea5ba60798660e1dfbf57f8c.png
    展开全文
  • 存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。存储过程的概念存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中...

    点击上方“格姗知识圈”,设为置顶星标

    第一时间送达实用干货


    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

    存储过程的概念

    存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

    存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

    由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

    存储过程的优点

    1、存储过程允许标准组件式编程

    存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

    2、存储过程能够实现较快的执行速度

    如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

    3、存储过程减轻网络流量

    对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

    4、存储过程可被作为一种安全机制来充分利用

    系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

    系统存储过程

    系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。

    常用系统存储过程有:

    exec sp_databases; --查看数据库
    exec sp_tables;        --查看表
    exec sp_columns student;--查看列
    exec sp_helpIndex student;--查看索引
    exec sp_helpConstraint student;--约束
    exec sp_stored_procedures;
    exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
    exec sp_rename student, stuInfo;--修改表、索引、列的名称
    exec sp_renamedb myTempDB, myDB;--更改数据库名称
    exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
    exec sp_helpdb;--数据库帮助,查询数据库信息
    exec sp_helpdb master;

    系统存储过程示例:

    --表重命名

    exec sp_rename 'stu', 'stud';
    select * from stud;

    --列重命名

    exec sp_rename 'stud.name', 'sName', 'column';
    exec sp_help 'stud';

    --重命名索引

    exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
    exec sp_help 'student';

    --查询所有存储过程

    select * from sys.objects where type = 'P';
    select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
     用户自定义存储过程

    1、 创建语法

    create proc | procedure pro_name
       [{@参数数据类型} [=默认值] [output],
        {@参数数据类型} [=默认值] [output],
        ....
       ]
    as
       SQL_statements 

    2、 创建不带参数存储过程

    --创建存储过程

    if (exists (select * from sys.objects where name = 'proc_get_student'))
       drop proc proc_get_student
    go
    create proc proc_get_student
    as
       select * from student;

    --调用、执行存储过程

    exec proc_get_student;

    3、 修改存储过程

    --修改存储过程

    alter proc proc_get_student
    as
    select * from student;

    4、 带参存储过程

    --带参存储过程

    if (object_id('proc_find_stu', 'P') is not null)
       drop proc proc_find_stu
    go
    create proc proc_find_stu(@startId int, @endId int)
    as
       select * from student where id between @startId and @endId
    go
    exec proc_find_stu 2, 4;

    5、 带通配符参数存储过程

    --带通配符参数存储过程

    if (object_id('proc_findStudentByName', 'P') is not null)
       drop proc proc_findStudentByName
    go
    create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
    as
       select * from student where name like @name and name like @nextName;
    go
    exec proc_findStudentByName;
    exec proc_findStudentByName '%o%', 't%';

    6、 带输出参数存储过程

    if (object_id('proc_getStudentRecord', 'P') is not null)
       drop proc proc_getStudentRecord
    go
    create proc proc_getStudentRecord(
       @id int, --默认输入参数
       @name varchar(20) out, --输出参数
       @age varchar(20) output--输入输出参数
    )
    as
       select @name = name, @age = age  from student where id = @id and sex = @age;
    go
    --
    declare @id int,
           @name varchar(20),
           @temp varchar(20);
    set @id = 7;
    set @temp = 1;
    exec proc_getStudentRecord @id, @name out, @temp output;
    select @name, @temp;
    print @name + '#' + @temp;

    7、 不缓存存储过程

    --WITH RECOMPILE 不缓存

    if (object_id('proc_temp', 'P') is not null)
       drop proc proc_temp
    go
    create proc proc_temp
    with recompile
    as
       select * from student;
    go
    exec proc_temp;

    8、 加密存储过程

    --加密WITH ENCRYPTION 

    if (object_id('proc_temp_encryption', 'P') is not null)
       drop proc proc_temp_encryption
    go
    create proc proc_temp_encryption
    with encryption
    as
       select * from student;
    go
    exec proc_temp_encryption;
    exec sp_helptext 'proc_temp';
    exec sp_helptext 'proc_temp_encryption';

    9、 带游标参数存储过程

    if (object_id('proc_cursor', 'P') is not null)
       drop proc proc_cursor
    go
    create proc proc_cursor
       @cur cursor varying output
    as
       set @cur = cursor forward_only static for
       select id, name, age from student;
       open @cur;
    go

    --调用

    declare @exec_cur cursor;
    declare @id int,
           @name varchar(20),
           @age int;
    exec proc_cursor @cur = @exec_cur output;--调用存储过程
    fetch next from @exec_cur into @id, @name, @age;
    while (@@fetch_status = 0)
    begin
       fetch next from @exec_cur into @id, @name, @age;
       print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
    end
    close @exec_cur;
    deallocate @exec_cur;--删除游标

    10、 分页存储过程

    ---存储过程、row_number完成分页

    if (object_id('pro_page', 'P') is not null)
       drop proc proc_cursor
    go
    create proc pro_page
       @startIndex int,
       @endIndex int
    as
       select count(*) from product
    ;    
       select * from (
           select row_number() over(order by pid) as rowId, * from product
       ) temp
       where temp.rowId between @startIndex and @endIndex
    go
    --drop proc pro_page
    exec pro_page 1, 4

    --分页存储过程

    if (object_id('pro_page', 'P') is not null)
       drop proc pro_stu
    go
    create procedure pro_stu(
       @pageIndex int,
       @pageSize int
    )
    as
       declare @startRow int, @endRow int
       set @startRow = (@pageIndex - 1) * @pageSize +1
       set @endRow = @startRow + @pageSize -1
       select * from (
           select *, row_number() over (order by id asc) as number from student
       ) t
       where t.number between @startRow and @endRow;
    exec pro_stu 2, 2;
    Raiserror

    Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。

    语法如下:

    Raiserror({msg_id | msg_str | @local_variable}
     {, severity, state}
     [,argument[,…n]]
     [with option[,…n]]
    )

    # msg_id:在sysmessages系统表中指定的用户定义错误信息

    # msg_str:用户定义的信息,信息最大长度在2047个字符。

    # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。

    任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。

    # state:介于1至127直接的任何整数。State默认值是1。

    raiserror('is error', 16, 1);
    select * from sys.messages;

    --使用sysmessages中定义的消息

    raiserror(33003, 16, 1);
    raiserror(33006, 16, 1);

    48c5d9c9bcde587681fa38d717d64166.gif

    - End -

    作者:swarb 
    原文:https://blog.csdn.net/swarb/article/details/86178486
    推荐阅读

    学会这个小技巧,助你快速打开窗口或软件

    List集合去重方式及效率对比

    有了这个日期工具类,让日期转化不再烦恼

    展开全文
  • 在前面的文章中有介绍过ORACLE中TOP SQL的查询方法:select to_char(a.start_time, 'yyyy-mm-dd hh24:mi:ss') as 开始执行时间,a.username as 用户名,a.sql_id,a.elapsed_seconds as "用时(秒)",b.module as 调用...

    在前面的文章中有介绍过ORACLE中TOP SQL的查询方法:

    select to_char(a.start_time, 'yyyy-mm-dd hh24:mi:ss') as 开始执行时间,

    a.username as 用户名,

    a.sql_id,

    a.elapsed_seconds as "用时(秒)",

    b.module as 调用客户端, --为空或者JDBC Thin Client,PL/SQL Developer,TOAD 12.1.0.22等,表示调用的客户端

    b.sql_text as SQL内容

    from v$session_longops a, v$sqlarea b

    where a.start_time > sysdate - 0.5 / 24 --半小时之内的数据

    and a.username not in ('SYS') --排除系统用户

    and a.elapsed_seconds >= 30 --执行时间超过指定值

    and a.sql_id = b.sql_id

    order by 1 desc;

    这个查询方法能查出执行特别慢的SQL,但是查出来的SQL,参数部分只有占位符,没有具体值,没办法直接执行。比如象下面这样的:

    SELECT * FROM cs_custinfo WHERE nvl ( dr, :"SYS_B_0" ) = :"SYS_B_1" and code like :"SYS_B_2" and name like :"SYS_B_3" and pk_org = :"SYS_B_4" and enablestate = :"SYS_B_5"

    要想手动执行这个SQL,需要针对每个参数手工填入值,由于不知道参数值,SQL只能边猜测边构造,效率低不说,如果查询效率跟参数取值有关,还可能得出错误的结论。

    其实在上面查询中用到的v$sqlarea表中是有保存了SQL的参数值的,这就是v$sqlarea. bind_data,但是这个字段值不能直接使用,因为保存的是类似下面这样的值:BEDA0B2004005DF0AF1500063FC002160180C002160180F001800354022525F40107D003541A25C1D9B7DACAD0CFE9BAC6CAA2CEEFC1F7D3D0CFDEB9ABCBBE25F0012003541447524F55504F5247545950453030303030303030F0012003540132

    要解析这个字段,就需要使用DBMS_SQLTUNE.EXTRACT_BINDS函数:

    select DBMS_SQLTUNE.EXTRACT_BINDS('BEDA0B2004005DF0AF1500063FC002160180C002160180F001800354022525F40107D003541A25C1D9B7DACAD0CFE9BAC6CAA2CEEFC1F7D3D0CFDEB9ABCBBE25F0012003541447524F55504F5247545950453030303030303030F0012003540132') from dual;

    在PLSQL DEVELOPER里结果会是一个集合:

    8019476b61c53680f4e4125586dfc060.png

    点击集合,会出来下面的信息:

    19f93629bbaafa21db3f65814812d41f.png

    有用的主要是三个字段:

    POSITION:参数位置

    DATATYPE_STRING:参数类型

    VALUE_STRING:参数值

    有了以上信息,我们就很容易还原上面查询出来的TOP SQL了:

    SELECT *

    FROM cs_custinfo

    WHERE nvl(dr, 0) = 0

    and code like '%%'

    and name like '%临汾市祥浩盛物流有限公司%'

    and pk_org = 'GROUPORGTYPE00000000'

    and enablestate = '2'

    注意参数类型是数字,参数值就直接用;参数类型是字符串,参数值要加上单引号;其他的相信大家能举一反三自己推导。

    完善后的TOP SQL查询如下:

    select to_char(a.start_time, 'yyyy-mm-dd hh24:mi:ss') as 开始执行时间,

    a.username as 用户名,

    a.sql_id,

    a.elapsed_seconds as "用时(秒)",

    b.module as 调用客户端, --为空或者JDBC Thin Client,PL/SQL Developer,TOAD 12.1.0.22等,表示调用的客户端

    b.sql_text as SQL内容 ,

    DBMS_SQLTUNE.EXTRACT_BINDS(b.bind_data) 绑定变量参数值

    from v$session_longops a, v$sqlarea b

    where a.start_time > sysdate - 0.5 / 24 --半小时之内的数据

    and a.username not in ('SYS') --排除系统用户

    and a.elapsed_seconds >= 5 --执行时间超过指定值

    and a.sql_id = b.sql_id

    order by 1;

    我的文章都是自己在实际工作中解决问题的经验总结,如果这篇文章对您有帮助,希望您能关注点赞转发,谢谢!

    展开全文
  • 本文分享的这个mysql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有。调用方式:call GetUsersDynamic('age<=30','');代码:复制代码 代码示例:/********动态查询用户的信息********/...

    本文分享的这个mysql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有。

    调用方式:call GetUsersDynamic('age<=30','');

    代码:

    复制代码 代码示例:

    /********动态查询用户的信息********/

    CREATE PROCEDURE GetUsersDynamic(WhereCondition varchar(500),OrderByExpress varchar(100))

    begin

    declare stmt varchar(2000);

    if LENGTH(OrderbyExpress)>0 then

    begin

    set @sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition,' order by ',OrderByExpress);

    end;

    else

    begin

    set @sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition);

    end;

    end if;

    prepare stmt from @sqlstr;

    execute stmt;

    end;

    getdate()是一个自定义的函数,作用是返回日期的短格式

    复制代码 代码示例:

    CREATE DEFINER=`root`@`localhost` FUNCTION `getdate`($date datetime) RETURNS varchar(50) CHARSET latin1

    return date_format($date,'%Y-%m-%d');

    动态插入数据的存储过程,(注意四个单引号表示一个一引号):

    复制代码 代码示例:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertUser`(in name2 varchar(50),in password2 varchar(32),in age2 int,in adddate2 datetime)

    begin

    DECLARE stmt varchar(2000);

    set @sqlstr=concat('insert into users(name,password,age,adddate) values(');

    set @sqlstr=concat(@sqlstr,'''',name2,'''',',','''',password2,'''',',',age2,',','''',adddate2,'''',')');

    prepare stmt from @sqlstr;

    execute stmt;

    end;

    附,另一种带参数的形式,在mysql存储过程中动态执行sql文。

    代码:

    复制代码 代码示例:

    mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

    mysql> SET @a = 3;

    mysql> SET @b = 4;

    mysql> EXECUTE stmt1 USING @a, @b;

    mysql> SET @a = 'select * from table1 ';

    mysql> SET @b = 'where column1>10 limit 1';

    mysql> SET @a = concat(@a,@b);

    mysql> PREPARE stmt1 FROM @a;

    mysql> EXECUTE stmt1;

    展开全文
  • Oracle定时任务执行存储过程带参数

    千次阅读 2018-06-14 15:58:24
    存储过程: create or replace procedure pro_test (retCode out number, retMsg out varchar2) is  vcrm v_prod_inst%ROWTYPE; TYPE ref_cursor_type IS REF CURSOR;  use_cursor ref_cursor_type; vunit ...
  • 《Mysql实例MySql带参数存储过程(动态执行SQL语句)》要点:本文介绍了Mysql实例MySql带参数存储过程(动态执行SQL语句),希望对您有用。如果有疑问,可以联系我们。导读:本文分享的这个mysql存储过程是根据用户输入...
  • 好在执行存储过程时可以直接带参数,网上查的都是:da.selectcommand.commandtext = “nameofprocedure(’para1’,’para2’,para3)“;da.selectcommand.commandtype = commandtype.storedprocedure;实际不通,...
  • 上一篇文章介绍了带参数的SQL语句执行方法和不带参数存储过程执行方法,这一篇我们介绍带参数存储过程执行方法,它调用通用数据访问类(SqlHelper)执行 SqlHelper.ExecuteNonQuery()方法,使用示例为;...
  • MySQL5.0 以后,支持动态sql语句。当SQL语句中 字段名,表名,数据库名等 要作为变量时,必须要使用动态SQL。MySQL动态SQL语法如下:set sql = (预处理的sql语句...EXECUTE stmt (如果sql有参数的话, USING xxx,xxx)...
  • 但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能。print_table建立存储过程如下:CREATE OR REPLACE PROCEDURE print_table(p_query IN ...
  • MySql带参数存储过程编写该存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式:call GetUsersDynamic('age<=30','');/********动态查询用户的信息********/CREATE PROCEDURE ...
  • vc++ 利用ADO执行带参数和返回集的存储过程
  • Java中执行存储过程时,有时需要将存储过程的返回值获取到,并进行一些操作; 一、涉及的Jar包如下: import java.sql.CallableStatement; import org.hibernate.Session; 二、主要实现逻辑如下:  Session ...
  • 1.如果是命令窗口就用exec 存储过程名: 1 EXECprocedure;--procedure是存储过程名 2.如果是 SQL窗口就用 begin 存储过程名 end; 1 2 3 begin procedure;--...
  • in 输入参数 delimiter $ create procedure pro_findId(in eid int ) begin select * from where id=eid;...这样存储过程就创建好了 我们来执行以下 call pro_findid(2); 转载于:https://www.cnblogs.c...
  • 这样得到一个聚合服务的REST接口层,该层主要负责定义和管理接口的各个请求、响应参数,REST接口不变,而对应的数据处理逻辑可以根据实际情况进行调整,以后对存储或计算方案进行升级改动,都不影响使用上层REST接口...
  • 执行带参数存储过程

    千次阅读 2013-05-08 15:42:34
    我的存储过程如下: create procedure spAddRenter @name varchar(20), @contact varchar(100), @contractID char(18), @renterRental money, @remark varchar(50)='无' //默认值是【无】 as insert into ...
  • 1.不含动态sql、输出参数存储过程调用实例 1.存储过程代码: 2.EF自动生成代码(包括对应ObjectResult的实体模型): 3.调用存储过程代码实例: 总结: ObjectParameter参数对应...
  • 我创建了一个存储过程,不过执行的时候报错,请教大神原因何在? 还有个次要问题,我的程序中用的是System.Data.OracleClient 但是OracleType中没有VARCHAR2,如何自己添加一个? create or replace procedure ...
  • 方法一:EXEC ZY.[IN].IN_NETWORK_UPLOAD_DETAIL_SP ‘参数1’,‘参数2’ 方法二:EXEC ZY.[IN].IN_NETWORK_UPLOAD_DETAIL_SP @参数名1 = 参数1,@参数名2 = 参数2(写出存储过程名,然后回车可自动生成)
  • // FormID、Opid是传入值,doccode是传出值 注意参数不能@,传出值不要加output,传入、传出类型已在CreateParam时指定了 ClientDataSet5.CommandText := ’ Execute _sysP_NewDocCode :FormID,:Opid,:doccode ';...
  • 调用存储过程时,参数列表中的输出变量不能是常量,又不能在调用时直接在参数列表中声明。 因此要先声明一个变量,再执行存储过程。 例如 create or replace procedure prc (v1 in number,v2 in varchar2, v3 ...
  • c#执行sqlserver返回参数存储过程

    千次阅读 2017-08-23 14:13:02
    c#执行sqlserver返回参数存储过程
  • 有的时候我们希望利用job调用参数存储过程,那么下面就利用一个测试来介绍job如何调用参数存储过程。创建测试表:create table aaa(name varchar2(10));创建测试存储create procedure mytest (name ...
  • 可以用一个“execute 存储过程参数”命令来调用存储过程。 优点及其缺点: 优势:如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。响应时间上来说有优势,可以给我们带来运行效率提高的好处,...
  • 存储过程经过预编译处理 而SQL查询没有SQL语句需要先被数据库引擎处理成低级的指令 然后才执行-------------------------------------------------------如果是只执行一次的话,存储过程不一定比SQL语句效率高....
  • 问题:在php中用使用mysql方式调用存储过程后无法再执行其它sql执行语句。报错内容:commands out of sync you can't run this command now 。解决办法:使用mysqli方式,示例代码://以下为原生写法,可自行封装//...
  • 问题描述:执行一个存储过程得到一个多条记录的结果集,然后循环这个结果集的每一条记录,根据这条记录的某几个字段执行一个带参数存储过程,再将返回的结果集插入到一张表中。 Execute SQL Task “Get ...

空空如也

空空如也

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

存储过程带参数执行