创办第1个存储进程,        在exe文件后边可以跟参数

图片 1图片 2

二 MySQL存储进程详解

http://blog.sina.com.cn/s/blog\_52d20fbf0100ofd5.html

  1.      存储进度简介
     
    咱俩常用的操作数据库语言SQL语句在实施的时候须要要先编译,然后实施,而存储进度(Stored
    Procedure)是一组为了形成一定作用的SQL语句集,经编译后存储在数据库中,用户通过点名存储进程的名字并加以参数(假如该存储进度带有参数)来调用执行它。
    3个存储进程是壹个可编程的函数,它在数据库中开创并保存。它可以有SQL语句和局地特殊的控制结构组成。当希望在差距的应用程序或平台上执行同样的函数,或然封装特定功用时,存储进度是卓殊管用的。数据库中的存储进度可以当作是对编程中面向对象方法的效仿。它同意控制数据的拜会格局。
    积存过程一般有以下优点:
    (1).存储进度增强了SQL语言的效果和灵活性。存储进度可以用流控制语句编写,有很强的油滑,可以做到复杂的判定和较复杂的运算。
    (2).存储进度允许标准组件是编程。存储进程被创制后,可以在先后中被反复调用,而不要再次编排该存储进度的SQL语句。而且数据库专业人员可以随时对存储进度举行修改,对使用程序源代码毫无影响。
    (3).存储进程能促成较快的举办进度。借使某一操作包罗多量的Transaction-SQL代码或个别被频仍推行,那么存储进程要比批处理的履行进程快很多。因为存储进度是预编译的。在第一回运转一个储存进程时查询,优化器对其进展辨析优化,并且付诸最后被积存在系统表中的实践布署。而批处理的Transaction-SQL语句在历次运转时都要开展编译和优化,速度相对要慢一些。
    (4).存储进程能过收缩网络流量。针对同1个数据库对象的操作(如查询、修改),即便这一操作所提到的Transaction-SQL语句被集团程存储进程,那么当在客户总计机上调用该存储进度时,互连网中传递的只是该调用言语,从而大大增加了网络流量并下降了互连网负载。
    (5).存储进程可被看做一种安全机制来丰硕利用。系统管理员通过履行某一仓储进度的权能举行限制,可以落实对相应的数量的拜访权限的限量,防止了非授权用户对数据的拜会,有限协理了数额的天水。
     
  2.      关于MySQL的仓储进程
    储存进程是数据库存储的一个关键的效能,不过MySQL在5.0原先并不协助存储进程,那使得MySQL在利用上大降价扣。幸亏MySQL
    5.0总算早先已经支撑存储进程,这样即可以大大升高数据库的处理速度,同时也足以拉长数据库编程的灵活性。
  3.      MySQL存储进度的创制
     
    (1). 格式
    MySQL存储进程创立的格式:CREATE PROCEDURE 进程名
    ([进度参数[,…]])
    [特性 …] 过程体
    此地先举个例子:
       
    mysql> DELIMITER //  
    mysql> CREATE PROCEDURE proc1(OUT s int)  
        -> BEGIN 
        -> SELECT COUNT(*) INTO s FROM user;  
        -> END 
        -> //  
    mysql> DELIMITER ; 
     
    注:
    (1)那里需求专注的是DELIMITE卡宴 //和DELIMITE索罗德;两句,DELIMITE逍客是分割符的趣味,因为MySQL专断认同以”;”为分隔符,假如大家从不注明分割符,那么编译器会把囤积进度当成SQL语句进行处理,则存储进度的编译进度会报错,所以要先期用DELIMITELX570关键字注解当前段分隔符,那样MySQL才会将”;”当做存储进程中的代码,不会执行那些代码,用完精晓后要把分隔符还原。
    (2)存储进程依据须求或许会有输入、输出、输入输出参数,那里有二个出口参数s,类型是int型,倘若有多个参数用”,”分割开。
    (3)过程体的开头与停止使用BEGIN与END举办标识。
    诸如此类,大家的三个MySQL存储进度就完了了,是或不是很不难啊?
     
    (2). 表明分割符
     
    骨子里,关于声明分割符,下面的笺注已经写得很明亮,不需求多说,只是稍微要小心一点的是:若是是用MySQL的Administrator管理工具时,可以一直开立,不再要求评释。
     
    (3). 参数
    MySQL存储进度的参数用在存储进程的定义,共有两种参数类型,IN,OUT,INOUT,格局如:
    CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形…])
    IN
    输入参数:表示该参数的值必须在调用存储进程时指定,在仓储进度中修改该参数的值不可以被再次来到,为暗许值
    OUT 输出参数:该值可在仓储进程之中被更改,并可回到
    INOUT 输入输出参数:调用时指定,并且可被转移和再次来到
    Ⅰ. IN参数例子
    创建:
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  
    -> BEGIN   
    -> SELECT p_in;   
    -> SET p_in=2;   
    -> SELECT p_in;   
    -> END;   
    -> //  
    mysql > DELIMITER ; 

