mysql为四个表创建储存过程或者储存函数

mysql为四个表创建储存过程或者储存函数,第1张

“另一个存储过程”的名字是sp1,没有参数,返回的结果集共3列,全部为int型,那么“存储过程”里添加一个与结果集列数相同的临时表或表变量用于接收“另一个存储过程”的结果集

如下

CREATE

PROCEDURE

sp2

AS

DECLARE

@t

table(a

int,b

int,c

int)

INSERT

INTO

@t(a,b,c)

EXEC

sp1

SELECT

FROM

@t

使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用。

创建存储过程

  和数据表一样,在使用之前需要创建存储过程,它的简明语法是:

引用:

Create

PROC

存储过程名称

[参数列表(多个以“,”分隔)]

AS

SQL

语句

例:

引用:

Create

PROC

upGetUserName

@intUserId

INT,

@ostrUserName

NVARCHAR(20)

OUTPUT

--

要输出的参数

AS

BEGIN

--

将uName的值赋给

@ostrUserName

变量,即要输出的参数

Select

@ostrUserName=uName

FROM

uUser

Where

uId=@intUserId

END

  其中

Create

PROC

语句(完整语句为Create

PROCEDURE)的意思就是告诉SQL

SERVER,现在需要建立一个存储过程,upGetUserName

就是存储过程名称,@intUserId

@ostrUserName

分别是该存储过程的两个参数,注意,在SQL

SERVER中,所有用户定义的变量都以“@”开头,OUTPUT关键字表示这个参数是用来输出的,AS之后就是存储过程内容了。只要将以上代码在“查询分析器”里执行一次,SQL

SERVER就会在当前数据库中创建一个名为“upGetUserName”的存储过程。你可以打开“企业管理器”,选择当前 *** 作的数据库,然后在左边的树型列表中选择“存储过程”,此时就可以在右边的列表中看到你刚刚创建的存储过程了(如果没有,刷新一下即可)。

1、函数必须指定返回值,且参数默认为IN类型。

2、存储过程没返回值,参数可以是 IN,OUT,IN OUT类型,有的人可能会理解成OUT 也算是返回值。

3、调用方式:函数 select my_fun() ;过程 call my_pro( ) ;

4、DEMO

1

2

3

4

5

6

7

8

9

10

11

DELIMITER $$

DROP FUNCTION IF EXISTS my_fun$$

CREATE

FUNCTION my_fun(a INT(2),b INT(2))

RETURNS INT(4)

BEGIN

DECLARE sum_ INT(2) DEFAULT 0;

SET sum_ = a + b;

RETURN sum_;

END$$

DELIMITER ;

1

2

3

4

5

6

7

8

DELIMITER $$

DROP PROCEDURE IF EXISTS my_pro$$

CREATE

PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))

BEGIN

SET c = a + b;

END$$

DELIMITER ;

SQL中存储过程和自定义函数的区别

2008年12月19日来源:233网校评论 分享到 我的做题记录

  刚开始学SQL,很快就发现存储过程和数据库自定义函数之间貌似有很多的相同点,所以把其差别简单做下记录,以备以后查阅:

  存储过程:

  存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。

  存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

  可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:

  1、可以在单个存储过程中执行一系列 SQL 语句。

  2、可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

  3、存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

  用户定义函数:

  Microsoft SQL Server 2000 允许创建用户定义函数。与任何函数一样,用户定义函数是可返回值的例程。根据所返回值的类型,每个用户定义函数可分成以下三个类别:

  1、返回可更新数据表的函数

  如果用户定义函数包含单个 Select 语句且该语句可更新,则该函数返回的表格格式结果也可以更新。

  2、返回不可更新数据表的函数

  如果用户定义函数包含不止一个 Select 语句,或包含一个不可更新的 Select 语句,则该函数返回的表格格式结果也不可更新。

  3、返回标量值的函数

  用户定义函数可以返回标量值。

  存储过程

  功能强大,限制少

  不能直接引用返回值

  用select语句返回记录集

  自定义函数

  诸多限制,有许多语句不能使用,许多功能不能实现

  可以直接引用返回值

  用表变量返回记录集

一、主体不同

