日历

2010年六月
« 5月   7月 »
 123456
78910111213
14151617181920
21222324252627
282930  

最近评论

    linux企业应用

    mysql第十一部分 MYSQL与ORACLE SQLSERVER DB2的区别

    下面,我们来看一下mysql中的一些细节问题,比如alter(修改)和drop(删除),oracle/sql server /db2/ANSI comparison,style,bugs,featere requests,resources等。
        首先看ALTER AND DROP
    mysql> show procedure status where db=’db1’//
        显示所有的存储过程,太多,这里就不列出来了,发现p20过程有一个说明,下面更改一下p20的comment说明,那么我们可以这样:
    mysql> alter procedure p20 comment ‘modify comment’//
    Query OK, 0 rows affected (0.00 sec)

    mysql> show procedure status where name=’p20’//
    +—–+——+———–+—————-+———————+———————+—————+—————-+
    | Db  | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment        |
    +—–+——+———–+—————-+———————+———————+—————+—————-+
    | db1 | p20  | PROCEDURE | root@localhost | […]

    linux/unix基础知识

    mysql第十部分 如何查看创建的存储过程

    到目前为止,我们已经创建了很多的存储过程了,他们也都保存在mysql数据库中,如果我们要查看mysql实际上保存了什么信息,可以有四种方法,两种使用show语句,两种使用select语句,他们的格式如下:
    SHOW CREATE PROCEDURE / SHOW CREATE FUNCTION
    SHOW PROCEDURE STATUS / SHOW FUNCTION STATUS
    SELECT FROM MYSQL.PROC
    SELECT FROM INFORMATION_SCHEMA
    下面针对以上几种语句举例说明一下。
    1、使用show create procedure获得存储过程的信息,和show create table等mysql语法类似,这条语句不返回创建时设定的返回值,而是返回过程的语句信息:

    linux/unix基础知识

    mysql第九部分 mysql的游标

        下面开始学习游标,首先看一下游标的基本事务比如:声明游标,打开游标,从游标读取,关闭游标,他们的语法如下:
    DECLARE cursor-name CURSOR FOR SELECT…;
    OPEN cursor-name;
    FETCH cursor-name INTO variable [,variable];
    CLOSE cursor-name;
        那么现在就看几个游标的例子。       
    mysql> create procedure pro19(out value int)
        -> begin
        -> declare x,y int;
        -> declare cursor_1 cursor for select filed from t1;
        -> declare continue handler for not found
        -> set y=1;
        -> open cursor_1;
        -> repeat
        ->     fetch cursor_1 into x;
        -> until […]

    linux企业应用

    mysql第八部分 存储过程的异常处理

    在这部分,主要讲解一些简单的问题、异常处理器和条件。下面首先看几个简单的问题:
    1、log of failures 错误日志
    在INSERT失败时,希望将错误记录到日志文件中,以便需要时能查看到错误记录,当然也可以将错误时间、出错原因等记录到指定的文件中。
    2、下面做一个例子,创建一个主键表,一个外键表,在mysql中由于使用了InnoDB存储引擎,所以外键关联检查是打开的,所以向外键表中插入非主键表的值时,是不会成功的,操作过程和结果如下:
    mysql> create table t2
        -> (s1 int,primary key(s1))
        -> engine=innodb;//
    Query OK, 0 rows affected (0.28 sec)

    linux企业应用

    mysql第七部分 mysql存储过程的循环控制指令

        在mysql存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了。
        这几个循环语句的格式如下:
    WHILE……DO……END WHILE
    REPEAT……UNTIL END REPEAT
    LOOP……END LOOP
    GOTO。

    linux企业应用

    mysql第六部分 存储过程的变量声明if和case指令

        声明局部变量
        DECLARE仅被用在BEGIN……END复合语句中声明局部变量,并且必须在复合语句的开头,在任何其他语句之前。DECLARE声明局部变量的语法是:DECLARE var_name[…] type [DEFAULT value],声明的变量如果没有设定初始值,那么系统默认为NULL,如果设定初始值,初始值可以使一个表达式,不需要为一个常数。局部变量的作用范围在它被声明的BEGIN……END块内,如果在嵌套的块中,局部变量只声明了一次,这个变量也可以在嵌套的块中使用。
    mysql> create procedure pro2()
        -> begin
        -> declare x int;
        -> declare y int;
        -> set x=2;
        -> set y=4;
        -> insert into t1(filed) values(x);
        -> select filed * x from t1 where filed >=y;
        -> end;//
    Query OK, 0 rows affected (0.01 sec)

    linux企业应用

    mysql第五部分 mysql存储过程中的参数变量

    下面,学习怎样在存储过程中使用参数,首先看下面4个例子:
    1、create procedure p1() ……
    2、create procedure p2([IN] name data-type) ……
    3、create procedure p3(OUT name data-type) ……
    4、create procedure p4(INOUT name data-type) ……
    上面第一个例子的没有参数;第二个例子有一个输入参数(IN是input的缩写,而且参数默认是输入参数,所以IN可以省略不写);第三个例子中有一个输出参数;第四个例子中的参数既能作为输入参数也可以作为输出参数。根据这四个例子,再举几个实际的例子,第一种类型的例子在这里就不再列举了,“第二部分mysql为什么使用存储过程”使用的例子就是没有参数的情况。
        首先看一下输入的例子:
    mysql> create procedure p6(i int) set @x=i;
    Query OK, 0 rows affected (0.01 sec)

    linux/unix基础知识

    mysql第四部分 mysql的特征句子

       1、首先来看几个能反映存储过程特性的子句,子句在存储过程之后(也就是p20()之后),存储过程的主题之前(也就是sql语句之前)。
    mysql> create procedure p20()
        ->  language sql                #注意,每个->之后都要有一个空格,否则,辛辛苦苦将全部的存储过程语句写完后,会提示错误
        ->  not deterministic     #也可以在每行的最后一个词之后加一个空格
        ->  sql security definer
        ->  comment ‘a procedure’
        ->  select current_date,rand() from t1;
    调用一下存储过程,看一下结果:
    mysql> call p20;
    +————–+——————+
    | current_date | rand()           |
    +————–+——————+
    | 2010-06-25   | 0.25000709225424 |
    +————–+——————+
    1 row in set (0.00 sec)
    Query OK, 0 rows affected (0.00 sec)
        实际上并没有t1这个表中的数据!!只是返回了当前日期和一个随机数:lol: 那么这些子句,哪些是需要的,哪些是不需要的呢?接着看。

    linux企业应用

    mysql第三部分 在mysql中那些是合法的存储语句

         在Mysql存储过程使用包含INSERT, UPDATE,  DELETE, SELECT, DROP, CREATE, REPLACE等关键词的sql语句都是合法的sql语句,需要特别注意的是如果代码中包含MySQL扩充功能,那么代码将不能移植。在标准SQL语句中:任何数据库定义语言都是合法的,如:
    mysql> create procedure p() delete from t1;
        SET、COMMIT以及ROLLBACK也是合法的,如:
     mysql> create procedure p2() set @x=5;
        MySQL的附加功能:任何数据操作语言的语句都是合法,比如:mysql> create procedure p3() drop table t1;
       MySQL扩充功能:直接的SELECT也是合法的,比如:mysql> create procedure p4() select ‘a’;
        在SQL标准中,没有把DDL语句的功能定义为核心功能,所以在mysql中,将DDL功能只算一个附加功能。

    linux企业应用

    mysql 第二部分 mysql为什么使用存储过程

    存储过程对于MySQL来说是新的功能,它有以下几个优点:
        1、 存储过程是已经被认证的技术!虽然在Mysql中是新技术,但是相同功能的函数在其他DBMS中早已存在,而它们的语法往往是相同的。因此我们可以从其他人那里获得这些概念,也有很多我们可以咨询或者雇用的经验用户,还有许多第三方的文档可供我们阅读。          
        2、存储过程使系统运行的更快!虽然我们暂时不能在Mysql上证明这个优势,用户得到的体验也不一样。我们可以说的就是Mysql服务器在缓存机制上做了改进,就像Prepared statements (预处理语句)所做的那样。由于没有编译器,因此SQL存储过程不会像外部语言(如C)编写的程序运行起来那么快。但是提升速度的主要方法却在于能否降低网络信息流量。如果我们需要处理的是需要检查、循环、多语句但没有用户交互的重复性任务,我们就可以使用保存在服务器上的存储过程来完成。这样在执行任务的每一步时服务器和客户端之间就没那么多的信息来往了。          
        3、存储过程可重用! 如果我们改变了主机的语言,这对存储过程不会产生影响,因为它是数据库逻辑而不是应用程序。存储过程是可以移植的!当我们用SQL编写存储过程时,我们就知道它可以运行在Mysql支持的任何平台上,不需要我们额外添加运行环境包,也不需要为程序在操作系统中设置执行许可,或者为我们的不同型号的电脑配置不同的包。这就是与Java、C或PHP等外部语言相比使用SQL语句的优势。不过, 使用外部语言例程的好处还是很好的选择,它们只是没有以上的优点而已。
        4、存储过程可以被保存 !比如我们编好了一个程序,例如显示银行事务处理中撤销支票的信息,那些想要了解支票信息的人就可以找到我们的程序。它会以源代码的形式保存在数据库中。
        5、存储过程可以移植。mysql支持SQL 2003标准,同样支持DB2和Mimer数据库,但不支持Oracle、SQL Server数据库。

    linux/unix基础知识

    编辑MYSQL时出错:No curses/termcap library found

    系统环境:CentOS 5.4
    系统是默认安装,安装的软件不是很多,在编辑MYSQL时:
    [root@myfreelinux mysql-5.0.56]#./configure –prefix=/usr/local/mysql –with-charset=gb2312  –with-extra-charsets=all
    编译执行后出现如下错误:
    checking for termcap functions library… configure: error: No curses/termcap library found
     
    解决方法:
    编译时加上ncurses库的路径即可解决,即
    [root@myfreelinux mysql-5.0.56]#./configure –prefix=/usr/local/mysql –with-charset=gb2312  –with-extra-charsets=all –with-named-curses-libs=/usr/lib/libncurses.so.5

    linux/unix基础知识

    linux的ext4文件系统简介

        ext4是第四代扩展文件系统,是下一代的日志文件系统,向前向后兼容。尽管ext4目前还不是各操作系统的默认文件系统,但它将成为下一代Linux发行版的默认文件系统。ext4的伸缩性非常强大,最大支持磁盘空间将达到100万TB。

    扩展文件系统的简史

        Linux第一个支持的文件系统是Minix文件系统。这个文件系统有严重的性能问题,因此出现了另一个针对Linux的文件系统,即扩展文件系统。第1代扩展文件系统(ext1)由Remy Card 设计,1992年4月引入到Linux中。ext1文件系统是第一个使用虚拟文件系统(VFS)交换的文件系统。虚拟文件系统交换是在0.96c内核中实现的,文件系统最大支持2GB。

        第2代扩展文件系统(ext2)也是由Remy Card实现的,1993年1月引入到Linux中。它借鉴了当时文件系统(比如 Berkeley Fast File System [FFS])的先进想法。ext2支持的最大文件系统为2TB,2.6内核将该文件系统支持的最大容量提升到32TB。

    linux/unix基础知识

    mysql 第一部分 简介 定义和实例

        简介:在这里,简单的来说是介绍了“存储过程、触发器、视图、信息架构视图”
        定义和实例:存储过程是一种存储在数据库中的程序(就像正规语言里的子程序一样),准确的来说,MySQL支持的“routines  (例程)”有两种:一是存储过程,二是在其他SQL语句中可以返回值的函数(使用起来和Mysql预装载的函数一样,如pi() )。在本书里面会更经常使用存储过程,因为这是使用习惯。
        一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。  在这里对局部变量,异常处理,循环控制和IF条件句有新的语法定义。           下面是一个包括存储过程的实例声明:
    CREATE PROCEDURE procedure1      /* 存储过程名*/          
    (IN parameter1 INTEGER)                    /*参数*/          
    BEGIN                                                           /*语句块头*/          
    DECLARE variable1 CHAR(10);         /* 变量声明 */           
    IF parameter1 = 17 THEN                   /* IF条件开始*/            
    SET variable1 = ‘birds’;                        /*   赋值*/           
    ELSE            
    SET variable1 = ‘beasts’;                   /* 赋值*/           
    END IF;                                                    /* IF结束*/          
      INSERT INTO table1 VALUES (variable1);/*  SQL的插入数据的语句*/          
    END                                                      /*  语句块结束*/          
    以后将会介绍你可以利用存储过程做的工作的所有细节。同时将介绍新的数据库对象——触发器,因为触发器和存储过程的关联是必然的。

    linux/unix基础知识

    shell语法中test命令例子详解

        test的命令比较多,而且非常好用,初始的时候,可以使用test进行判断,后期熟悉的话可以用[]取代test,进行判断,在这里仅使用test进行判断语句的逻辑关系。
        首先可一个语法:判断条件 &&  语句一||语句二
        如果判断条件为真的话,执行&&后的语句一,||后的语句二执行;如果判断条件为假的话,&&后的语句一不执行,只执行||后的语句二。下面,test的每一个判断语句,都将举一个例子实际运行一下,例子更加直观的说明问题。

    一、某个文件是否存在或具有某个类型的判断
    1、test –e File     文件是否存在
    [root@myfreelinux tmp]# test -e 3.txt && echo “exist” || echo “not exist”
    not exist
    [root@myfreelinux tmp]# test -e 2.txt && echo “exist” || echo “not exist”
    exist

    linux/unix基础知识

    正则表达式简介

         为什么要使用正则表达式
        linux/UNIX中提供了许多命令和工具,它们可以在文件中查找(Search)字符串或替换(Replace)字符串的功能。像grep,vi,sed,awk等,不论是查找字符串还是替换字符串,都得先告诉这些命令所要查找(被替换)的字符串是什么,如果未能事先明确知道所要查找(被替换)的字符串是什么,只知道这个字符串存在的范围或特征时,例如:(一)查找”T0.c”,”T1.c”,”T2.c”…”T9.c” 当中的任一字符串。(二)查找至少存在一个”A”的任意字符串。这种情況下,如何告诉执行查找字符串的命令所要查找的字符串是什么。例(一) 中,要查找任一在”T”与”.c” 之间存在一个阿拉伯数字的字符串;当然可以用列举的方式,一一把所要查找的字符串告诉执行命令的命令。但例(二) 中符合该条件的字符串有无限种可能,势必无法一一列举。此时,便需要另一种字符串表示的方法。

        什么是正则表达式:正则表达式(以下简称Regexp)是一种字符串表达的方式。可以指定具有某特征的所有字符串。
        注:为了与一般字符串区别,在这里,在正则表达式的字符串之前皆加 “Regexp”。
        awk程序中常以/…/括住Regexp,以区別于一般字符串。

    AWK的使用

    awk的使用 第十四部分 awk的内部变量

        awk的内部变量的个数不多,在这里介绍的时候就不按照字母顺序排列了,而是按相关性分类说明。

        ARGC         
        ARGC表示命令行上除了选项-F,-v,-f等选项及其所对应的参数之外的所有参数的个数。如果将“awk程序”直接写在命令行上,那么ARGC是不会把“awk程序”计算在内的。

        ARGV         
        ARGV是一个数据,用来记录命令行上的参数的名称。 执行下列命令:
    [root@myfreelinux pub]# awk ‘BEGIN{printf(“ARGC=%d\n”,ARGC);for(a in ARGV)printf(“ARGV[%d]=%s\n”,a,ARGV[a]);}’ inte integer
    ARGC=3
    ARGV[0]=awk
    ARGV[1]=inte
    ARGV[2]=integer
        需要注意当ARGC = 3 时,命令列上只指定了2 个文件。
    awk的参数-F\t 表示以tab 为栏位分隔字符FS(field seporator);-v a=8 是用以初始化程序中的变量。

    AWK的使用

    awk的使用 第十三部分 awk的字符串和数学函数

        awk 的內建函数(Built-in  Functions)        

        一、字符串函数 
        语法:index( 原字符串,寻找的子字符串):
        解释:若原字符串中含有欲找寻的子字符串,则返回该子字符串在原字符串中第一次出现的位置,如果没有出现该子字符串则返回0。
        例如执行:
        [root@myfreelinux pub]# awk ‘BEGIN{print index(“0411-8888-9999″,”-8″)}’
        5   是返回值,实际上检索到“-8”时,“-”在第五位,所以返回值就是5了。

                       
        语法:length(字串)
        解释:返回该字串的长度。 
        例如执行:
    [root@myfreelinux pub]# awk ‘BEGIN{print length(“0411-8888-9999”)}’
    14 是返回值

    AWK的使用

    awk使用 第十二部分 awk主题函数Actions的指令语法

        awk的Actions一般由下列指令(statement)所组成:    
    1、 表达式 ( function calls, assignments..)    
    2、print 表达式列表    
    3、printf( 格式化字符串, 表达式列表)    
    4、if( 表达式 ) 语句 [else 语句]   
    5、while( 表达式 ) 语句    
    6、do 语句 while( 表达式)   
    7、for( 表达式; 表达式; 表达式) 语句    
    8、for( variable in array) 语句    
    9、delete    
    10、break    
    11、continue    
    12、next    
    13、exit [表达式]    
    14、语句
        在awk 中大部分指令和C 语言中的用法一致,这里仅介绍比较常用或容易混淆的指令的用法。

    AWK的使用

    awk的使用 第十一部分 awk中常用的模式

       awk 通过判断模式(Pattern)的值来决定是否执行其后对应的动作(Actions)。首先来看一下awk中几个常见的模式,在前十部分中,有一些模式已经做了介绍,在这里再总结一下:           
      

      1、BEGIN是awk 的保留字,是一种特殊的模式。                
         BEGIN 成立(其值为true)的时机是:“awk 程序一开始执行,还没有读取任何数据之前”。 所以在BEGIN{ Actions} 语法中,Actions只在程序一开始执行时被执行一次。当awk 从数据文件读入数据行后,BEGIN 便不再成立,所以不论数据文件有多少数据行数据,Actions也不会被再次执行。一般情况下,把“与数据文件内容无关”和“只需执行ㄧ次”的部分放在以BEGIN 为模式的Actions中。
        比如:[root@myfreelinux pub]# cat BEGIN.awk
    #!/bin/awk -f
    BEGIN{
    FS=”[ \t:]+”; #设置awk分割字段的默认方式
    RS=””  #设置awk分割数据行的方式

    AWK的使用

    awk的使用 第十部分 使用awk编写递归程序的实例

        awk 中除了函数的参数列(Argument List)上的参数(Arguments)外,所有变量无论在什么地方出现,均被视为全局变量。全局变量的生命周期持续到程序结束。全局变量不论在function外还是function内都可以使用,只要变量名称相同,所使用的就是同一个变量。但是递归函数会调用会调用到函数本身,所以编写这里函数是需要特别注意。
         例如:编辑一个awk脚本程序,内容如下:
    [root@myfreelinux pub]# cat argument.awk
    #!/bin/awk -f
    BEGIN{
    x=35;
    y=45;
    test_variable(x)
    printf(“Return to main: arg1=%d,x=%d,y=%d,z=%d\n”,arg1,x,y,z)
    }
    function test_variable(arg1)