用mysql存储过程详解_MySQL存储过程详解 mysql 存储过程

数据类型 一、整型 1、BIGINT 语法:BIGINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL] 存储:8字节。 描述:最大的整数类型,支持的整数范围是:-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807(UNSIGNED时为:0 ~ 18 446 744 073 709 551 615)。 2、INT 语法:INT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL] 存储:4字节。 描述:范围为:-2 147 483 648 ~ 2 147 483 647(UNSIGNED时为:0 ~ 4 294 967 295)的基本整数。有同义语法:INTEGER。 3、MEDIUMINT 语法:MEDIUMINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL] 存储:3字节 描述:范围为:-8 388 608 ~ 8 388 607(UNSIGNED时为:0 ~ 16 777 215)的基本整数。 4、SMALLINT 语法:SMALLINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL] 存储:2字节 描述:范围为:-32768 ~ 32767(UNSIGNED时为:0 ~ 65535)的基本整数。 5、TINYINT 语法:TINYINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL] 存储:1字节 描述:范围为:-128 ~ 127(UNSIGNED时为:0 ~ 255)的基本整数。 二、字符型 1、CHAR 语法:CHAR(size) [BINARY] 存储:size字节 大小:范围为:0 ~ 255 描述:固定长度的文本字段,字符比列大小小的字符串将用空格填充在右边,右边的填充在从数据库中检索该值时被删除。有同义语法:NCHAR、NATIONAL CHAR、CHARACTER。 2、VARCHAR 语法:VARCHAR(size) [BINARY] 存储:值的长度 +1 字节。 大小:由size值指定,5.0以上版本支持范围为:0 ~ 65535 描述:存储可变长度的文本,VARCHAR值中的尾随空格在存储到数据库中时将被删除,这与ANSI规范相冲突。 3、TEXT 语法:TEXT 存储:值的长度+2字节 大小:0 ~ 65535 描述:储存大文本值,不接收默认值。 三、日期/时间型 在定义表时,各字段上通过DEFAULT子句指定的默认值必须是个常数,不可以是个函数,所以DATATIME colname DEFAULT NOW();这样的定义是错误的,但有个例外,就是TIMESTAMP类型。 如果表中只有一个TIMESTAMP列:在定义的时候可以设置为TIMESTAMP colname DEFAULT CURRENT_TIMESTAMP,这样,在添加新记录的时候把这个字段设置为当前时间,但以后修改记录时该TIMESTAMP字段不再更新;在定义的时候设置为TIMESTAMP colname NOT NULL,这样每次记录更新该列都会重置为当前时间。如果表中有多个TIMESTAMP列:仅第一个TIMESTAMP会自动更新。 1、YEAR 语法:YEAR 格式:YYYY (2001) 存储:1字节 描述:存储1900年 ~ 2155年之间的公历年份。 2、DATE 语法:DATE 格式:YYYY-MM-DD (2001-01-01) 存储:3字节 描述:存储范围为1000年1月1日('1000-01-01') ~ 9999年12月31日('9999-12-31')的公历日期。 3、TIME 语法:TIME 格式:hh:mm:ss (06:00:00) 存储:3字节 描述:存储范围在子夜('00:00:00')到子夜前一秒('23:59:59')。 4、DATETIME 语法:DATETIME 格式:YYYY-MM-DD hh:mm:ss (2001-01-01 01:00:00) 存储:8字节 描述:存储范围为1000年1月1日上午12:00:00('1000-01-01 00:00:00') ~ 9999年12月31日下午11:59:59('9999-12-31 23:59:59')的公历日期。 5、TIMESTAMP 语法:TIMESTAMP [(display_size)] 格式:YYYYMMDDhhmmss (20010101060000) 存储:4字节 描述:范围在1970年1月1日子夜到2037年12月31日子夜前一分钟之间某时刻的简单表示形式,精确到秒。它的主要用途是保持对表更新的记录。当向TIMESTAMP列中插入NULL值时,它将用当前的日期和时间替代插入。当在具有TIMESTAMP列的行中修改任何值时,第一个TIMESTAMP列将自动用当前的日期和时间更新。   1. 创建实例数据库    create database db5;    use db5; 2.创建一个简单的工作表,并插入数据    create table t(s1 int);    insert into t values(5); 3.创建程序实例 create procedure Example    create procedure p1() select * from t;       SQL语句存储过程的第一部分是 create procedure       第二部分是过程名:上面新存储过程的名字是p1。       第三部分书参数列表(),第四部分是程序的主体,“select * from t” *****什么样的MySQL语句在存储过程体中是合法的?        在存储过程体中可以包含所有的合法SQL数据库定义语言,insert,update,delete,drop,create,replace等等语句 包括(set,commit,rollback)但是,在代码中如果包含MYSQL的扩充功能,那么代码将不能移植。      4. 调用存储过程,所需要输入的就是call和你过程名以及一个括号。     call p1(); 5.过程中的特征子句     create procedure p2()language SQL                           NOT DETERMINISTIC     SQL SECURITY DEFINER     COMMENT ''      select current_date,rand() from t; 6.Parameters参数     create procedure p5()------; //参数列表是空的     create procedure p5([IN] name data-type)---- //输入参数in可选,默认为参数为in     create procedure p5(out name data-type)----- //输出参数out     create procedure p5(inout 那么data-type)----- //即可以做输入参数也可以做输出参数    ----输入参数in 例子。        create procedure p5(p int) set @x=p;        call p5(12345);        select @x;    ----输出参数out 例子        create procedure p6(out p int)set p=-5;        call p6(@y);        select @y; 7. 复合语句:如果你的过程中有多条语句,那么你需要begin/end块。在这里你可以进行变量的定义和流程的控制        首先执行命令 delimiter //        create procedure p7()            BEGIN               set  @a=6;        set  @b=5;        insert into t values (@a);        select s1 * @a from t where s1>= @b;     END;//    -----在复合语句中申明变量        create procedure p8()             begin        DECLARE a INT;        DECLARE b INT;        SET a=5;        SET b=5;        insert into t values (a);        select s1*a from t where s1>=b;             end;//        含有default默认语句舌设定语句的例子        create procedure p9()        begin           declare a ,b int default 5;    insert into t values(a);    select s1*a from t where s1>=b;        end;// 8. scope作用域的问题:内部的变量在其作用域范围内享有更高的优先权,当执行到end         变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储  过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派  给会话变量来保存其值。    create procedure p11()    begin        declare x1 char(5) default 'outer';       begin         declare x1 char(5) default 'inner';  select x1;       end;       select x1;    end;//     /*********************************  存储过程中的条件式语句  ***************************************/ 1. if-then -else语句     create procedure p12(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;// 2. case指令:如果需要进行更多条件真假的判断我们可以使用case语句    create procedure p13(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;// /*****************************  循环语句  ************************************/ 1. while ···· end while; 循环语句   create procedure p14()    begin      declare var int;      set var=0;      while var<6 do         insert into t values(var);  set var=var+1;      end while;    end;// 2. repeat···· end repeat ;它在执行操作后检查结果,而while则是执行前进行检查   create procedure p15()    begin      declare v int;      set v=0;      repeat        insert into t values(v);        set v=v+1;        until v>=5      end repeat;    end;// 3. loop ·····end loop; loop 循环不需要初始条件,这点和while 循环相似,同时和repeat        循环一样不需要结束条件, leave语句的意义是离开循环,   create procedure p16()    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;// 4. LABLES 标号:标号可以用在begin repeat while 或者loop 语句前,语句标号只能在       合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。 /*定义函数*/ DROP FUNCTION IF EXISTS myDataBase.fcMyFunction; CREATE FUNCTION myDataBase.fcMyFunction() RETURNS BIGINT BEGIN     DECLARE _s BIGINT DEFAULT 0;     SELECT _s + 1 INTO _s;     RETURN _s; END;   MySQL中的字符串处理函数 一、LOCATE /* LOCATE(substr, str); 返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0。 如下示例,返回结果:5 */ SELECT LOCATE('5', '1234567890'); 二、LENGTH /*返回字符串的长度*/ SELECT LENGTH(str); 三、CONCAT /* 字符串连接函数 如下示例结果:'abc123def' */ SELECT CONCAT('abc', 123, 'def'); 四、REPLACE /* 字符串替换函数 如下示例结果:'123def' */ SELECT REPLACE('abcdef', 'abc', '123'); 五、SUBSTRING /* 字符串截取函数 SUBSTRING(str, begin, end); 截取字符串str,从第begin位到end位 如下示例结果:'567890' */ SELECT SUBSTRING('1234567890', 5, 10);   最后作为一个结束,介绍个MySql分页存储过程 DROP PROCEDURE IF EXISTS `PtBase`.`prPager`; CREATE PROCEDURE `PtBase`.`prPager`(     OUT oRowsTotal INT,        --输出记录总数     IN iTableName VARCHAR(800),    --表名     IN iFields VARCHAR(800),    --查询字段     IN iPageSize INT,        --每页记录数     IN iPageNow INT,        --当前页     IN iOrderString VARCHAR(100),    --排序条件     IN iWhereString VARCHAR(800)    --WHERE条件 )     NOT DETERMINISTIC     SQL SECURITY DEFINER     COMMENT '' BEGIN     DECLARE _beginRow INT DEFAULT 0;     DECLARE _mainString VARCHAR(8000);     DECLARE _limitString VARCHAR(100);     DECLARE _countString VARCHAR(8000);          SET _beginRow = (iPageNow - 1) * iPageSize;     SET _limitString = CONCAT(' LIMIT ', beginRow, ', ', iPageSize);     SET _countString = CONCAT('SET oRowsTotal = SELECT COUNT(*) FROM ', iTableName, ' WHERE ', iWhereString);     SET _mainString = CONCAT('SELECT ', iFields, ' FROM ', iTableName, ' WHERE ', iWhereString, iOrderString, _limitString);     SET @countStr = _countString;     PREPARE countStmt FROM @countStr;     EXECUTE countStmt;     DEALLOCATE PREPARE countStmt;     SET @mainStr = _mainString;     PREPARE mainStmt FROM @mainStr;     EXECUTE mainStmt;     DEALLOCATE PREPARE mainStmt; END;

你可能感兴趣的:(用mysql存储过程详解)