1、函数:当需要分析数据清单中的数值是否符合特定条件时,使用数据库工作表函数。

2、存储过程:是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,一次编译后永久有效。

二、特点不同

1、函数:只能返回一个变量,可以嵌入sql中和存储过程中使用。

2、存储过程:用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

三、功能不同

1、函数:不能用临时表,只能用表变量,函数不能执行一组修改全局数据库状态的 *** 作。可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,所以在查询中位于from关键字后面。

2、存储过程:存储过程需要让sql的query可以执行,存储过程可以返回参数,如记录集。sql语句中不可以含有存储过程。

-Oracle存储过程

-数据库函数

该包用于  动态获取包中存储过程或者函数的参数。

create or replace package SF_GET_ARGUMENTS_PKG is

  -- Author  : SANFU

  -- Created : 2020/7/22 14:40:49

  -- Purpose : 动态获取包中存储过程或者函数的参数

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2);

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

                            p_obj_name in VARCHAR2);

end SF_GET_ARGUMENTS_PKG;

/

create or replace package body SF_GET_ARGUMENTS_PKG is

  /============================================

  Author  : CZH

  Created  : 2020-07-22 15:00:12

  ALERTER  :

  ALERTER_TIME  :

  Purpose  :

  Arg_number  : 2

  P_PKG_NAME :包名

  P_OBJ_NAME :存储过程名或函数名

  ============================================/

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2) IS

    v_pkg_name  varchar2(100) := upper(p_pkg_name);

    v_obj_name  varchar2(100) := upper(p_obj_name);

    v_arg_number NUMBER;

    cursor data_cur is

      select tPACKAGE_NAME,

            tOBJECT_NAME,

            tARGUMENT_NAME,

            tIN_OUT,

            count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,

            row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position

        from sysuser_arguments t

      where tPACKAGE_NAME = v_pkg_name

        and tOBJECT_NAME = v_obj_name

        and tPOSITION <> 0;

  begin

    select count(1)

      into v_arg_number

      from sysuser_arguments t

    where tPACKAGE_NAME = v_pkg_name

      and tOBJECT_NAME = v_obj_name

      and tPOSITION <> 0;

    dbms_outputput_line('/============================================');

    dbms_outputput_line(' Author  : SANFU');

    dbms_outputput_line(' Created  : ' ||

                        TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));

    dbms_outputput_line(' ALERTER  : ');

    dbms_outputput_line(' ALERTER_TIME  : ');

    dbms_outputput_line(' Purpose  : ');

    dbms_outputput_line(' Obj_Name    : ' || v_obj_name);

    dbms_outputput_line(' Arg_Number  : ' || v_arg_number);

    for rec in data_cur loop

      dbms_outputput_line(' ' || recARGUMENT_NAME || ' :');

    end loop;

    dbms_outputput_line(' ============================================/');

  end get_arguments;

  --获取参数

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

                            p_obj_name in VARCHAR2) IS

    v_pkg_name varchar2(100) := upper(p_pkg_name);

    v_obj_name varchar2(100) := upper(p_obj_name);

    v_attr    varchar2(100);

    cursor data_cur is

      select tPACKAGE_NAME,

            tOBJECT_NAME,

            tARGUMENT_NAME,

            tIN_OUT,

            count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,

            row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position

        from sysuser_arguments t

      where tPACKAGE_NAME = v_pkg_name

        and tOBJECT_NAME = v_obj_name

        and tPOSITION <> 0;

  begin

    dbms_outputput_line(v_pkg_name || '' || v_obj_name || '(');

    for rec in data_cur loop

      if recin_out = 'IN' then

        v_attr := '';

      elsif recin_out = 'OUT' then

        v_attr := '';

      elsif recin_out = 'IN/OUT' then

        v_attr := '';

      end if;

      if data_cur%ROWCOUNT = recarg_number then

        dbms_outputput_line(lower(recARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(recARGUMENT_NAME));

      else

        dbms_outputput_line(lower(recARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(recARGUMENT_NAME) || ',');

      end if;

    end loop;

    dbms_outputput_line(');');

  end pf_get_arguments;

end SF_GET_ARGUMENTS_PKG;

/

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12461976.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存