mysql存储过程与函数-----第一章

来源:互联网 发布:快递免费数据管理软件 编辑:程序博客网 时间:2024/05/21 01:32

本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。

     函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 。
      1.    一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
      2.    对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
      3.    存储过程一般是作为一个独立的部分来执行(EXEC执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。

      4.    当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。

一。创建一个存储过程:(执行过一次后,下次直接调用,不需要重新执行)

    DELIMITER $$            USE `插入表所在的数据库名字`$$            DROP PROCEDURE IF EXISTS `insertpro`$$            CREATE DEFINER=`root`@`localhost` PROCEDURE `insertpro`(IN IP_NUM INT, IN OID_NUM INT)      BEGIN        DECLARE iIP INT DEFAULT 0 ;        DECLARE iOID INT DEFAULT 0 ;            WHILE(iIP < IP_NUM)          DO            SET iOID = 0;            WHILE(iOID<OID_NUM)            DO             SET @mySql = CONCAT("INSERT INTO testtb (IP, OID) VALUES(CONCAT((ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1)),ROUND(RAND()*100)+1);");                          PREPARE stmt FROM @mySql;              EXECUTE stmt;                DEALLOCATE PREPARE stmt;              SET iIP = iIP+1;            END WHILE;              SET iIP = iIP+1;          END WHILE;                END$$            DELIMITER ;  


标准格式:

create procedure 存储过程名字()(      [in|out|inout] 参数 datatype)begindeclare  参数   类型 default 多少//申明参数while (条件)doMySQL 语句;end while;end;


执行存储过程:(插入8w条数据)

call autoinsert 1000 80 


二。创建一个函数:

格式:

drop function if exists 创建的函数;create function 函数名(参数1  类型) returns 返回值类型begin      return(              select  字段 from 表 where 字段=参数1;   );end;

实例:

DROP FUNCTIONIF EXISTS add_function;CREATE FUNCTION add_function (tid INT) RETURNS VARCHAR (45)BEGINRETURN (SELECTlicenseNumberFROMtb_group_chexian_orderWHEREid = tid);END;

调用:

select add_function(12);

结果显示: