第三方打鬼地方
Mysql存储过程:http://wenku.baidu.com/view/3b40ae3a376baf1ffc4fad8a.html
http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
http://javalover00000.iteye.com/blog/684006
http://bbs.chinaunix.net/thread-1783409-1-1.html
头一次写mysql,写了两个简单的
简单的存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS wy_proc $$
CREATE PROCEDURE wy_proc (IN tname varchar(50),out outvalue datetime)
begin
set outvalue = CAST('1858-11-17' as datetime);
select outvalue;
END $$
DELIMITER ;
简单的函数:
DELIMITER $$
DROP FUNCTION IF EXISTS wy_fun $$
CREATE FUNCTION wy_fun (num varchar(50)) RETURNS datetime
begin
declare outvalue datetime;
set outvalue = CAST('1858-11-17' as datetime);
RETURN outvalue;
END $$
DELIMITER ;
查询mysql数据库中的存储过程:
show procedure status; 查看所有的存储过程
SHOW CREATE PROCEDURE pr_add;查看指定的存储过程,不管这个指定的存储过程是否有参数,这里都不要带();
因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
call pr_add(10, null);
DROP PROCEDURE IF EXISTS p2;删除存储过程时不管这个指定的存储过程是否有参数,这里都不要带();
Mysql分页查询通用存储过程,假设所用数据库为guestbook: use guestbook; mysql -u root -p < pageResult.sql; 调用:call prc_page_result(1, "*", "Tablename", "", "columnname", 1, "PKID", 25); |
CREATE OR REPLACE PROCEDURE ADD_PARTITION
as
drop_sql_stmt varchar2 (1000);
add_sql_stmt varchar2 (1000);
index_sql_stmt varchar2 (1000);
err_msg varchar2 (300);
NEW_RECORD varchar2 (300);
begin
drop_sql_stmt :='';
add_sql_stmt :='';
index_sql_stmt :='';
err_msg:='';
NEW_RECORD :='';
for tab in (select TABLE_NAME,MAX_RECORD,MIN_RECORD,TBS_NAME,TIME_LONG,NEXT_TIME,table_type from v_t_table_partition_0415 where (sysdate+1/(24*12)) >= NEXT_TIME) loop
--判断时间粒度
if tab.time_long='MIN' then
NEW_RECORD := to_char(to_date(tab.MAX_RECORD,'yyyymmddhh24miss')+1/24/60*15,'yyyymmddhh24miss');
elsif tab.time_long='DAY' then
NEW_RECORD := to_char(to_date(tab.MAX_RECORD,'yyyymmddhh24miss')+1,'yyyymmddhh24miss');
end if;
if tab.table_type='1' then
--drop partition
drop_sql_stmt:='alter table '||tab.TABLE_NAME ||' drop partition P'||tab.MIN_RECORD;
dbms_output.put_line('sql_stmt:'||drop_sql_stmt);
EXECUTE IMMEDIATE drop_sql_stmt;
end if;
--add partition
add_sql_stmt:='alter table '||tab.TABLE_NAME ||' add partition P'||NEW_RECORD||' values less than (to_date('''||NEW_RECORD||''',''yyyymmddhh24miss'')) tablespace '||tab.TBS_NAME ;
dbms_output.put_line('sql_stmt:'||add_sql_stmt);
EXECUTE IMMEDIATE add_sql_stmt;
--索引重建
--index_sql_stmt:='alter index '||tab.TABLE_NAME||'_UNIDX rebuild ';
-- dbms_output.put_line('sql_stmt:'||index_sql_stmt);
-- EXECUTE IMMEDIATE index_sql_stmt;
end loop;
EXCEPTION
WHEN OTHERS THEN
err_msg := ' partition unsuccessfully! Error Information:'|| SQLERRM;
DBMS_OUTPUT.put_line ('err_msg: '||err_msg);
end;
mysql存储过程常用的函数类型
一.字符串类
CHARSET(str) //返回字串字符集
CONCAT (string2 [,... ]) //连接字串
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0
LCASE (string2 ) //转换成小写
LEFT (string2 ,length ) //从string2中的左边起取length个字符
LENGTH (string ) //string长度
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置
LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
注:mysql中处理字符串时,默认第一个字符下标为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) //去除指定位置的指定字符239=219
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格
二.数学类
ABS (number2 ) //绝对值
BIN (decimal_number ) //十进制转二进制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //进制转换
FLOOR (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 ) //返回符号,正负或0
SQRT(number2) //开平方
三.日期时间类
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_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差 183+243=
DAY (date ) //返回日期的天 189+249=438-66=372
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (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) //分
附:可用在INTERVAL中的类型
DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR
一、MySQL 创建存储过程
“pr_add” 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。
drop procedure if exists pr_add;
-- 计算两个数之和
create procedure pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c; -- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。
*/
end;
二、调用 MySQL 存储过程
call pr_add(10, 20);
执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。
set @a = 10;
set @b = 20;
call pr_add(@a, @b);
三、MySQL 存储过程特点
创建 MySQL 存储过程的简单语法为:
create procedure 存储过程名字()
(
[in|out|inout] 参数 datatype
)
begin
MySQL 语句;
end;
MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。
1. MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
2. MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。
create procedure pr_add
(
@a int, -- 错误
b int -- 正确
)
3. MySQL 存储过程的参数不能指定默认值。
4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。
create procedure pr_add
(
a int,
b int
)
as -- 错误,MySQL 不需要 “as”
begin
mysql statement ...;
end;
5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
create procedure pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;
7. MySQL 存储过程中的注释。
/*
这是个
多行 MySQL 注释。
*/
declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)
if a is null then # 这也是个单行 MySQL 注释
set a = 0;
end if;
...
end;
8. 不能在 MySQL 存储过程中使用 “return” 关键字。
set c = a + b;
select c as sum;
/*
return c; -- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。
*/
end;
9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”
call pr_no_param();
10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
call pr_add(10, null);
存储过程的基本结构讲解
DELIMITER //
CREATE PROCEDURE `p2` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
SELECT 'Hello World !';
END//
下面讲解下存储过程的组成部分:
1)首先在定义好终结符后,使用CREATE PROCEDURE+存储过程名的方法创建存储过程,LANGUAGE选项指定了使用的语言,这里默认是使用SQL。
2)DETERMINISTIC关键词的作用是,当确定每次的存储过程的输入和输出都是相同的内容时,可以使用该关键词,否则默认为NOT DETERMINISTIC。
3) SQL SECURITY关键词,是表示调用时检查用户的权限。当值为INVOKER时,表示是用户调用该存储过程时检查,默认为DEFINER,即创建存储过程时检查。
4) COMMENT部分是存储过程的注释说明部分。
5)在BEGIN END部分中,是存储过程的主体部分。
存储过程的参数
DELIMITER //
CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20))
BEGIN
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
INSERT INTO table1 VALUES (a);
SET str = 'I am a string';
SELECT CONCAT(str,paramstr), today FROM table2 WHERE b>=5;
END //
7)MYSQL存储过程的语法结构
MYSQL存储过程中支持IF,CASE,ITERATE,LEAVE LOOP,WHILE和REPEAT等语法结构和语句,在本文中,着重介绍IF,CASE和WHILE语法,因为它们使用的最为广泛。
IF 语句
if语句使用的是if…then end if的语法结构,例子如下:
DELIMITER //
CREATE PROCEDURE `proc_IF` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
IF variable1 = 0 THEN
SELECT variable1;
END IF;
IF param1 = 0 THEN
SELECT 'Parameter value = 0';
ELSE
SELECT 'Parameter value <= 0';
END IF;
END //
CASE语句
当有很多IF语句时,就应该考虑使用CASE语句了,它是多分支选择语句,有两种写法:
第一种写法:
DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
CASE variable1
WHEN 0 THEN
INSERT INTO table1 VALUES (param1);
WHEN 1 THEN
INSERT INTO table1 VALUES (variable1);
ELSE
INSERT INTO table1 VALUES (99);
END CASE;
END //
另外一种写法:
DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
CASE
WHEN variable1 = 0 THEN
INSERT INTO table1 VALUES (param1);
WHEN variable1 = 1 THEN
INSERT INTO table1 VALUES (variable1);
ELSE
INSERT INTO table1 VALUES (99);
END CASE;
END //
WHILE语句
DELIMITER //
CREATE PROCEDURE `proc_WHILE` (IN param1 INT)
BEGIN
DECLARE variable1, variable2 INT;
SET variable1 = 0;
WHILE variable1
INSERT INTO table1 VALUES (param1);
SELECT COUNT(*) INTO variable2 FROM table1;
SET variable1 = variable1 + 1;
END WHILE;
END //
8) MYSQL存储过程中的游标
MYSQL中的游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标能从包括多条数据记录的结果集中每次提取一条记录的机制。MYSQL中的游标的语法如下:
DECLARE cursor-name CURSOR FOR SELECT ...; /* 声明一个游标,名称为cursor-name,并用CURSOR FOR SELECT*/
DECLARE CONTINUE HANDLER FOR NOT FOUND /*指定当遍历完结果集后,游标如何继续处理*/
OPEN cursor-name; /*打开游标 */
FETCH cursor-name INTO variable [, variable]; /* 将变量赋值给游标*/
CLOSE cursor-name; /*使用后关闭游标*/
一个具体的例子如下:
DELIMITER //
CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)
BEGIN
DECLARE a, b, c INT;
DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
OPEN cur1;
SET b = 0;
SET c = 0;
WHILE b = 0 DO
FETCH cur1 INTO a;
IF b = 0 THEN
SET c = c + a;
END IF;
END WHILE;
CLOSE cur1;
SET param1 = c;
END //
其中,DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;
表示将从table1表中选取col1列的内容放到游标curl中,即每次游标遍历的结果都放在curl中,要注意游标只能向前遍历,而不能向后,并且注意,游标不能更新,最后关闭游标。
软件测试的目的:在软件正式使用之前,尽可能多地发现并排除软件中潜在的和隐藏的错误,保证给用户提供一个高质量的系统。
4、软件测试阶段:
①单元测试:对每个完成的模块进行测试,保证每个模块的正确运行。
②集成测试:单元测试之后,把各个功能模块组装起来进行测试,发现与接口相关的问题。
③验收测试:测试
5、黑盒测试,白盒测试
黑盒测试:又称功能测试,是一种从用户观点出发的测试
白盒测试:也称结构测试或逻辑驱动测试或基于程序的测试。白盒测试一般测试分析程序的内部结果,可以使用一定的测试工具来进行。
据库维护
①数据库备份。
②数据库安全性。
a、数据库数据的安全:它应能确保当数据库系统downtime时,当数据库数据存储媒体被破坏时以及当数据库用户误操作时,数据库数据信息不至于丢失。
b、数据库系统不被非法用户侵入:它应尽可能地堵住潜在的各种漏洞,防止非法用户利用它们侵入数据库系统。对于数据库数据的安全问题,数据库管理员可以参考有关系统双机热备份功能以及数据库的备份和恢复的资料。