• MySql_ procedure


    返回参数示例

    下面是一个示例:

    delimiter //S                                                                                                                                                                                                                                                                                                   

    drop procedure if EXISTS myzrz;

    CREATE PROCEDURE myzrz(in pin int,out pout int, INOUT pinout int)
    begin
    declare var int ;
    set var =0;

    while var<6 DO
    INSERT into test.test values (null,var,var,var);
    set var=var+1;
    end while;
    end;
    //

    调用语法示例


    Set @a=6;
    set @b=6;
    call myzrz(6,6,@b);

    1 调用的时候 out 类型的参数和 inout 的参数必须指定为用户变量  如 @a,@b来做参数;

    IN 类型的参数 虽然在存储过程中被修改,但并不影响@p_in的值,注意这点;

    Ⅱ. 变量赋值

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

    Ⅲ. 用户变量

    ⅰ. 在MySQL客户端使用用户变量

    mysql > SELECT 'Hello World' into @x;  

    mysql > SELECT @x;  

    +-------------+  

    |   @x        |  

    +-------------+  

    | Hello World |  

    +-------------+  

    mysql > SET @y='Goodbye Cruel World';  

    mysql > SELECT @y;  

    +---------------------+  

    |     @y              |  

    +---------------------+  

    | Goodbye Cruel World |  

    +---------------------+  

    mysql > SET @z=1+2+3;  

    mysql > SELECT @z;  

    +------+  

    | @z   |  

    +------+  

    |  6   |  

    +------+  

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

    mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  

    mysql > SET @greeting='Hello';  

    mysql > CALL GreetWorld( );  

    +----------------------------+  

    | CONCAT(@greeting,' World') |  

    +----------------------------+  

    |  Hello World               |  

    +----------------------------+  

    ⅲ. 在存储过程间传递全局范围的用户变量

    mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  

    mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);  

    mysql> CALL p1( );  

    mysql> CALL p2( );  

    +-----------------------------------------------+  

    | CONCAT('Last procedure was ',@last_proc       |  

    +-----------------------------------------------+  

    | Last procedure was p1                         |  

    +-----------------------------------------------+  

    注意:

    ①用户变量名一般以@开头

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

    (5). 注释

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

    双模杠:--

    该风格一般用于单行注释

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

    例如:

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc1 --name存储过程名  

         -> (IN parameter1 INTEGER)  

         -> BEGIN  

         -> DECLARE variable1 CHAR(10);  

         -> IF parameter1 = 17 THEN  

         -> SET variable1 = 'birds';  

         -> ELSE 

         -> SET variable1 = 'beasts';  

         -> END IF;  

         -> INSERT INTO table1 VALUES (variable1);  

         -> END  

         -> //  

    mysql > DELIMITER ;  

    4.      MySQL存储过程的调用

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

    5.      MySQL存储过程的查询

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

    我们可以用

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

    或者

    select routine_name from information_schema.routines where routine_schema='数据库名';

    或者

    show procedure status where db='数据库名';

    进行查询。

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

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

    SHOW CREATE PROCEDURE 数据库.存储过程名;

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

    6.      MySQL存储过程的修改

    ALTER PROCEDURE

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

    7.      MySQL存储过程的删除

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

    DROP PROCEDURE

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

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

    (1). 变量作用域

    内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储

    过 程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派

    给 会话变量来保存其值。

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc3()  

         -> begin 

         -> declare x1 varchar(5) default 'outer';  

         -> begin 

         -> declare x1 varchar(5) default 'inner';  

         -> select x1;  

         -> end;  

         -> select x1;  

         -> end;  

         -> //  

    mysql > DELIMITER ;  

     (2). 条件语句

    Ⅰ. if-then -else语句

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc2(IN parameter int)  

         -> begin 

         -> declare var int;  

         -> set var=parameter+1;  

         -> if var=0 then 

         -> insert into t values(17);  

         -> end if;  

         -> if parameter=0 then 

         -> update t set s1=s1+1;  

         -> else 

         -> update t set s1=s1+2;  

         -> end if;  

         -> end;  

         -> //  

    mysql > DELIMITER ;  

    Ⅱ. case语句: 

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc3 (in parameter int)  

         -> begin 

         -> declare var int;  

         -> set var=parameter+1;  

         -> case var  

         -> when 0 then   

         -> insert into t values(17);  

         -> when 1 then   

         -> insert into t values(18);  

         -> else   

         -> insert into t values(19);  

         -> end case;  

         -> end;  

         -> //  

    mysql > DELIMITER ; 

    (3). 循环语句

    Ⅰ. while ···· end while:

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc4()  

         -> begin 

         -> declare var int;  

         -> set var=0;  

         -> while var<6 do  

         -> insert into t values(var);  

         -> set var=var+1;  

         -> end while;  

         -> end;  

         -> //  

    mysql > DELIMITER ; 

    Ⅱ. repeat···· end repeat:

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

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc5 ()  

         -> begin   

         -> declare v int;  

         -> set v=0;  

         -> repeat  

         -> insert into t values(v);  

         -> set v=v+1;  

         -> until v>=5  

         -> end repeat;  

         -> end;  

         -> //  

    mysql > DELIMITER ;  

    Ⅲ. loop ·····end loop:

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

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc6 ()  

         -> begin 

         -> declare v int;  

         -> set v=0;  

         -> LOOP_LABLE:loop  

         -> insert into t values(v);  

         -> set v=v+1;  

         -> if v >=5 then 

         -> leave LOOP_LABLE;  

         -> end if;  

         -> end loop;  

         -> end;  

         -> //  

    mysql > DELIMITER ;  

    Ⅳ. LABLES 标号:

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

    (4). ITERATE迭代

    Ⅰ. ITERATE:

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

    mysql > DELIMITER //  

    mysql > CREATE PROCEDURE proc10 ()  

         -> begin 

         -> declare v int;  

         -> set v=0;  

         -> LOOP_LABLE:loop  

         -> if v=3 then   

         -> set v=v+1;  

         -> ITERATE LOOP_LABLE;  

         -> end if;  

         -> insert into t values(v);  

         -> set v=v+1;  

         -> if v>=5 then 

         -> leave LOOP_LABLE;  

         -> end if;  

         -> end loop;  

         -> end;  

         -> //  

    mysql > DELIMITER ; 

    返回结果集示例: 


    dROP TABLE IF EXISTS test.test;
    CREATE TABLE test.test(
    id int(10) not null auto_increment,
    a int(10) not null,
    b int(10) not null,
    c int(10) not null,
    PRIMARY key (`id`)
    )ENGINE INNODB DEFAULT CHARSET utf8 COMMENT '测试表';            //测试的表

    drop PROCEDURE if EXISTS `CREATE_ACCOUNT`;
    CREATE PROCEDURE `CREATE_ACCOUNT` (

    )
    BEGIN
    select * from test.test where c=6;

    END;

    call `CREATE_ACCOUNT`();

     调用结果;

    下面看java 调用示例:

    表与上面相同;


    drop PROCEDURE if EXISTS `CREATE_ACCOUNT`;
    CREATE PROCEDURE `CREATE_ACCOUNT`(
    ACCOUNT CHAR(32),
    pwd CHAR(32),
    OUT I_RETURN_CODE INT
    )
    BEGIN



    SELECT * FROM test WHERE c = 6 ;
    END;

    package controller;

    import java.sql.Connection;
    import java.sql.DriverManager;

    import com.mysql.jdbc.*;
    import java.sql.ResultSet;
    import java.sql.Types;

    public class CallTest {

    public static void main(String[] args) {
    Connection conn = null;
    java.sql.CallableStatement ps = null;
    String url = "jdbc:mysql://127.0.0.1:3306/test";
    String user = "root", pass = "123456";
    try{
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("regedit driver seccess!");
    System.out.println("now,getting a connection .... ...");
    conn = DriverManager.getConnection(url, user, pass);
    System.out.println("getting connection seccess!");
    ps = conn.prepareCall("{call CREATE_ACCOUNT(?,?,?)}");
    ps.setString(1,"24ADB4E2F0");
    ps.setString(2,"apassword");
    ps.registerOutParameter(3, Types.INTEGER); //ret code

     ps.setInt(3, 6); //先注册在赋值


    System.out.println("binding parameters seccess!");
    ps.execute();
    System.out.println("execute procedure seccess!");
    //int ret = ps.getInt(3);
    ResultSet rs = ps.getResultSet(); // the result set that procedure return
    if(rs != null)
    {
    while(rs.next())
    { System.out.println(rs.getMetaData().getColumnName(1)+":"+ rs.getInt(1));
    System.out.println(rs.getMetaData().getColumnName(2)+":"+ rs.getInt(2));
    System.out.println(rs.getMetaData().getColumnName(3)+":"+ rs.getInt(3));

    }
    }
    conn.close();
    System.out.println("closing this connection seccess!");
    }
    catch(Exception e)
    {
    System.out.println("Exception: "+e);
    }
    }

    }

  • 相关阅读:
    TSQL 备份和还原
    SQL检查死锁情况
    局域网中“隐身”妙招 类似360的局域网隐身
    注册edu邮箱的办法
    C#读、写、删除注册表
    SQL备份计划
    GridView命令不够用怎么办?
    从智能设备访问SQL2000的数据
    智能设备访问SQL2000(一)
    字符HTML编码类(转)
  • 原文地址:https://www.cnblogs.com/anyehome/p/7979092.html
Copyright © 2020-2023  润新知