履行结果:
mysql > SET @p_in=1;  
mysql > CALL demo_in_parameter(@p_in);  
+——+  
| p_in |  
+——+  
|   1  |   
+——+  
 
+——+  
| p_in |  
+——+  
|   2  |   
+——+  
 
mysql> SELECT @p_in;  
+——-+  
| @p_in |  
+——-+  
|  1    |  
+——-+  

如上方可看来,p_in纵然在蕴藏进程中被修改,但并不影响@p_id的值
 
Ⅱ.OUT参数例子
创建:
mysql > DELIMITER //  
mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)  
-> BEGIN 
-> SELECT p_out;  
-> SET p_out=2;  
-> SELECT p_out;  
-> END;  
-> //  
mysql > DELIMITER ; 

履行结果:
mysql > SET @p_out=1;  
mysql > CALL sp_demo_out_parameter(@p_out);  
+——-+  
| p_out |   
+——-+  
| NULL  |   
+——-+  
 
+——-+  
| p_out |  
+——-+  
|   2   |   
+——-+  
 
mysql> SELECT @p_out;  
+——-+  
| p_out |  
+——-+  
|   2   |  
+——-+  

Ⅲ. INOUT参数例子
创建:
mysql > DELIMITER //   
mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)
  
-> BEGIN 
-> SELECT p_inout;  
-> SET p_inout=2;  
-> SELECT p_inout;   
-> END;  
-> //   
mysql > DELIMITER ; 
 
 
实施结果:
mysql > SET @p_inout=1;  
mysql > CALL demo_inout_parameter(@p_inout) ;  
+———+  
| p_inout |  
+———+  
|    1    |  
+———+  
 
+———+  
| p_inout |   
+———+  
|    2    |  
+———+  
 
mysql > SELECT @p_inout;  
+———-+  
| @p_inout |   
+———-+  
|    2     |  
+———-+ 

