精华内容
下载资源
问答
  • sql server 创建存储过程

    万次阅读 多人点赞 2018-03-01 13:52:52
    右键单击“存储过程”,再单击“新建存储过程”将会创建存储过程模板:让我困惑的 <Procedure_Name, sysname, ProcedureName> 有什么用?搜遍全网 也没答案。。。。上图其实是一个存储过程...

    首先先把我困惑的地方放到前面,后面在详细讲一下过程。

    1. 在 “对象资源管理器”中,连接到 数据库引擎 的实例,然后展开该实例。

    2. 依次展开 “数据库”---》 “可编程性”

    3. 右键单击“存储过程”,再单击“新建存储过程”

    将会创建存储过程模板:

    让我困惑的 <Procedure_Name, sysname, ProcedureName>   有什么用?

    搜遍全网 也没答案。。。。


    上图其实是一个存储过程模板。<Procedure_Name, sysname, ProcedureName> 等替换字符串标记指定模板参数的值“面板 提供替换字符标记的。

    只有这种作用,和存储过程没有关系。

    <Procedure_Name, sysname, ProcedureName> -- Add the parameters for the stored procedure here<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>  这些替换字符串标记只是为了编辑器指定模板参数的值“面板 替换用的。

    点击sql server 的查询--->指定模板参数的值(快捷键ctrl+shift+m)。

    弹出如下窗口:

    这个窗口正是通过存储过程模板的特别标记字段。即上图以标记的对应关系寻找自定义字段的。

    如果删掉<Procedure_Name, sysname, ProcedureName> 

    然后再重新打开“指定模板参数的值”面板如下图:

    创建存储过程

    你会发现少了<Procedure_Name, sysname, ProcedureName> 对应的面板参数设置。

    现在明白<Procedure_Name, sysname, ProcedureName>等文本的意思了吧。

    他只是为“指定模板参数的值”面板服务的。当你在“指定模板参数的值”面板设置了参数,存储过程将会把上面的模板如<Procedure_Name, sysname, ProcedureName>

    自动替换成你设置的参数。如果你不使用这个面板,那你应该删除这些标记(<Procedure_Name, sysname, ProcedureName>等),替换成你想要的参数。

    下面是我通过模板设置生成的存储过程:

    上面的最终代码才是我们最终的存储过程代码。

    如果你不使用 “指定模板参数的值”面板设置参数,那么你应该手动替换删除上面的替换字符串标记

    最终的存储过程  样式如下:


     

    表红色框的才是一个存储过程改用的,其他字段需要我们去填写编辑

    存储过程  创建

    直接官网教程

    在对象资源管理器中创建过程

    1. 在 “对象资源管理器”中,连接到 数据库引擎 的实例,然后展开该实例。

    2. 依次展开 “数据库”、 AdventureWorks2012 数据库和 “可编程性”

    3. 右键单击“存储过程”,再单击“新建存储过程”。

    4. 在 “查询” 菜单上,单击 “指定模板参数的值”

    5. 在 “指定模板参数的值” 对话框中,输入下列所示的参数值。

      参数ReplTest1
      作者您的姓名
      创建日期今天的日期
      Description返回雇员数据。
      Procedure_nameHumanResources.uspGetEmployeesTest
      @Param1@LastName
      @Datatype_For_Param1nvarchar(50)
      Default_Value_For_Param1NULL
      @Param2@FirstName
      @Datatype_For_Param2nvarchar(50)
      Default_Value_For_Param2NULL
    6. 单击“确定” 。

    7. 在 “查询编辑器”中,使用以下语句替换 SELECT 语句:

      SQL复制
      SELECT FirstName, LastName, Department  
      FROM HumanResources.vEmployeeDepartmentHistory  
      WHERE FirstName = @FirstName AND LastName = @LastName  
          AND EndDate IS NULL;  
      
    8. 若要测试语法,请在 “查询” 菜单上,单击 “分析”。 如果返回错误消息,则请将这些语句与上述信息进行比较,并视需要进行更正。

    9. 若要创建该过程,请在 “查询” 菜单上单击 “执行”。 该过程作为数据库中的对象创建。

    10. 若要查看在对象资源管理器中列出的过程,请右键单击“存储过程”,然后选择“刷新”。

    11. 若要运行该过程,请在对象资源管理器中右键单击存储过程名称 HumanResources.uspGetEmployeesTest,然后选择“执行存储过程”。

    12. 在“执行过程”窗口中,输入 Margheim 作为参数 @LastName 的值,并输入值 Diane 作为参数 @FirstName 的值。

    下图是我创建的存储过程:




    展开全文
  • 在mysql中创建存储过程与函数

    千次阅读 2018-12-21 17:14:14
    1、创建存储过程和函数  存储过程是一条或者多条SQL语句的集合,相当于批处理文件,但是作用不仅仅限于批处理。使用存储过程将简化操作,减少冗余的步骤,同时还可减少操作过程的失误,提高效率。 (1)创建存储...

    1、创建存储过程和函数

        存储过程是一条或者多条SQL语句的集合,相当于批处理文件,但是作用不仅仅限于批处理。使用存储过程将简化操作,减少冗余的步骤,同时还可减少操作过程的失误,提高效率。

    (1)创建存储过程

             创建存储过程是通过”CREATE PROCEDURE”语句来创建,语法格式为:

    CREATE PROCEDURE sp_name ([proc_parameter])
    [characteristics…] routine_body

    各选项说明:

             CREATE PROCEDURE:创件存储过程的关键字

             sp_name:存储过程名称

             proc_parameter:指定存储过程的参数列表,列表形式为:[ IN | OUT | INOUT ] param_name type

             characteristics:用于指定存储过程的特性

             routine_body:mysql sql语句内容,使用BEGINE…END来表示SQL代码的开始和结束。

    # 创建存储过程前先将sql语句结束符改为//,以防止和默认的结束符冲突, 
    mysql> delimiter //
    mysql> create procedure proc()
        -> begin
        -> select * from course;
        -> end //
    Query OK, 0 rows affected (0.08 sec)
    # 存储过程创建完成后将结束符改为默认的结束符
    mysql> delimiter ;
    # 调用创建的存储过程
    mysql> call proc();
    +----+-------------+------------+
    | id | course_name | teacher_id |
    +----+-------------+------------+
    |  1 | math        |          3 |
    |  2 | english     |          2 |

    (2)创建存储函数

             函数与存储过程最大的区别就是函数调用有返回值,调用存储过程用call语句,而调用函数就直接引用函数名+参数即可,创建存储函数使用”CREATE FUNCTION”语句来创建,语法格式为:

    CREATE FUNCTION func_name ( param_name type )
    RESTURNS type
    [characteristic……] routine_body

    主要参数说明:

             Param_name:参数名称

             Type:参数类型

             RETURNS type:函数返回数据的类型

             Characteristic:指定存储函数的特性

    mysql> delimiter //
    # 创建一个函数
    mysql> create function stubak_update(param1 int)
        -> returns int
        -> begin
        -> update student_bak set gender=1 where sid=param1;
        -> select count(*) into @a from student_bak where sid>param1;
        -> return @a;
        -> end;
        -> //
    mysql> delimiter ;
    # 调用函数,并传入一个参数
    mysql> select stubak_update(1); 
    +------------------+
    | stubak_update(1) |
    +------------------+
    |                7 |
    +------------------+

    2、存储过程中使用变量

    (1)定义变量

             在存储过程中通过DECLARE语句定义变量,定义变量的格式如下:

             DECLARE var_name[,varname]… date_type [DEFAULT value];

             选项说明:

                       var_name:局部变量名称

                       DEFAULT value:用于给变量提供一个默认值

                       Type:用于指定变量的默认类型

    (2)为变量赋值

             声明后的变量可以通过select … into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch … into var_list赋值,使用set赋值的方式如下:

      SET var_name = expr [, var_name = expr] ……;
    # mysql存储过程中使用变量
    mysql> delimiter //
    mysql> create procedure sp1(v_sid int)
        -> begin
        -> declare xname varchar(10) default 'dayi123';
        -> declare xsex int;
        -> select sname,gender into xname,xsex from student_bak where sid=v_sid;
        -> select xname,xsex; 
        -> end;
        -> //
    Query OK, 0 rows affected (0.00 sec)
    mysql> delimiter ;
    mysql> call sp1(1);
    +--------+------+
    | xname  | xsex |
    +--------+------+
    | Andrew |    1 |
    +--------+------+    
     

    3、定义条件和处理程序

             定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题是应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。

    (1)定义条件

             定义条件使用DECLARE语句,语法格式如下

      DECLARE condition_name CONDITION FOR [condition_type]
      [condition_type]:
      SQLSTATE [VALUE] sqlstate_value | mysql_error_code

    各选项说明:

             Condition_name:表示条件名称

             Condition_type:表示条件类型

             sqlstate_value | mysql_error_code:mysql中的错误,sqlstate_value为长度为5的字符串类型错误代码,mysql_error_code为数值类型的错误代码

    (2)定义处理程序

             定义处理程序时,使用DECLARE语句实现:

     DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement handler_type:
              CONTINUT | EXIT | UNDO
      Condition_value:
              SQLSTATE [VALUE] sqlstate_value | condition_name
      | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

    各选项说明:

             Handler_type:错误处理方式,continue表示遇到错误不处理,exit为退出,undo为撤回之前操作。

             Condition_value表示错误类型,有以下的取值

                       SQLSTATE [VALUE] sqlstate_value:包含5个字符的字符串错误值

                       condition_name:declare condition定义错误的错误条件名称

                       SQLWARNING:匹配所有以01开头SQLSTATE错误代码

                       NOT FOUND:匹配所有以02开头的SQLSTATE错误代码

                       SQLEXCEPTION:匹配所有没有被SQLWARENING或NOT FOUNT捕获的SQLSTATE的错误代码

                       mysql_error_code:匹配数值类型的错误代码

             sp_statement:在遇到定义的错误时,需要执行的存储过程或函数。

    当condition发生但没有声明handler时,则存储过程和函数依照如下规则处理:

             发生SQLEXCEPTION错误,则执行exit退出

             发生SQLWARNING警告,则执行contine继续执行

             发生NOT FOUND情况,则执行continue继续执行

    # 创建一个存储过程并定义处理程序当错误吗为23000时跳过继续执行
    # 创建一张用于测试的表
    mysql> delimiter //
    mysql> create procedure handlerdemo()
        -> begin
        -> declare continue handler for sqlstate '23000' set @x2=1;
        -> set @x=1;
        -> insert into t values(1);
        -> set @x=2;
        -> insert into t values(1);
        -> set @x=3;
        -> end;
        -> //
    mysql> delimiter ;
    # 调用存储过程
    mysql> CALL handlerdemo();
    # 插看变量的值
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |    3 |
    +------+

    4、存储过程中的流程控制语句

        MySQL支持if,case,iterate,leave,loop,while,repeat语句作为存储过程和函数中的流程控制语句,另外return语句也是函数中的特定流程控制语句。

    (1)case语句

             Case语句有两种语句格式分别如下:

             格式一:

     CASE case_value
              WHEN when_value THEN statement_list
              [WHEN when_value THEN statement_list]……
              [ELSE statement_list]
      END CASE

             格式二:

     CASH 
              WHEN search_condition THEN statement_list
              [WHEN search_condition THEN statement_list]……
              [ELSE statement_list]
      END CASE

             创建存储过程时使用case语句

    mysql> delimiter //
    mysql> CREATE PROCEDURE exp_case(v_sid int)
        ->   BEGIN
        ->     DECLARE v INT DEFAULT 1;
        ->     select gender into v from student_bak where sid=v_sid;
        ->     CASE 
        ->       WHEN v=0 THEN update student_bak set gender=1 where sid=v_sid;
        ->       WHEN v=1 THEN update student_bak set gender=0 where sid=v_sid;
        ->       ELSE
        ->           update student_bak set gender=-1 where sid=v_sid;
        ->     END CASE;
        ->   END;
        -> //
    mysql> delimiter ;

    (2)if语句

             If语句包含多个条件判断,根据条件判断的结果为TRUE或FALSE执行相应的语句,语法格式为:

    IF search_condition THEN statement_List
      [ELSEIF search_condition THEN statement_list] …
      [ELSE statement_list]
    END IF

             创建一个函数,使用if语句判断两个数的大小

    mysql> CREATE FUNCTION exp_if(n INT, m INT)
        ->   RETURNS VARCHAR(20)
        ->   BEGIN
        ->     DECLARE s VARCHAR(20);
        ->     IF n > m THEN SET s = '>';
        ->     ELSEIF n = m THEN SET s = '=';
        ->     ELSE SET s = '<';
        ->     END IF;
        ->     SET s = CONCAT(n, ' ', s, ' ', m);
        ->     RETURN s;
    ->   END //
    mysql> DELIMITER ;
    mysql> select exp_if(1,2);
    +-------------+
    | exp_if(1,2) |
    +-------------+
    | 1 < 2       |
    +-------------+

             If语句也可在创建存储过程及函数时嵌套使用,

    mysql> CREATE FUNCTION exp_if02 (n INT, m INT)
        ->   RETURNS VARCHAR(50)
        ->   BEGIN
        ->     DECLARE s VARCHAR(50);
        ->     IF n = m THEN SET s = 'equals';
        ->     ELSE
        ->       IF n > m THEN SET s = 'greater';
        ->       ELSE SET s = 'less';
        ->       END IF;
        ->       SET s = CONCAT('is ', s, ' than');
        ->     END IF;
        ->     SET s = CONCAT(n, ' ', s, ' ', m, '.');
        ->     RETURN s;
        ->   END //
    mysql> delimiter ;

    (3)iterate语句

             Iterate语句仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环,格式如下:

    ITERATE label

             Label表示自定义的标签名

    (4)leave语句

             Leave语句表明退出指定标签的流程控制语句块,通常会用在begin…end,以及loop,repeat,while的循环语句中,格式如下:

    LEAVE label

             Label表示要退出的标签名

    (5)LOOP语句

             Loop语句是存储过程或函数中表达循环执行的一种方式,LOOP内的语句一直重复执行直到循环被退出,跳出循环时使用LEVAVE子句,LOOP语句的基本格式如下:

    [begin_label:] LOOP
      Statement_list
    END LOOP [ END_LABEL ]

             创建存储过程使用loop循环语句实现变量的自增

    mysql> DELIMITER //
    # 创建存储过程
    mysql> CREATE PROCEDURE exp_loop(p1 INT)
        -> BEGIN
        ->   label1: LOOP
        ->     SET p1 = p1 + 1;
        ->     IF p1 < 10 THEN
        ->       ITERATE label1;
        ->     END IF;
        ->     LEAVE label1;
        ->   END LOOP label1;
        ->   SET @x = p1;
        -> END //
    mysql> DELIMITER ;
    # 调用存储过程
    mysql> call exp_loop(1);
    # 查看执行后变量的值
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |   10 |
    +------+

    (6)repeat语句

             Repeat语句用于创建一个带条件判断的循环过程,每次语句执行完毕之后,会对条件表达式进行判断,如果表达式为真,则循环结束;否则重复执行循环中的语句。

    [repeat_label:] REPEAT
      Statement_List
    UNTIL search_condition
    END REPEAT [repeat_label]

             Repeat_label为REPEAT语句的标注名称,该参数可省略

    mysql> delimiter //
    # 创建基于repeat循环的存储过程
    mysql> CREATE PROCEDURE exp_rep(p1 INT)
        -> BEGIN
        ->   SET @x = 0;
        ->   REPEAT
        ->     SET @x = @x + 1;
        ->   UNTIL @x > p1 END REPEAT;
        -> END
        -> //
    mysql> delimiter ;
    # 调用存储过程,并查看变量@x的最终值
    mysql> call exp_rep(100);
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |  101 |
    +------+

    (7)while语句

             While语句也是用于创建一个带条件判断的存储过程,与REPEAT不同的是while在执行语句时先对指定的表达式进行判断,如果为真,则执行循环内的语句,否则退出,语句格式如下:

    [while_label:] WHILE expr_condition DO
      Statement_list
    END WHILE [while_label]

             创建基于while循环的存储过程,相对于repeat循环是先判断在执行。

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE exp_whi(p1 INT)
        -> BEGIN
        ->   SET @b = 0;
        ->   WHILE @b < p1 DO
        ->     SET @b = @b + 1;
        ->   END WHILE;
        -> END;
        -> //
    mysql> DELIMITER ;
    mysql> call exp_whi(100);
    mysql> select @b;
    +------+
    | @b   |
    +------+
    |  100 |
    +------+

    5、游标

             Mysql查询语句可能返回多条记录,如果数据量大则需要在存储过程中和储存函数中使用游标来逐条读取查询结果中的记录。应用程序可以根据需要滚动或浏览其中的数据。

    (1)声明游标

             游标必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明。声明游标的语句如下:

    DECLARE cursor_name CURSOR FOR select_statement

    (2)打开游标

             打开游标的语句如下:

    OPEN cursor_name

    (3)使用游标

             使用游标语句如下

    FETCH cursor_name INTO var_name [,var_name] ……

             var_name:表示将光标中的SELECT 语句查询出来的信息存入该参数中,var_name必须在声明光标之前就定义好。

             使用游标时,数据集中的字段需要和INTO语句中定义的变量一一对应,数据集中的数据都fetch完之后,则返回NOT FOUND。

    (4)关闭游标

             关闭游标语句如下:

    CLOSE cursor_name 

    (5)游标的使用

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE exp_cur()
        -> BEGIN
        ->   DECLARE done INT DEFAULT FALSE;
        ->   DECLARE a CHAR(16);
        ->   DECLARE b, c INT;
        ->   DECLARE cur1 CURSOR FOR SELECT sname,dept_id FROM student;
        ->   DECLARE cur2 CURSOR FOR SELECT id FROM course;
        ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        ->   OPEN cur1;
        ->   OPEN cur2;
        ->   read_loop: LOOP
        ->     FETCH cur1 INTO a, b;
        ->     FETCH cur2 INTO c;
        ->     IF done THEN
        ->       LEAVE read_loop;
        ->     END IF;
        ->     IF b = c THEN
        ->       INSERT INTO test VALUES (a,b);
        ->     ELSE
        ->       INSERT INTO test VALUES (a,c);
        ->     END IF;
        ->   END LOOP;
        ->   CLOSE cur1;
        ->   CLOSE cur2;
    -> END //
    mysql> DELIMITER ;

    6、查看创建的存储过程和函数

             在创建和存储过程和函数后可以通过”show status”语句或”show create”语句来查看创建的存储过程和函数,也可直接从系统的”information_schema”数据库中查询。

             使用”show status”语句查看存储过程和函数状态语句结构如下:

    SHOW {PROCEDURE | FUNCTION} STATUS [LIKE ‘pattern’]
    # 查看创建的所有以”exp”开头的存储过程
    
    mysql> show procedure status like 'exp%' \G
    *************************** 1. row ***************************
                      Db: course
                    Name: exp_case
                    Type: PROCEDURE
                 Definer: root@localhost
    ……

             使用”show create”查看存储和函数状态语句如下:

    SHOW CREATE {PROCEDURE | FUNCTION} sp_name

             从”information_schema.routines”表中查看存储过程和函数信息的语句结构如下:

    Select * from information_schema.routines where routing_name=’sp_name’;

    7、修改创建的存储过程和函数

             存储过程及函数穿件完成后可以通过”alter”语句来修改存储过程或函数的特性,修改的语句如下:

    ALTER {PROCEDURE|FUNCTION} sp_name [characteristic …]

    Characteristic参数用于指定存储函数的特性,取值有:

             CONTAINS SQL:表示子程序包含SQL语句,但不包含读或写数据的语句。

             NO SQL:表示子程序中不包含SQL语句

             READS SQL DATA:表示子程序中包含读数据的语句

             MODIFIES SQL DATA:表示子程序中包含写数据的语句

             SQL SECURITY {DEFINER|INVOKER}:指明谁有权限来执行

             DEFINER:表示只有定义者自己才能够执行

             INVOKER:表名调用者可以执行

             COMMENT ‘string’:表示注释信息

    8、删除存储过程及存储函数

             删除存储过程及存储函数使用”drop”语句来删除,语法格式如下:

    DROP {PROCEDURE|FUNCTION} [IF EXISTS] sp_name

             删除一个创建的存储过程:

    mysql> drop procedure exp_whi;
    Query OK, 0 rows affected (0.00 sec)

    9、mysql触发器

             触发器是一个特殊的存储过程,触发器的作用是当表上有对应SQL语句发生时,则触发执行。

    (1)创建触发器

             创建触发器的语句如下:

    CREATE
      [DEFINER = {user | CURRENT_USER }]
      TRIGGER trigger_name
      Trigger_time trigger_event
      ON tbl_name FOR EACH ROW
      [trigger_order]
      trigger_body

    各选项说明:

             Definer:用来指定trigger的安全环境

             trigger_name:标识触发器的名称

             Trigger_time:指定触发器的执行时间,BEFORE代表在数据修改前执行,AFTER代表在修改后执行。

             Trigger_event:指定触发该触发器的具体事件,INSERT当新的一行数据插入表中时触发,UPDATE当表的一行数据被修改时触发,DELETE当表的一行数据被删除时触发,当执行insert into … on duplicate key update语句时,当碰到重复行执行update时,则触发update下的触发器

             tbl_name:标识建立触发器的表名

             Trigger_body:表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字段,OLD.col_name表示行数据被修改或删除之前的字段数据,NEW.col_name表示行数据被插入或修改之后的字段数据

    # 先创建一张表用于在触发触发器时备份要修改的数据
    mysql> create table student_back(sid int,old_sname varchar(12),sname varchar(12),old_gender int,gender int,update_time time)//
    mysql> delimiter //
    # 创建触发器
    mysql> create trigger update_trigger
        -> after update
        -> on student for each row
        -> begin
        -> insert into student_back values(old.sid,old.sname,new.sname,old.gender,new.gender,now());
        -> end;
        -> //
    mysql> delimiter ;
    mysql> update student set gender=1 where sid=1;
    # 更新数据后查看备份的数据
    mysql> select * from student_back;
    +------+-----------+--------+------------+--------+-------------+
    | sid  | old_sname | sname  | old_gender | gender | update_time |       
    +------+-----------+--------+------------+--------+-------------+
    |    1 | Andrew    | Andrew |          0 |      1 | 19:12:29    |
    +------+-----------+--------+------------+--------+-------------+

    (2)查看触发器

             触发器创建好后可以通过”show triggers”命令查看,也可在”triggers”表中查看触发器信息。

             通过命令查看:show triggers;

             通过表查看语句:select * from information_schema.triggers where trigger_name=' trigger_name ' \G

    (3)删除触发器

             触发器可以通过”drop trigger”语句来删除,删除触发器的语句格式为:

    DROP TRIGGER [schema_name.] trigger_name

             schema_name表示数据库的名称为可选参数

    # 删除触发器
    mysql> drop trigger update_trigger;                                                             
    Query OK, 0 rows affected (0.00 sec)

     

    展开全文
  • DB2创建存储过程

    千次阅读 2020-04-26 17:55:47
    声明一个存储过程:CREATE PROCEDURE 存储过程名(IN 输入变量名 输入变量类型,OUT 输出变量名 输出变量类型) 存储过程名后面是存储过程属性列表,常用的有:LANGUAGE SQL、MODIFIES SQL DATA、RESULT SETS 1(返回结果...

    DB2中创建存储过程:

    创建存储过程: CREATE OR REPLACE PROCEDURE/CREATE PROCEDURE 存储过程名(IN 输入变量名 输入变量类型 | OUT 输出变量名 输出变量类型)

    存储过程名后面是存储过程属性列表,常用的有:LANGUAGE SQL、MODIFIES SQL DATA、RESULT SETS 1(返回结果集个数)

    存储过程主体以begin开始,以end结束

    调用存储过程:CALL 存储过程名(参数1,参数2,参数n)

    刚开始接触存储过程,了解下存储过程的语法,存储过程主体的逻辑能用SQL写出来,存储过程就好创建了

    CREATE PROCEDURE TDW.P_XXXX_DD(IN parameter1 data_type1,parameter2 data_type2...) --指定存储过程输入参数的个数、数据类型
    SPECIFIC  TEST_CREATE_PROCEDURE --给存储过程指定别名
    LANGUAGE SQL --指定用纯SQL编写存储过程
    NOT DETERMINISTIC --表示存储过程是非动态的
    EXTERNAL ACTION  --表示存储过程可执行一些不通过数据库管理器管而改变数据库状态的活动 ;存储过程的EXTERNAL ACTION or NO EXTERNAL ACTION 默认是EXTERNAL ACTION
    MODIFIES SQL DATA  --表示存储过程可以执行任何SQL语句
    
    BEGIN  --例如存储过程的主体是 对数据库中的数据按要求加工一下insert到另一张表中
    delete from TDW.P_XXXX_DD where DT_DAY_ID between parameter1 and parameter2;
    INSERT INTO TDW.P_XXXX_DD (DT_DAY_ID, ORG_COMPANY_ID, ORDER_QTY, ...)
    SELECT c.DT_DAY_ID, b.ORG_COMPANY_ID, a.ORDER_QTY, ... FROM TDW.DW_XX_MX a 
    	left join TDW.DW_XX_TEMP b on a.ID = b.ID 
    	inner join 
    	(select ORDER_CD, DT_DAY_ID , sum()... from TDW.DW_XX_ORDER where ORDER_QTY <> 0 group by ORDER_CD,DT_DAY_ID,...) c on a.XXA = c.XXC
    	where c.DT_DAY_ID between parameter1 and parameter2
    	group by c.DT_ORDERDAY_ID,b.ID,...;
    
    END
    
    

    存储过程语法参数说明:

    • DETERMINISTIC or NOT DETERMINISTIC :表示存储过程是动态或者非动态的。动态的返回的值是不确定的;非动态的存储过程每次执行返回的值是相同的。
    • INHERIT SPECIAL REGISTERS :表示继承专用寄存器。
    • SPECIFIC specific_name 特定名称 别名,这个特定名称用于dorp存储过程,或者给存储过程添加注释用;但不能调用存储过程。如果不指定,则数据库会自动生成一个yymmddhhmmsshhn时间戳(例如SQL200318161629437)名字。
    • EXTERNAL ACTION or NO EXTERNAL ACTION :表示存储过程是否不通过数据库管理器管执行改变数据库状态的活动;默认是 EXTERNAL ACTION;如果指定为 NO EXTERNAL ACTION,则数据库会确定最最佳优化方案。
    • DYNAMIC RESULT SETS INTEGER:指定存储过程返回结果的最大数量;存储过程中虽然没有return语句,但是却能返回结果集
    • CONTAINS SQL: 指定存储过程中的SQL访问级别,这个表示存储过程可以执行中,既不可读取SQL数据,也不可修改SQL的数据。
    • READS SQL DATA: 表示存储过程可以执行中,可读取SQL,但不可修改SQL的数据。
    • MODIFIES SQL DATA: 表示存储过程可以执行任何SQL语句;可以对数据库中的数据进行增加、删除和修改。
    • CALLED ON NULL INPUT:表示可以调用存储过程而不管任何的输入参数是否为 NULL,并且任何参数可以返回一个NULL或者非空值。检验参数是否为NULL是在过程中进行的。
    • LANGUAGE SQL:指定程序的主体用的是SQL语言
    • 存储过程变量的定义:变量使用前必须先定义,方法为:DECLARE 变量名 变量的数据类型 (default 默认值)
      DECLARE Var1 INTEGER DEFAULT 0;
      DECLARE Var2  char(8);
    

    存储过程主体中常用的逻辑表达式:

    1.if 表达式:

     if 条件1 then
          结果1
        elseif 条件2 then
          结果2
        else
          结果3
        end if;
    

    2.case表达式:

        case 变量名 when
               变量值1 then
               . . .
        when
               变量值2 then
               . . .
        else
               . . .
        end case;
    

    or

        case when
               变量名=变量值1 then
               . . .
        when
               变量名=变量值2 then
               . . .
        else
               . . .
        end case;
    

    3.for 表达式:

        for 循环名 as
           游标名或select 表达式
        do
           sql表达式
        end for;
    
    

    4.while表达式:

        while 条件表达式 do
               逻辑体;
         end while

    5.LOOP表达式:

       LOOP... END LOOP

    存储过程中关于游标:
    定义游标:DECLARE 游标名 CURSOR FOR Select 语句;
    打开游标: OPEN 游标名;
    取值:FETCH 游标名 INTO 变量列表
    注:游标的申明如果放在中间段,要用begin。。。end; 段分割标志分割开;

    存储过程中建立临时表:
    DECLARE GLOBAL TEMPORARY TABLE TABLE_NAME --指定临时表的名称.
    AS (FULLSELECT) DEFINITION ONLY --指定临时表的定义
    EXCLUDING IDENTITY COLUMN ATTRIBUTES --指定不是从源表定义中复制的恒等列.
    ON COMMIT DELETE ROWS --指定如果沒有打开WITH GOLD光标,则刪除表的所有行
    NOT LOGGED IN 临时表空间名 with replace; --指定不对表的改变进行记录,With replace选项会隐式的自动删除该临时表

    DB2存储过程中的几个全局变量:
    ROW_COUNT --影响行数
    RETURN_STATUS --返回状态
    SQLSTATE—SQL --返回错误代码 注:使用前必先定义 declare sqlstate char(5); declare state char(5);

    DECLARE not_found CONDITION FOR SQLSTATE '53089'; --储存过程指定的宿主变量参数的个数不等于预期的参数个数
    DECLARE not_found CONDITION FOR SQLSTATE '02000'; --没有找到满足SQL语句的行
    DECLARE EXIT HANDLER FOR NOT FOUND SET  Salary = 6666;
    

    抽取、提交存储过程:

    db2 "get routine into 文件名 from procedure 存储过程名" --抽取存储过程
    db2 "put routine from 文件名" --提交存储过程

    展开全文
  • MySQL创建存储过程

    千次阅读 2016-04-05 10:54:26
    mysql存储过程详解 1. 存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程...一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一

    mysql存储过程详解

    1.     存储过程简介

     

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

    一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

    存储过程通常有以下优点:

    (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

    (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

    (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

    (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

    (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

     

    2.     关于MySQL的存储过程

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

    3.     MySQL存储过程的创建

     

    (1).格式

    MySQL存储过程创建的格式:CREATE PROCEDURE过程名 ([过程参数[,...]])
    [
    特性 ...]过程体

    这里先举个例子:
       

    1. mysql> DELIMITER // 
    2. mysql> CREATE PROCEDURE proc1(OUT int) 
    3.     -> BEGIN 
    4.     -> SELECT COUNT(*) INTO FROM user; 
    5.     -> END 
    6.     -> // 
    7. mysql> DELIMITER 
     
    
    注:

    1)这里需要注意的是DELIMITER //DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

    2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。

    3)过程体的开始与结束使用BEGINEND进行标识。

    这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。

     

    (2).声明分割符

     

    其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQLAdministrator管理工具时,可以直接创建,不再需要声明。

     

    (3).参数

    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

    CREATEPROCEDURE([[IN |OUT |INOUT ]参数名 数据类形...])

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

    OUT输出参数:该值可在存储过程内部被改变,并可返回

    INOUT输入输出参数:调用时指定,并且可被改变和返回

    .IN参数例子

    创建:

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE demo_in_parameter(IN p_in int) 
    3. -> BEGIN  
    4. -> SELECT p_in;  
    5. -> SET p_in=2;  
    6. -> SELECT p_in;  
    7. -> END;  
    8. -> //  
    9. mysql DELIMITER 


    执行结果
    :

    1. mysql SET @p_in=1; 
    2. mysql CALL demo_in_parameter(@p_in); 
    3. +------+ 
    4. p_in 
    5. +------+ 
    6.     
    7. +------+ 
    8.  
    9. +------+ 
    10. p_in 
    11. +------+ 
    12.     
    13. +------+ 
    14.  
    15. mysql> SELECT @p_in; 
    16. +-------+ 
    17. @p_in 
    18. +-------+ 
    19.     
    20. +-------+ 


    以上可以看出,
    p_in虽然在存储过程中被修改,但并不影响@p_id的值

     

    .OUT参数例子

    创建:

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE demo_out_parameter(OUT p_out int) 
    3. -> BEGIN 
    4. -> SELECT p_out; 
    5. -> SET p_out=2; 
    6. -> SELECT p_out; 
    7. -> END; 
    8. -> //  
    9. mysql DELIMITER 


    执行结果
    :

    1. mysql SET @p_out=1; 
    2. mysql CALL sp_demo_out_parameter(@p_out); 
    3. +-------+ 
    4. p_out  
    5. +-------+ 
    6. NULL   
    7. +-------+ 
    8.  
    9. +-------+ 
    10. p_out 
    11. +-------+ 
    12.      
    13. +-------+ 
    14.  
    15. mysql> SELECT @p_out; 
    16. +-------+ 
    17. p_out 
    18. +-------+ 
    19.     
    20. +-------+ 


    .INOUT参数例子

    创建:

    1. mysql DELIMITER //  
    2. mysql CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)  
    3. -> BEGIN 
    4. -> SELECT p_inout; 
    5. -> SET p_inout=2; 
    6. -> SELECT p_inout;  
    7. -> END; 
    8. -> //  
    9. mysql DELIMITER 

     

     

    执行结果 :
    1. mysql SET @p_inout=1; 
    2. mysql CALL demo_inout_parameter(@p_inout) 
    3. +---------+  
    4. p_inout 
    5. +---------+  
    6.       
    7. +---------+  
    8.  
    9. +---------+  
    10. p_inout  
    11. +---------+  
    12.       
    13. +---------+  
    14.  
    15. mysql SELECT @p_inout; 
    16. +----------+  
    17. @p_inout  
    18. +----------+  
    19.        
    20. +----------+ 

    (4).变量

    .变量定义

    DECLARE variable_name[,variable_name...] datatype [DEFAULT value];

    其中,datatypeMySQL的数据类型,如:int, float, date,varchar(length)

    例如:

    1. DECLARE l_int int unsigned default 4000000; 
    2. DECLARE l_numeric number(8,2) DEFAULT 9.95; 
    3. DECLARE l_date date DEFAULT '1999-12-31'; 
    4. DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59'; 
    5. DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';  

     

     

    .变量赋值

     SET变量名 =表达式值 [,variable_name = expression...]

     

    .用户变量

     

    .MySQL客户端使用用户变量

    1. mysql SELECT 'Hello World' into @x; 
    2. mysql SELECT @x; 
    3. +-------------+ 
    4.   @x        
    5. +-------------+ 
    6. Hello World 
    7. +-------------+ 
    8. mysql SET @y='Goodbye Cruel World'; 
    9. mysql SELECT @y; 
    10. +---------------------+ 
    11.     @y              
    12. +---------------------+ 
    13. Goodbye Cruel World 
    14. +---------------------+ 
    15.  
    16. mysql SET @z=1+2+3; 
    17. mysql SELECT @z; 
    18. +------+ 
    19. @z   
    20. +------+ 
    21.    
    22. +------+ 

    ⅱ. 在存储过程中使用用户变量

    1. mysql CREATE PROCEDURE GreetWorld( SELECT CONCAT(@greeting,' World'); 
    2. mysql SET @greeting='Hello'; 
    3. mysql CALL GreetWorld( ); 
    4. +----------------------------+ 
    5. CONCAT(@greeting,' World') 
    6. +----------------------------+ 
    7.  Hello World               
    8. +----------------------------+ 

     

    . 在存储过程间传递全局范围的用户变量
    1. mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1'; 
    2. mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc); 
    3. mysql> CALL p1( ); 
    4. mysql> CALL p2( ); 
    5. +-----------------------------------------------+ 
    6. CONCAT('Last procedure was ',@last_proc |  
    7. +-----------------------------------------------+ 
    8. Last procedure was p1                         
    9. +-----------------------------------------------+ 

     

     

    注意:

    用户变量名一般以@开头

    滥用用户变量会导致程序难以理解及管理

     

    (5).注释

     

    MySQL存储过程可使用两种风格的注释

    双模杠:--

    该风格一般用于单行注释

    c风格:一般用于多行注释

    例如:

     

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc1 --name存储过程名 
    3. -> (IN parameter1 INTEGER)  
    4. -> BEGIN  
    5. -> DECLARE variable1 CHAR(10);  
    6. -> IF parameter1 17 THEN  
    7. -> SET variable1 'birds';  
    8. -> ELSE 
    9. -> SET variable1 'beasts';  
    10. -> END IF;  
    11. -> INSERT INTO table1 VALUES (variable1); 
    12. -> END  
    13. -> //  
    14. mysql DELIMITER 

     

    4.     MySQL存储过程的调用

    call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

    5.     MySQL存储过程的查询

    我们像知道一个数据库下面有那些表,我们一般采用showtables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。

    我们可以用

    select namefrom mysql.proc where db=’数据库名’;

    或者

    selectroutine_name from information_schema.routines whereroutine_schema='数据库名';

    或者

    show procedurestatus where db='数据库';

    进行查询。

    如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe表名进行查看呢?

    答案是:我们可以查看存储过程的详细,但是需要用另一种方法:

    SHOW CREATEPROCEDURE数据库.存储过程名;

    就可以查看当前存储过程的详细。

     

    6.     MySQL存储过程的修改

    ALTER PROCEDURE

    更改用CREATE PROCEDURE建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

     

    7.     MySQL存储过程的删除

    删除一个存储过程比较简单,和删除表一样:

    DROPPROCEDURE

    MySQL的表格中删除一个或多个存储过程。

     

    8.     MySQL存储过程的控制语句

    (1).变量作用域

    内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
    过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
    给会话变量来保存其值。

     

     

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc3() 
    3.      -> begin 
    4.      -> declare x1 varchar(5) default 'outer'; 
    5.      -> begin 
    6.      -> declare x1 varchar(5) default 'inner'; 
    7.      -> select x1; 
    8.      -> end; 
    9.      -> select x1; 
    10.      -> end; 
    11.      -> // 
    12. mysql DELIMITER 

     

     (2).条件语句

    . if-then-else语句

     

     

     

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc2(IN parameter int) 
    3.      -> begin 
    4.      -> declare var int; 
    5.      -> set var=parameter+1; 
    6.      -> if var=0 then 
    7.      -> insert into values(17); 
    8.      -> end if; 
    9.      -> if parameter=0 then 
    10.      -> update set s1=s1+1; 
    11.      -> else 
    12.      -> update set s1=s1+2; 
    13.      -> end if; 
    14.      -> end; 
    15.      -> // 
    16. mysql DELIMITER 


    . case语句:

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc3 (in parameter int) 
    3.      -> begin 
    4.      -> declare var int; 
    5.      -> set var=parameter+1; 
    6.      -> case var 
    7.      -> when then  
    8.      -> insert into values(17); 
    9.      -> when then  
    10.      -> insert into values(18); 
    11.      -> else  
    12.      -> insert into values(19); 
    13.      -> end case; 
    14.      -> end; 
    15.      -> // 
    16. mysql DELIMITER 

     

    (3).循环语句

    . while ···· endwhile

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc4() 
    3.      -> begin 
    4.      -> declare var int; 
    5.      -> set var=0; 
    6.      -> while var<6 do 
    7.      -> insert into values(var); 
    8.      -> set var=var+1; 
    9.      -> end while; 
    10.      -> end; 
    11.      -> // 
    12. mysql DELIMITER 

     

     

    . repeat···· endrepeat

    它在执行操作后检查结果,而while则是执行前进行检查。

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc5 () 
    3.      -> begin  
    4.      -> declare int; 
    5.      -> set v=0; 
    6.      -> repeat 
    7.      -> insert into values(v); 
    8.      -> set v=v+1; 
    9.      -> until v>=5 
    10.      -> end repeat; 
    11.      -> end; 
    12.      -> // 
    13. mysql DELIMITER 

     


    . loop ·····endloop:

    loop循环不需要初始条件,这点和while循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc6 () 
    3.      -> begin 
    4.      -> declare int; 
    5.      -> set v=0; 
    6.      -> LOOP_LABLE:loop 
    7.      -> insert into values(v); 
    8.      -> set v=v+1; 
    9.      -> if >=5 then 
    10.      -> leave LOOP_LABLE; 
    11.      -> end if; 
    12.      -> end loop; 
    13.      -> end; 
    14.      -> // 
    15. mysql DELIMITER 

     

     

    .LABLES标号:

    标号可以用在begin repeat while或者loop语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

     

    (4).ITERATE迭代

    .ITERATE:

    通过引用复合语句的标号,来从新开始复合语句

    1. mysql DELIMITER // 
    2. mysql CREATE PROCEDURE proc10 () 
    3.      -> begin 
    4.      -> declare int; 
    5.      -> set v=0; 
    6.      -> LOOP_LABLE:loop 
    7.      -> if v=3 then  
    8.      -> set v=v+1; 
    9.      -> ITERATE LOOP_LABLE; 
    10.      -> end if; 
    11.      -> insert into values(v); 
    12.      -> set v=v+1; 
    13.      -> if v>=5 then 
    14.      -> leave LOOP_LABLE; 
    15.      -> end if; 
    16.      -> end loop; 
    17.      -> end; 
    18.      -> // 
    19. mysql DELIMITER 

     

     

    9.     MySQL存储过程的基本函数

     

    (1).字符串类

    CHARSET(str) //返回字串字符集
    CONCAT (string2 [,... ])//
    连接字串
    INSTR (string ,substring )//
    返回substring首次在string中出现的位置,不存在返回0
    LCASE (string2 ) //
    转换成小写

    LEFT (string2 ,length )//
    string2中的左边起取length个字符
    LENGTH (string )//string
    长度
    LOAD_FILE (file_name )//
    从文件读取内容
    LOCATE (substring , string[,start_position ] )
    INSTR,但可指定开始位置
    LPAD (string2 ,length ,pad )//
    重复用pad加在string开头,直到字串长度为length
    LTRIM (string2 ) //
    去除前端空格

    REPEAT (string2 ,count )//
    重复count
    REPLACE (str ,search_str,replace_str ) //
    str中用replace_str替换search_str
    RPAD (string2 ,length ,pad) //
    str后用pad补充,直到长度为
    length
    RTRIM (string2 ) //
    去除后端空格

    STRCMP (string1 ,string2 )//
    逐字符比较两字串大小,
    SUBSTRING (str , position [,length ]) //
    strposition开始,length个字符
    ,
    注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
     

     

    1. mysql> select substring('abcd',0,2); 
    2. +-----------------------+ 
    3. substring('abcd',0,2) 
    4. +-----------------------+ 
    5.                       
    6. +-----------------------+ 
    7. row in set (0.00 sec) 
    8.  
    9. mysql> select substring('abcd',1,2); 
    10. +-----------------------+ 
    11. substring('abcd',1,2) 
    12. +-----------------------+ 
    13.     ab                
    14. +-----------------------+ 
    15. row in set (0.02 sec) 

    TRIM([[BOTH|LEADING|TRAILING] [padding]FROM]string2) //去除指定位置的指定字符
    UCASE (string2 )//
    转换成大写
    RIGHT(string2,length)//
    string2最后length个字符
    SPACE(count)//
    生成count个空格

    (2).数学类

    ABS (number2 ) //绝对值
    BIN (decimal_number )//
    十进制转二进制
    CEILING (number2 )//
    向上取整
    CONV(number2,from_base,to_base) //
    进制转换
    FLOOR (number2 )//
    向下取整
    FORMAT (number,decimal_places) //
    保留小数位数
    HEX (DecimalNumber )//
    转十六进制
    注:HEX()中可传入字符串,则返回其ASC-11,如HEX('DEF')返回4142143
    也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回
    19
    LEAST (number , number2 [,..]) //
    求最小值

    MOD (numerator ,denominator )//
    求余
    POWER (number ,power )//
    求指数
    RAND([seed])//
    随机数
    ROUND (number [,decimals ])//
    四舍五入,decimals为小数位数]

    注:返回类型并非均为整数,如:
    (1)
    默认变为整形值

    1. mysql> select round(1.23); 
    2. +-------------+ 
    3. round(1.23) 
    4. +-------------+ 
    5.           
    6. +-------------+ 
    7. row in set (0.00 sec) 
    8.  
    9. mysql> select round(1.56); 
    10. +-------------+ 
    11. round(1.56) 
    12. +-------------+ 
    13.           
    14. +-------------+ 
    15. row in set (0.00 sec) 



    (2)
    可以设定小数位数,返回浮点型数据

    1. mysql> select round(1.567,2); 
    2. +----------------+ 
    3. round(1.567,2) 
    4. +----------------+ 
    5.           1.57 
    6. +----------------+ 
    7. row in set (0.00 sec) 

    SIGN (number2 ) //

     

    (3).日期时间类

    ADDTIME (date2 ,time_interval ) // time_interval 加到 date2
    CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //
    转换时区
    CURRENT_DATE ( ) //
    当前日期
    CURRENT_TIME ( ) //
    当前时间
    CURRENT_TIMESTAMP ( ) //
    当前时间戳
    DATE (datetime ) //
    返回 datetime 的日期部分
    DATE_ADD (date2 , INTERVAL d_value d_type ) //
    date2 中加上日期或时间
    DATE_FORMAT (datetime ,FormatCodes ) //
    使用 formatcodes 格式显示 datetime
    DATE_SUB (date2 , INTERVAL d_value d_type ) //
    date2 上减去一个时间
    DATEDIFF (date1 ,date2 ) //
    两个日期差
    DAY (date ) //
    返回日期的天
    DAYNAME (date ) //
    英文星期
    DAYOFWEEK (date ) //
    星期 (1-7) ,1 为星期天
    DAYOFYEAR (date ) //
    一年中的第几天
    EXTRACT (interval_name FROM date ) //
    date 中提取日期的指定部分
    MAKEDATE (year ,day ) //
    给出年及年中的第几天 , 生成日期串
    MAKETIME (hour ,minute ,second ) //
    生成时间串
    MONTHNAME (date ) //
    英文月份名
    NOW ( ) //
    当前时间
    SEC_TO_TIME (seconds ) //
    秒数转成时间
    STR_TO_DATE (string ,format ) //
    字串转成时间 , format 格式显示
    TIMEDIFF (datetime1 ,datetime2 ) //
    两个时间差
    TIME_TO_SEC (time ) //
    时间转秒数 ]
    WEEK (date_time [,start_of_week ]) //
    第几周
    YEAR (datetime ) //
    年份
    DAYOFMONTH(datetime) //
    月的第几天
    HOUR(datetime) //
    小时
    LAST_DAY(date) //date
    的月的最后日期
    MICROSECOND(datetime) //
    微秒
    MONTH(datetime) //

    MINUTE(datetime) //
    返回符号 , 正负或 0
    SQRT(number2) //
    开平方
    展开全文
  • 创建存储过程的基本代码结构

    千次阅读 2018-08-02 10:55:53
    1.存储过程简介 存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出...2.创建存储过程的基本代码结构 CREATE PROCEDUR...
  • 存储过程(Stored Procedure)是在大型...在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程
  • SQL创建存储过程

    千次阅读 2008-11-18 16:06:00
    您可以使用 Transact-SQL 语句 CREATE PROCEDURE 来创建存储过程创建存储过程前,请考虑下列事项: CREATE PROCEDURE 语句不能与其他 SQL 语句在单个批处理中组合使用。要创建过程,您必须具有数据库的 CREATE ...
  • SQLServer之创建存储过程

    万次阅读 2018-11-01 11:18:45
    创建存储过程注意事项 在 SQL Server、 Azure SQL Database、Azure SQL 数据仓库和并行数据库中创建 Transact-SQL 或公共语言运行时 (CLR) 存储过程,存储过程与其他编程语言中的过程类似。 可以在当前数据库...
  • Oracle创建存储过程实例

    千次阅读 2018-04-24 23:15:05
    认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中...
  • mysql创建存储过程

    千次阅读 2015-10-11 19:54:12
    1 关于food表  food表的结构和记录在我的另外一篇博客中有写,地址为 ... ...2 需要创建存储过程描述 ...需要在food表上创建一个名为food_price_count的存储过程,存储过程有3个参数, 输入参数为price_info1,price_i
  • 图解MySql命令行创建存储过程

    千次阅读 2016-09-02 18:53:35
    创建第一个存储过程; 事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码; 调用一下,成功了; 创建一个带输出参数的存储过程,返回book表的记录数;创建成功; ...
  • MySQL——创建存储过程和函数

    千次阅读 2018-05-22 09:34:00
    简单地说,存储过程就是一条或多条 SQL 语句的集合,可视为批文件,但是其作用不仅限于批处理。...1. 创建存储过程 语法格式: CREATE PROCEDURE SP_name ( [ proc_parameter ] ) [ characteristi...
  • mysql创建存储过程declare 变量时报错

    万次阅读 2014-07-16 16:46:54
    今天创建存储过程时,一直提示在decl
  • MySQL 存储过程创建

    千次阅读 2018-11-26 21:09:52
    一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 优点(为什么要用存储过程?): ①将重复性很高的一些操作,封装到一...
  • 用SQL语句创建存储过程,并执行

    万次阅读 2015-12-29 17:21:00
    创建一个存储过程 里面有个输出参数output create proc multi @num1 int, @num2 int=10 output --output的功能类似于C#中的out修饰参数 as set @num2=@num2*@num1 print @num2 二.执行存储过程 exec multi 5,5...
  • 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.存储过程只在创造时进行编译,以后每次...
  • 使用plsql创建存储过程步骤 1、登录plsql后,在对象框中找到“Procedures”,点击右键,找到新建,如图所示: 2、进入到新建界面,如图所示: 3、最终就进入到存储过程结构中,你要做的就是编写存储...
  • 存储过程:DELIMITER // CREATE PROCEDURE RESET_DEFAULT_SET_PROCEDURE() BEGIN #定义变量 格式:DECLARE 变量名称 类型; DECLARE V_INIT_BUYER_EXIST_TASK_NUM varchar(500); #开始事物 start ...
  • 创建存储过程时,报错了。 [sql]   view plain   copy DROP   PROCEDURE  IF EXISTS GameServerMergePro;  CREATE   PROCEDURE  `GameServerMergePro` ...
  • 查看当前用户下的存储过程: select * from user_procedures; 查看所有用户(注意有查询权限) select * from all_procedures;  oracle存储过程中is和as的区别?  在存储过程(PROCEDURE)和函数(FUNCTION)中没有...
  • 简单创建和删除存储过程

    千次阅读 2018-07-20 11:43:31
    1.创建存储过程的语法 CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)] {AS|IS} [说明部分] BEGIN 可执行部分 [EXCEPTION 错误处理部分] END [过程名]; 其中: 可选关键字...
  • 郁闷了我半天,才发现mysql自作聪明的把;看成是procedure的结束符了,于是procedure便解析失败了。 在声明存储过程之前声明//为结束符 ...以前写存储过程/函数这些都是在windows下写的,才没
  • 但是现在并不希望Mysql这么做,因为存储过程中可能 包含很多分号的语句,所以怎么办了,很简单Mysql给我们提供了 delimiter关键字, delimiter作用就是把;分号替换成指定的符号,比如 //或$$。当再出现 //或$$时,...
  • 存储过程与触发器作用

    千次阅读 2012-10-29 10:55:28
    存储过程与触发器因为在数据库中的作用不同,因为也就没什么性能可比性。 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该...
  • firebird存储过程

    2010-11-04 00:23:46
    因此,如果你使用isql创建存储过程,你必须另外定义其它的符号来代表创建存储过程的结束,通常使用set term语句完成。比如,在创建存储过程之前,使用set term !! ;把!!作为分号来表示存储过程创建的结束,在创建...
  • 这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 558,503
精华内容 223,401
关键字:

创建存储过程的作用