16)创建存储过程

Posted xuan01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16)创建存储过程相关的知识,希望对你有一定的参考价值。

1、创建存储过程的语法:

create procedure 存储过程名(参数1,参数2,...)
begin
    存储过程语句块;
end;

存储过程有三种类型的参数:

in:默认输入参数;

out:输出参数;

inout:既是输入也是输出参数;

测试:实现一个输入学生号,得出学生选修课数目;

delimiter $$
create procedure get_choose_course_num_proc(in stu_no char(11), out stu_num int)
begin
    select count(*) into stu_num from choose  where student_no=stu_no;
end;
$$
delimiter ;

#测试:
set @stu_no=\'2023001\';
set @stu_num = 0;
call get_choose_course_num_proc(@stu_no,@stu_num);
select @stu_num;

 同样我们也可以直接用:

call get_choose_course_num_proc(\'2023003\',@stu_num);
select @stu_num;

 当然我们也可以用一个 inout 参数 代替两个参数;

delimiter $$
create procedure get_choose_course_num2_proc(inout stu_d int)
begin
    select count(*) into stu_d from choose where student_no = stu_d;
end;
$$
delimiter ;

测试:

set @stu_d = \'2023001\';
call get_choose_course_num2_proc(@stu_d);
select @stu_d;

 这里使用一个变量完成;这里传入进去的类型是char型,输出的是int型,因为char型也是可以用int表示;

 

2、查看储存过程定义:

1)查看所有的存储过程定义:

show procedure status\\G

 这里截取的一部分,可以看到详细的信息;

2)查看指定的存储过程定义:

show create procedure get_choose_course_num2_proc\\G

 

 mysql8.0版本之前还可以:

select name from mysql.proc where db=\'数据库名\' and type = \'procedure\';

 

 3)删除存储过程:

drop procedure 存储过程名;

 

总结:函数和存储过程的区别:

 1、函数必须有返回类型和返回值,存储过程可以使用out 或 inout 的参数作为返回值;

2、函数内部可以使用select into 语句为变量赋值,返回不能存在有返回结果集的语句,存储过程没有这个限制;

3、函数可以直接在SQL语句或 MySQL 命令中使用,存储过程一般单独调用;

4、函数中的函数体不能使用事务控制语句;

使用存储过程创建存储过程

【中文标题】使用存储过程创建存储过程【英文标题】:Create Stored Procedure using stored procedure 【发布时间】:2017-04-21 08:18:13 【问题描述】:

尝试使用另一个存储过程创建一个新的存储过程。

CREATE PROCEDURE [dbo].[CreateNewDB]
@dbName nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
EXEC('CREATE DATABASE '+@dbName)
EXEC('USE '+@dbName+ ' CREATE PROCEDURE [dbo].[usp_GetUser] 
        @id varchar(50)
        AS
        BEGIN
        <<Stored Procedure Logic>>
        END')
END

当我尝试如下调用上述存储过程时

DECLARE @return_value int

EXEC    @return_value = [dbo].[CreateNewDB]
        @dbName = N'MyUserDatabase'

SELECT  'Return Value' = @return_value

它创建数据库而不是存储过程。

它会引发以下错误。

Msg 111, Level 15, State 1, Procedure usp_GetUser, Line 6
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

【问题讨论】:

【参考方案1】:

GO 不能用于动态 sql。您可以使用这样的嵌套 sql 查询

DECLARE @dbName nvarchar(30) = 'abcxys'

DECLARE @query nvarchar(max) = 'USE ' + Quotename(@dbName) + 
      '; EXEC sp_executesql N''' + N'CREATE PROCEDURE [dbo].[usp_GetUser] 
      @id varchar(50)
      AS
      BEGIN
         select 1
      END' + ''''; 

PRINT @query

EXEC (@query) 

【讨论】:

【参考方案2】:

我拆分 go 并使用相同的连接运行它,在它们运行时保持打开状态。它从我从目录中获得的文件创建存储过程。

public void RunSprocFile(string sprocFileName, DbContext db)
    
        try
        
            var sprocFileSplit = GetSprocFromFile(sprocFileName).Split(new[] "GO", StringSplitOptions.RemoveEmptyEntries);
            _connectionManager.OpenConn(db);
            foreach (var t in sprocFileSplit)
                if (t.Trim().Length > 0)
                    RunSql(t, db);
            _connectionManager.CloseConn(db);
        
        catch (Exception e)
        
            RecordException(e);
        
    

【讨论】:

仅供参考,如果您有一群人试图帮助您,而您在我们输入冗长的 cmets 来帮助您的同时从我们下面提出问题,这并不鼓励我们提供帮助未来的你。我们浪费了时间。 我马上就得到了两个反对票。怎么回事?我正在尝试学习。我找了很长时间,一条评论确实帮助了我,所以谢谢。对不起,但显然这是一个愚蠢的问题,至少有两个人确保达到我的观点。显然我也浪费了自己的时间,我不应该再问任何问题了。

以上是关于16)创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程创建程序集

未使用存储过程创建索引 - Oracle

MySQL-存储过程

尝试使用参数和多个连接创建存储过程

创建存储过程以比较日期列和更新状态列

mysql存储过程执行ddl语句