(4). 变量
Ⅰ. 变量定义
DECLARE variable_name [,variable_name…] datatype [DEFAULT
value];
中间,datatype为MySQL的数据类型,如:int, float, date, varchar(length)
例如:
DECLARE l_int int unsigned default 4000000;  
DECLARE l_numeric number(8,2) DEFAULT 9.95;  
DECLARE l_date date DEFAULT ‘1999-12-31’;  
DECLARE l_datetime datetime DEFAULT ‘1999-12-31 23:59:59’;  
DECLARE l_varchar varchar(255) DEFAULT ‘This will not be padded’;   
 
 
Ⅱ. 变量赋值
 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 ;  
 

  1.      MySQL存储进程的调用
    用call和您进度名以及3个括号,括号里面依据需求,参与参数,参数包涵输入参数、输出参数、输入输出参数。具体的调用方法可以参照上边的例子。
  2.      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 数据库.存储进度名;
    就足以查看当前囤积进度的详细。
     
  3.      MySQL存储进度的修改
    ALTER PROCEDURE
    更改用CREATE PROCEDURE
    建立的预先指定的囤积进程,其不会潜移默化相关存储进程或存储功效。
     
  4.      MySQL存储进度的去除
    删除壹个仓储进程相比较不难,和删除表一样:
    DROP PROCEDURE
    从MySQL的表格中除去多个或多个存储进程。
     
  5.      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 ; 
 
 

  1.      MySQL存储过程的大旨函数
     
    (1).字符串类
    CHA奥德赛SET(str) //再次来到字串字符集
    CONCAT (string2 [,… ]) //连接字串
    INST途观 (string ,substring )
    //重返substring第二回在string中冒出的职责,不设有再次来到0
    LCASE (string2 ) //转换到小写
    LEFT (string2 ,length ) //从string2中的右边起取length个字符
    LENGTH (string ) //string长度
    LOAD_FILE (file_name ) //从文件读取内容
    LOCATE (substring , string [,start_position ] )
    同INST智跑,但可指定初始地点
    LPAD (string2 ,length ,pad )
    //重复用pad加在string开首,直到字串长度为length
    LTPRADOIM (string2 ) //去除前端空格
    REPEAT (string2 ,count ) //重复count次
    REPLACE (str ,search_str ,replace_str )
    //在str中用replace_str替换search_str
    奔驰M级PAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
    奥迪Q3TCR-VIM (string2 ) //去除后端空格
    ST卡宴CMP (string1 ,string2 ) //逐字符比较两字串大小,
    SUBSTRING (str , position [,length ])
    //从str的position开始,取length个字符,
    注:mysql中处理字符串时,暗中认同第1个字符下标为1,即参数position必须当先等于1 
     
    mysql> select substring(‘abcd’,0,2);  
    +———————–+  
    | substring(‘abcd’,0,2) |  
    +———————–+  
    |                       |  
    +———————–+  
    1 row in set (0.00 sec)  
     
    mysql> select substring(‘abcd’,1,2);  
    +———————–+  
    | substring(‘abcd’,1,2) |  
    +———————–+  
    |     ab                |  
    +———————–+  
    1 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) //进制转换
    FLOOCRUISER (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)私行认同变为整形值
    mysql> select round(1.23);  
    +————-+  
    | round(1.23) |  
    +————-+  
    |           1 |  
    +————-+  
    1 row in set (0.00 sec)  
     
    mysql> select round(1.56);  
    +————-+  
    | round(1.56) |  
    +————-+  
    |           2 |  
    +————-+  
    1 row in set (0.00 sec) 

(2)可以设定小数位数,再次来到浮点型数据
mysql> select round(1.567,2);  
+—————-+  
| round(1.567,2) |  
+—————-+  
|           1.57 |  
+—————-+  
1 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_FO奥德赛MAT (datetime ,FormatCodes )
//使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去3个日子
DATEDIFF (date1 ,date2 ) //多个日子差
DAY (date ) //重回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期日
DAYOFYEARubicon (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) //开平方

 

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

        在exe文件后边可以跟参数,paramstr
获取的就是exe文件后边跟参数。
       
如有可执行文件project1.exe(快捷格局) 在运作中输入   e:\project1.exe 123
456 789
        那么paramstr(1)=’123′
paramstr(2)=’456′ paramstr(3)=’789′
       
用shellexecute的话可以在parameters参数地方输入值。不一致的参数值之间用空格隔开

shellexecute(application.Handle,’open’,’project4.exe’,’123 456′,
‘e:\’,SW_SHOW);
       
所以用paramstr可以在应用程序间开展多少传输。

三 建表脚本

