MySql存储过程

MySQL 存储过程

```sql
    CREATE PROCEDURE myprocedure
    (IN para01 INTEGER)
    BEGIN
        DECLARE var01 CHAR(10);
        IF para01 = 17 THEN
            SET var01 = 'birds';
        ELSE
            SET var01 = 'beasts';
        END IF;
        INSERT INTO table1 VALUES(var01);
    END
```

创建实例

```sql
    CREATE PROCEDURE p1         /*声明存储过程*/
    ()                          /*参数列表*/
    SELECT * FROM table_t;      /*主体*/
```

调用存储过程

```sql
    CALL proc01();              
```

特征子句

```sql
    CREATE PROCEDURE p2
    ()
    LANGUAGE SQL                                /*系统默认的,说明主体使用sql语句*/   
    NOT DETERMINISTIC                           
    SQL SECURITY DEFINER
    COMMENT 'AN EXAMPLE PROCEDURE'
    SELECT CURRENT_DATE, RAND() FROM table_t;
```

特征子句反映存储过程的特性,在括号之后,主体之前。

参数

```sql
    CREATE PROCEDURE proc
    ()
    ...
```

括号里面用于存放参数列表通过IN(入参),OUT(返回值),INOUT(入参和出参相同)

声明变量

```sql
    CREATE PROCEDURE p8
    ()
    BEGIN
        DECLARE a INTEGER;
        DECLARE b INTEGER;
        SET a = 5;
        SET b = 6;
        INSERT INTO table1 VALUES(a);
        SELECT s1*a FROM table1 WHERE s1 >= b;
    END;
```

指定默认值

```sql
    CREATE PROCEDURE p8
    ()
    BEGIN
        DECLARE a INTEGER DEFAULT 5;
        DECLARE b INTEGER DEFAULT 5;
        INSERT INTO table1 VALUES(a);
        SELECT s1*a FROM table1 WHERE s1 >= b;
    END;
```

作用域

```sql
    CREATE PROCEDURE p8
    ()
    BEGIN
        DECLARE x1 CHAR(5) DEFAULT 'outer';
        BEGIN
            DECLARE x1 CHAR(5) DEFAULT 'inner';
            SELECT x1;
        END;
    END;
```

条件表达式

```sql
    CREATE PROCEDURE p12
    (IN para01 INTEGER)
    BEGIN
        DECLARE var01 INTEGER;
        SET var01 = para01+1;
        IF var01 = 0 THEN
            INSERT INTO table1 VALUES(17);
        END IF;
        IF para01 = 0 THEN
            UPDATE table1 SET s1 = s1+1;
        ELSE
            UPDATE table1 SET s1 = s1 +2;
        END IF;
    END;
```

CASE 指令

```sql
    CREATE PROCEDURE p12
    (IN para01 INTEGER)
    BEGIN
        DECLARE var01 INTEGER;
        SET var01 = para01 + 1;
        CASE var01
            WHEN 0 THEN INSERT INTO table1 VALUES(12);
            WHEN 1 THEN INSERT INTO table1 VALUES(90);
            ELSE INSERT INTO table1 VALUES(80);
        END CASE;
    END;
```

循环

一种是类似编程语言中的while循环,另一种是do...while循环,还有一种是loop

```sql
    CREATE PROCEDURE p12
    ()
    BEGIN
        DECLARE var01 INTEGER;
        SET var01 = 0;
        WHILE var01 < 5 DO
            INSERT INTO table1 VALUES(var01);
            SET var01 = var01 +1;
        END WHILE;
    END;
```

```sql
    CREATE PROCEDURE p23
    ()
    BEGIN
        DECLARE var01 INTEGER;
        SET var01 = 0;
        REPEAT
            INSERT INTO table1 VALUES(12);
            SET var01 = var01 + 1;
            UNTIL var01 >=5;
        END REPEAT;
    END;
```

LEAVE 类似break
sql CREATE PROCEDURE p123 () BEGIN DECLARE var01 INTEGER; SET var01 = 0; myloop: LOOP INSERT INTO table1 VALUES(var01); SET var01 = var01 + 1; IF var01 >= 5 THEN LEAVE myloop; END IF; END LOOP; END;

ITERATE 类似循环中使用的continue
sql CREATE PROCEDURE p123 () BEGIN DECLARE var01 INTEGER; SET var01 = 0; myloop: LOOP INSERT INTO table1 VALUES(var01); SET var01 = var01 + 1; IF var01 >= 5 THEN ITERATE myloop; END IF; END LOOP; END;

标签

标签增加可读性

```sql
    CREATE PROCEDURE p34
    ()
    label_01: BEGIN
        label_02: WHILE 0 =1 DO 
            LEAVE label_02;
        END WHILE label_02;
    END label_01;
```

异常处理

```sql
    CREATE PROCEDURE p22
    (IN para01 INTEGER)
    BEGIN
        DECLARE EXIT HANDLER FOR 1215                   /*声明异常处理器*/
            INSERT INTO error_log VALUES(error_msg);
        INSERT INTO table1 VALUES(para01);
    END;
```

异常声明语法:
DECLARE
{EXIT|CONTINUE} //退出还是继续
HANDLER FOR 
{error-number|{SQLSTATE error-string}|condition} //异常的原因
SQL statement //捕获异常后执行的sql语句

```sql
    CREATE PROCEDURE p34
    ()
    BEGIN
        DECLARE CONTINUE HANDLER
        FOR SQLSTATE '23000' 
        SELECT * FROM table1;  /*当出现23000的错误后,会自动执行改行*/

        sql...
        
    END;
```

condition 声明,就是给异常处理器命名

```sql
    CREATE PROCEDURE p45
    ()
    BEGIN
        DECLARE 'Constraint Violation'
            CONDITION FOR SQLSTATE '23000';
        DECLARE EXIT HANDLER FOR
            'Constraint Violation' 
            ROLLBACK;
        START TRANSACTION;
        INSERT INTO table1 VALUES(1);
        COMMENT;
    END;
```

游标

```sql
    CREATE PROCEDURE p25
    (OUT returnval INTEGER)
    BEGIN
        DECLARE a,b INTEGER;
        DECLARE cur01 CURSOR FOR
            SELECT s1 FROM table1;
        DECLARE CONTINUE HANDLER FOR
            NOT FOUND
            SET b = 1;
        OPEN cur01;
        REPEAT
            FETCH cur01 INTO a;
            UNTIL b = 1;
        END REPEAT;
        CLOSE cur01;
        SET returnval = a;
    END;
```

声明顺序:先声明普通变量,然后声明游标,最后声明异常处理器。

游标的特性

在mysql5.0 中,游标是只读的,而且只能顺序读取,也不能执行更新操作。

函数

```sql
    CREATE FUNCTION  factorial
        (n DECIMAL(3,0))
        DETERMINISTIC
        BEGIN
            DECLARE factorial DECIMAL(20,0) DEFAULT 1;
            DECLARE counter DECIMAL(3,0);
            SET counter = n;
            factorial_loop: REPEAT
                SET factorial = factorial * counter;
                SET counter = counter + 1;
            UNTIL counter =1
            END REPEAT;
        RETURN factorial;
        END;
```

转载于:https://my.oschina.net/xiaojintao/blog/817362

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值