[sql] view
plain
 copy

  1. use test;    
  2.    
  3. create table book     
  4. (     
  5. tisbn varchar(20) primary key,     
  6. tbname varchar(100),     
  7. tauthor varchar(30),     
  8. chubanshe varchar(40),     
  9. bookdate date,     
  10. bookpage int,     
  11. leixing varchar(20),     
  12. bprice float(6,2)     
  13. );     
  14.    
  15. insert into book values ( ‘9787115167408’, ‘JAVA SE 6.0 编程指南 ‘,     
  16. ‘ 吴亚峰 ; 纪超 ‘,     
  17. ‘ 人民邮电出版社 ‘, ‘2005-11-00’ , 874,     
  18. ‘ 总结机类 ‘, 98.00 );     
  19. insert into book values ( ‘7115138378’,     
  20. ‘ 通晓 Netbeans–Java 桌面、 Web 与集团级程序开发详解 ‘,     
  21. ‘ 吴亚峰 ; 王鑫磊 ‘,     
  22. ‘ 人民邮电出版社 ‘, ‘二〇〇六-2-10’, 587,     
  23. ‘ 总括机类 ‘, 75.00 );     
  24. insert into book values ( ‘9787115167934’, ‘ 高质量程序设计形式 ‘,     
  25. ‘( 希腊 )Diomidis Spinellis’,     
  26. ‘ 人民出版社 ‘, ‘二〇一〇-1-00’, 384,     
  27. ‘ 总计机类 ‘, 55.00 );     
  28. insert into book values ( ‘9787111213826’, ‘Java 编程思想 ( 第 4 版 )’,     
  29. ‘( 美 )Bruce Eckel’,     
  30. ‘ 机械工业出版社 ‘, ‘2006-6-00’, 880,     
  31. ‘ 总结机类 ‘, 108.00 );     
  32. insert into book values ( ‘9787121048531’, ‘Struts 2 权威指南 ‘,     
  33. ‘ 李刚 ‘, ‘ 电子工业出版社 ‘, ‘二零零六-9-00’, 715,     
  34. ‘ 总计机类 ‘, 79.00 );     
  35. insert into book values ( ‘9787111216322’, ‘JavaScript 权威指南 ‘,     
  36. ‘( 美 )戴维 Flanagan’, ‘ 机械工业出版社 ‘, ‘贰零零柒-8-00’, 954,     
  37. ‘ 总括机类 ‘, 109.00 );     
  38. insert into book values ( ‘9787121042621’, ‘Spring 2.0 焦点技术与最佳实践 ‘,     
  39. ‘ 廖雪峰 ‘, ‘ 电子工业出版社 ‘, ‘二〇〇六-6-00’, 509,     
  40. ‘ 总计机类 ‘, 59.80 );     
  41. insert into book values ( ‘7505380001’, ‘Java 与模式 ‘,     
  42. ‘ 阎宏 ‘,     
  43. ‘ 电子工业出版社 ‘, ‘2003-10-00’, 1024,     
  44. ‘ 总括机类 ‘, 88.00 );     
  45. insert into book values ( ‘9787302167792’, ‘VB 二〇〇五 & .NET 3.0 高级编程 ‘,     
  46. ‘( 美 )Bill Evjen; Billy Hollis;Bill Sheldon’,     
  47. ‘ 哈工大大学出版社 ‘, ‘贰零壹零-2-00’ , 348,     
  48. ‘ 总计机类 ‘, 45.00 );     
  49. insert into book values ( ‘7115152098’, ‘ JavaScript 高级程序设计 ‘,     
  50. ‘Nicholas C.Zakas’,     
  51. ‘ 人民邮电出版社 ‘, ‘2005-11-00’ ,532,     
  52. ‘ 统计机类 ‘, 59.00 );  

实践结果: 

 

一 操作实例

首先登录mysql;

图片 3

 

利用source命令,从命令行执行sql脚本,创建表;

图片 4

 

始建第1个存储进程;

先行用DELIMITECR-V关键字注脚当前段分隔符,那样MySQL才会将”;”当做存储进程中的代码;

图片 5

 

调用一下,成功了;

图片 6

 

开创二个带输出参数的积存进程,返回book表的记录数;创建成功;

图片 7

 

一般来说的调用语句战败;

图片 8

 

先在指令行用set定义三个变量;定义变量成功;后边的调用语句失败;

图片 9

 

参数是放到括号里的;调用成功;

select @s1,突显了@s1的当前值,为9,表的记录数;

图片 10

 

调用时括号中隐含的是未定义的变量,将出错;

图片 11

 

制造三个带输入参数的蕴藏进度;

图片 12

 

调用成功,如下;

图片 13

 

创办二个带输入参数的仓储进程,输入参数为书的页数,重返表中页数大于输入值的记录;

图片 14

 

调用时输入参数600;再次回到页数大于600的记录;

图片 15

 

8. MySQL存储进度的支配语句 

 

创建: 

  飞速格局里面的靶子可以加参数
  创造进度的时候能够加参数
  执行 ShellExecute 的时候也得以加参数

Ⅰ. ITERATE: 

 

loop循环不要求开端标准,那点和while
循环相似,同时和repeat循环一样不要求收尾条件,
leave语句的意义是离开循环。 

  七个参数之间是空格分割的

推行结果: 

 

注:再次回到类型并非均为整数,如: 
(1)默许变为整形值 

  Parameters
里面是空白,ParamStr(1) 是 Parameters 里面的空格分割的第一,个部分。

2. 关于MySQL的存储进程 
积存进程是数据库存储的多个重视的作用,可是MySQL在5.0原先并不辅助存储进程,那使得MySQL在使用上大降价扣。幸而MySQL
5.0总算起初已经支撑存储进程,那样即可以大大提升数据库的处理速度,同时也足以拉长数据库编程的油滑。 

原型        

SHOW CREATE PROCEDURE 数据库.存储进度名; 

 

mysql> select round(1.567,2); 
+—————-+ 
| round(1.567,2) | 
+—————-+ 
| 1.57 | 
+—————-+ 
1 row in set (0.00 sec) 
SIGN (number2 ) // 

 

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

 

只要大家想驾驭,有些存储进度的事无巨细,那大家又该如何做吗?是否也可以像操作表一样用describe
表名举行查看呢? 

@每一日欢腾 读参数前用ParamCount判断有没有参数, 假使ParamCount为0, 即没参数, ParamStr(1)放什么还第三,么? 我不清楚它会放怎么, 因为作者常有都会用ParamCount判断, 假如是零自作者历来就不会读它, 所以笔者不知情它会是何许, 有趣味你可以试行

4. MySQL存储进度的调用 

        function  
paramstr(i:index):string
        对于其余application
paramstr(0)都默许代表的是应用程序的相对路径。那么有paramstr(0),就必定
有paramstr(1),paramstr(2)…了。它们的值又是哪些了?作者试了下取出的是空值,又不大概赋值。
        delphi支持中说Returns a specified
parameter from the command-line.从命令行中重返二个特意的参数。

Ⅰ. if-then -else语句 

@每一日高兴 用ParamCount()得到有微微个参数, 参数放在ParamStr(n), ParamStr(0)是实施文书, 第三个参数在ParamStr(1)

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 ; 

//获取程序参数
//可从 Project -> Options ->
Debugger -> Parameters 中输入模拟参数, 多少个参数可用空格隔开
procedure TForm1.FormCreate(Sender:
TObject);
var
  i: Integer;
begin
  for i := 1 to ParamCount do
  begin
   
ListBox1.Items.Add(ParamStr(i));
  end;
end;

Ⅱ.OUT参数例子 

 

ALTER PROCEDURE 

 

咱俩常用的操作数据库语言SQL语句在举办的时候必要要先编译,然后实施,而存储进度(Stored
Procedure)是一组为了形成一定功能的SQL语句集,经编译后存储在数据库中,用户通过点名存储进度的名字并加以参数(如果该存储进度带有参数)来调用执行它。 

paramStr()函数参数重临值的来源

CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形…]) 

 

Ⅱ. repeat···· end repeat: 

Ⅳ. LABLES 标号: 

+———————–+ 
1 row in set (0.00 sec) 

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 | 
+———————————————–+ 

那样,大家的2个MySQL存储进度就已毕了,是还是不是很不难啊?看不懂也没涉及,接下去,大家详细的讲解。 

IN
输入参数:表示该参数的值必须在调用存储进度时指定,在蕴藏进程中修改该参数的值无法被重返,为暗中同意值 

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 ; 

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存储进程平凡有以下优点: 

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_FO奔驰M级MAT (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为星期日 
DAYOFYEASportage (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) //小时

Ⅰ. 变量定义 

(4). 变量 

Ⅲ. loop ·····end loop: 

(2). 表明分割符 

(1).字符串类 

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 ; 

mysql> select round(1.56); 
+————-+ 
| round(1.56) | 
+————-+ 
| 2 | 
+————-+ 
1 row in set (0.00 sec) 

mysql > SELECT @p_inout; 
+———-+ 
| @p_inout | 
+———-+ 
| 2 | 
+———-+ 

mysql > DELIMITER // 
mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout
int) 
-> BEGIN 
-> SELECT p_inout; 
-> SET p_inout=2; 
-> SELECT p_inout; 
-> END; 
-> // 
mysql > DELIMITER ; 

(3).存储进度能落到实处较快的实践进程。如若某一操作包涵大批量的Transaction-SQL代码或个别被频仍实施,那么存储进程要比批处理的履行进程快很多。因为存储进程是预编译的。在第一回运行多个存储进程时查询,优化器对其进行分析优化,并且付诸最终被储存在系统表中的实践安排。而批处理的Transaction-SQL语句在每一回运转时都要拓展编译和优化,速度相对要慢一些。 

mysql> SELECT @p_out; 
+——-+ 
| p_out | 
+——-+ 
| 2 | 
+——-+ 

+——+ 
| p_in | 
+——+ 
| 2 | 
+——+ 

注: 

DROP PROCEDURE 

更改用CREATE PROCEDURE
建立的预先指定的储存进度,其不会潜移默化相关存储进度或存储作用。 

个中的变量在其效率域范围内拥有更高的优先权,当执行到end。变量时,内部变量消失,此时曾经在其功效域外,变量不再可知了,应为在储存 
经过外再也不或然找到那些发明的变量,可是你能够透过out参数或然将其值指派 
给会话变量来保存其值。 

3. MySQL存储进程**的创建 

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

CHA本田UR-VSET(str) //重返字串字符集 
CONCAT (string2 [,… ]) //连接字串 
INST奥迪Q3 (string ,substring )
//重回substring第一回在string中出现的职位,不设有重返0 
LCASE (string2 ) //转换来小写 
LEFT (string2 ,length ) //从string2中的左侧起取length个字符 
LENGTH (string ) //string长度 
LOAD_FILE (file_name ) //从文件读取内容 
LOCATE (substring , string [,start_position ] )
同INST普拉多,但可指定先导地点 
LPAD (string2 ,length ,pad )
//重复用pad加在string初始,直到字串长度为length 
LTXC60IM (string2 ) //去除前端空格 
REPEAT (string2 ,count ) //重复count次 
REPLACE (str ,search_str ,replace_str )
//在str中用replace_str替换search_str 
帕杰罗PAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length 
ENCORET牧马人IM (string2 ) //去除后端空格 
STLacrosseCMP (string1 ,string2 ) //逐字符相比两字串大小, 
SUBSTRING (str , position [,length ])
//从str的position开始,取length个字符, 
注:mysql中处理字符串时,专擅认同第一个字符下标为1,即参数position必须超出等于1 

ⅰ. 在MySQL客户端拔取用户变量 

或者 

**(1). 格式 

(1).存储进程增强了SQL语言的效果和灵活性。存储进度能够用流控制语句编写,有很强的灵活性,可以做到复杂的判断和较复杂的运算。 

(2).数学类 

(2).存储进度允许标准组件是编程。存储进程被成立后,可以在先后中被频仍调用,而不必再度编排该存储进度的SQL语句。而且数据库专业人士可以每11日对存储进程进展修改,对运用程序源代码毫无影响。 

(1). 变量功用域 

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

大家得以用 

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 ; 

Ⅰ. IN参数例子 

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

大家像知道3个数据库上边有那个表,我们一般采纳show
tables;举行查看。那么大家要查阅有些数据库下面的仓储进程,是或不是也足以应用呢?答案是,大家得以查阅有个别数据库下边的蕴藏进程,但是是令一钟方式。 

mysql> select substring(‘abcd’,0,2); 
+———————–+ 
| substring(‘abcd’,0,2) | 
+———————–+ 

(1)那里须要小心的是DELIMITE兰德酷路泽 //和DELIMITEQashqai;两句,DELIMITE途睿欧是分割符的意趣,因为MySQL专擅认同以”;”为分隔符,假如我们从未声明分割符,那么编译器会把仓储进程当成SQL语句进行拍卖,则存储进度的编译进度会报错,所以要优先用DELIMITE劲客关键字注脚当前段分隔符,那样MySQL才会将”;”当做存储进程中的代码,不会履行那么些代码,用完了之后要把分隔符还原。 

(5). 注释 

mysql > DELIMITER // 
mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int) 
-> BEGIN 
-> SELECT p_in; 
-> SET p_in=2; 
-> SELECT p_in; 
-> END; 
-> // 
mysql > DELIMITER ; 

mysql> DELIMITER // 
mysql> CREATE PROCEDURE proc1(OUT s int) 
-> BEGIN 
-> SELECT COUNT(*) INTO s FROM user; 
-> END 
-> // 
mysql> DELIMITER ; 

(3)进度体的起来与停止使用BEGIN与END进行标识。 

透过引用复合语句的标号,来从新先河复合语句 

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

此处先举个例证: 

mysql> select round(1.23); 
+————-+ 
| round(1.23) | 
+————-+ 
| 1 | 
+————-+ 
1 row in set (0.00 sec) 

1.仓储进程简介 

骨子里,关于评释分割符,上边的笺注已经写得很精晓,不须求多说,只是微微要小心一点的是:假使是用MySQL的Administrator管理工具时,可以直接创制,不再需求讲明。 

创建: 

就可以查阅当前储存进度的详实。 

壹个存储过程是四个可编程的函数,它在数据库中开创并保留。它可以有SQL语句和部分异样的控制结构组成。当希望在不一致的应用程序或平台上实施同一的函数,或许封装特定功用时,存储进程是不行管用的。数据库中的存储进程可以当作是对编程中面向对象方法的模拟。它同意控制数据的拜访格局。 

里头,datatype为MySQL的数据类型,如:int, float, date, varchar(length) 

mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,’
World’); 
mysql > SET @greeting=’Hello’; 
mysql > CALL GreetWorld( ); 
+—————————-+ 
| CONCAT(@greeting,’ World’) | 
+—————————-+ 
| Hello World | 
+—————————-+ 

(2)可以设定小数位数,再次来到浮点型数据 

或者 

mysql > SET @p_out=1; 
mysql > CALL sp_demo_out_parameter(@p_out); 
+——-+ 
| p_out | 
+——-+ 
| NULL | 
+——-+ 

答案是:大家得以查看存储进程的详实,不过须求用另一种艺术: 

6.MySQL存储进度的修改 

咱俩常用的操作数据库语言SQL语句在进行的时候须求要先编译,然后实施,而存储进度(Stored
Procedure)是一组为了做到一定功效的SQL语句集,经编译后存储在数据库中,用户通过点名存储进度的名字并加以参数(假若该存储进程带有参数)来调用执行它

5. MySQL存储进度的查询 

mysql > SET @z=1+2+3; 
mysql > SELECT @z; 
+——+ 
| @z | 
+——+ 
| 6 | 
+——+ 
ⅱ. 在储存进度中行使用户变量 

mysql> select substring(‘abcd’,1,2); 
+———————–+ 
| substring(‘abcd’,1,2) | 
+———————–+ 
| ab | 
+———————–+ 
1 row in set (0.02 sec) 
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2)
//去除指定地方的指定字符 
UCASE (string2 ) //转换来大写 
RIGHT(string2,length) //取string2最后length个字符 
SPACE(count) //生成count个空格 

(4). ITERATE迭代 

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 ; 

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

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

注意: 

开展查询。 

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 ; 

Ⅱ. case语句: 

+——-+ 
| p_out | 
+——-+ 
| 2 | 
+——-+ 

标明可以用在begin repeat while 或然loop
语句前,语句标号只万幸合法的讲话后面使用。可以跳出循环,使运维指令达到复合语句的末梢一步。 

Ⅲ. 用户变量 

壹,用户变量名一般以@发轫 
贰,滥用用户变量会导致程序难以通晓及管制 

ABS (number2 ) //绝对值 
BIN (decimal_number ) //十进制转二进制 
CEILING (number2 ) //向上取整 
CONV(number2,from_base,to_base) //进制转换 
FLOOTiguan (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为小数位数] 

mysql > DELIMITER // 
mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int) 
-> BEGIN 
-> SELECT p_out; 
-> SET p_out=2; 
-> SELECT p_out; 
-> END; 
-> // 
mysql > DELIMITER ; 

7. MySQL存储进程的删除 

删去2个囤积进程比较简单,和删除表一样: 

MySQL存储进程的参数用在存储过程的定义,共有两种参数类型,IN,OUT,INOUT,格局如: 

(4).存储进度能过减弱互联网流量。针对同三个数据库对象的操作(如查询、修改),假诺这一操作所波及的Transaction-SQL语句被集团程存储进度,那么当在客户总计机上调用该存储进程时,互联网中传递的只是该调用讲话,从而大大增添了互联网流量并下跌了网络负载。 

双模杠:– 

mysql > SET @p_inout=1; 
mysql > CALL demo_inout_parameter(@p_inout) ; 
+———+ 
| p_inout | 
+———+ 
| 1 | 
+———+ 

(2). 条件语句 

Ⅱ. 变量赋值 

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

施行结果: 

+———+ 
| p_inout | 
+———+ 
| 2 | 
+———+ 

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

(3).日期时间类 

(2)存储进程根据必要可能会有输入、输出、输入输出参数,那里有二个出口参数s,类型是int型,如若有八个参数用”,”分割开。 

OUT 输出参数:该值可在储存过程里面被改成,并可回到 

上述可以观看,p_in即使在储存进程中被涂改,但并不影响@p_id的值 

Ⅰ. while ···· end while: 

创建: 

Ⅲ. INOUT参数例子 

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 ; 

(3). 参数 

(5).存储进程可被看成一种安全体制来充裕利用。系统管理员通过举办某一储存进度的权柄举行限定,可以落到实处对相应的多寡的拜会权限的限定,防止了非授权用户对数据的造访,保险了数据的平安。 

(3). 循环语句 

mysql> SELECT @p_in; 
+——-+ 
| @p_in | 
+——-+ 
| 1 | 
+——-+ 

该风格相似用于单行注释 
c风格: 一般用于多行注释 
例如: 

mysql > SET @p_in=1; 
mysql > CALL demo_in_parameter(@p_in); 
+——+ 
| p_in | 
+——+ 
| 1 | 
+——+ 

例如: 

MySQL存储进程可选拔二种风格的表明 

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 ; 

用call和你进度名以及2个括号,括号里面依据需求,插手参数,参数包含输入参数、输出参数、输入输出参数。具体的调用方法可以参考下边的例证。 

从MySQL的报表中剔除一个或八个存储进程。 

MySQL存储进度始建的格式:CREATE PROCEDURE 进程名
([进度参数[,…]]) 
[特性 …] 过程体 

相关文章