Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103703905
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-24 21:49:58

隔离级别

dirty read 

可以读未提交的数据,对读的数据不加锁

committed read

只能读提交的数据,对读的数据不加锁

cursor stability 

只能读提交的数据,对读的数据加(S或U锁)

当游标移动到下一行时,原记录上的锁被释放

repeatable read

只能读提交的数据

对读的所有行均加锁 ( S或U锁),并且锁一直保持到事务提交或回滚才释放

锁的类型

共享锁(S):     SHARE

互斥锁(X):    EXCLUSIVE

更新锁(U):    UPDATE

数据库级的锁:

打开数据库时指定封锁方式,可以是共享锁或互斥锁,缺省是 共享锁

关闭数据库时释放锁

示例

DATABASE stores5                        共享方式

DATABASE stores5 EXCLUSIVE            互斥方式

CLOSE DATABASE                      释放锁

事务情形下的加锁与解锁

必须在事务中用 LOCK TABLE 加锁

事务提交或回滚释放锁,不能用 UNLOCK TABLE 释放锁

不能在事务中改变锁的模式

无事务情形下的加锁与解锁

用 LOCK TABLE 加锁,UNLOCK TABLE释放锁

改变锁的模式,先 UNLOCK TABLE,后 LOCK TABLE

用户对等待锁的处理方式: 

等待直到释放       SET LOCK MODE TO WAIT

等待指定的时间     SET LOCK MODE TO WAIT nSeconds

不等待,立即返回   SET LOCK MODE TO NOT WAIT

三种权限

连接权限             CONNECT

资源权限             RESOURCE

数据库管理员权限      DBA

存储过程的SPL语句:

变量定义和赋值

DEFINE, LET

流程控制

 分支控制  IF

循环控制  FOR,FOREACH,WHILE    ,EXIT, CONTINUE

函数调用与返回 CALL, SYSTEM ,RETURN

错误处理和调试 TRACE, ON EXCEPTION, RAISE EXCEPTION

       CREATE PROCEDURE read_address(lastnae CHAR(15))

      RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(5);

      DEFINE p_lname, p_fname CHAR(15);

      DEFINE p_addr CHAR(20);

      DEFINE p_zip CHAR(5);

      SELECT fname, address1, zipcode INTO p_fname, p_addr, p_zip

      FROM customer  WHERE lname=lastname;

      RETURN p_fname, lastname, paddr, p_zip;

   END PPROCEDURE

执行存储过程的三种方式:

使用 EXECUTE PROCEDURE 语句

使用 CALL 语句在一个存储过程中执行另一个存储过程

使用 LET 语句将一个存储过程的执行结果赋给变量

EXECUTE read_address(I,j,k)      

CALL bar(10, 20)   RETURNING   i, j, k;

LET a=read_name(101);

跟踪调试存储过程:

       TRACE 语句把跟踪结果写到一个文件中, 该文件由 SQL 语句 SET DEBUG FILE  指定。

两类变量

局部变量:仅在本存储过程中有效的变量。 局部变量不允许有缺省值

全局变量:在同一用户活动期间, 存储过程中的可被同一数据库的其它存储过程访问的的变量。 全局变量允许有缺省值。

用DEFINE 语句定义变量,其类型可以是除SERIAL 数据类型外 的所有SQL 数据类型。

定义TEXT 或BYTE 类型变量时, 需在其变量前加关键字REFERENCES, 以表明该变量并不含有真正的数据, 而只是指向数据的指针。

       DEFINE x INT;

DEFINE name CHAR(15);

DEFINE this_day DATETIME YEAR TO DAY;

DEFINE dt DATE;

DEFINE tttt REFERENCES TEXT;

DEFINE bbb REFERENCES BYTE;

变量的赋值:

四种方式

利用LET 语句

利用SELECT 或SELECT ... INTO 语句

利用CALL 语句

利用EXECUTE PROCEDURE ...INTO 语句

LET a, b=c, d;

LET a, b=(SELECT empname, empno FROM emp WHERE empno=125);

SELECT empname INTO name FROM emp WHERE empno=120;

EXECUTE PROCEDURE read_address(揝mith?) INTO p_fname, p_lname, p_addr;

CALL read_address(揝mith?) RETURNING p_fname, p_lname, p_addr;

IF语句:

IF str1>str2 THEN  result=1

ELIF str2>str1 THEN result=-1

ELSE result=0;

ENDIF

FOR语句:

FOR 变量 IN (expr1 to expr2 STEP expr3)  语句块   END FOR

FOR 变量  =(expr1 to expr2 STRP expr3)  语句块   END FOR

FOR 变量 IN (expr1, expr2,...)  语句块   END FOR

FOREACH循环:

用 FOREACH 语句可以查询或操作一组记录

FOREACH 隐式定义并打开一个游标

三种格式

FOREACH [WITH HOLD] SELECT ... INTO 语句 语句块 END FOREACH;

FOREACH 游标名[WITH HOLD] FOR SELECT ... INTO 语句 语句块 END FOREACH;

FOREACH EXECUTE PROCEDURE 存储过程名(参数...参数)

    INTO 变量[, 变量[, ...]]    语句块 END FOREACH;

FOREACH 定义的游标在以下情况下关闭:

无行返回

事务提交或回滚导致非保护游标关闭

循环非正常退出(使用EXIT 或 ON EXCEPTION)

异常捕获:on exception 

ON EXCEPTION 语句与RAISE EXCEPTION 语句一起 提供存储过程语言(SPL)的错误 捕获和恢复机制。

       ON EXCEPTION 语句的位置:

ON EXCEPTION 语句是一声明性而非执行性语句, 故应位于任何执行语句之前,  而位于DEFINE 语句之后。

格式

ON EXCEPTION IN (错误号,...)

SET SQL 错误变量 ISAM 错误文本变量   语句块

END EXCEPTION [WITH RESUME]

SYSTEM 语句在存储过程中执行一个操作系统命令

TRACE 语句的三种形式:

TRACE ON :打开跟踪调试, 跟踪所有语句

TRACE OFF :关闭跟踪调试

TRACE PROCEDURE: 对于过程调用,不跟踪过程体,仅跟踪过程的输入和返回值。

触发器:

       CREATE TRIGGER items_ins  INSERT ON items REFERENCING NEW AS post_ins

FOR EACH ROW(EXECUTE PROCEDURE items_pct (post_ins.manu_code))

触发器动作:

       BEFORE 动作:触发器动作先于触发事件

FOR EACH ROW 动作:对触发动作所涉及的每一行,触发 器动作均执行一次

AFTER 动作:  触发器动作后于触发事件

跟踪对表的修改:

CREATE  TRIGGER upqty_i UPDATE OF  quantity ON items

            REFERENCING   OLD AS  pre_upd

            REFERENCING   NEW AS post_upd

            FOR EACH ROW (INSERT INTO log_record

 valueS (pre_upd.item_num, pre_upd.order_num, USER, CURRENT, pre_upd.quantity, post_upd.quantity));

 

Informix的日期格式是由DBDATAE来设置的,默认是mm/dd/yy,可以设置为:

       DBDATE=Y4MD-

       DBDATE=MDY2/

时间相关的函数:

       extend,mdy,interval

       select timestamp+interval(10) hour to hour from table

       extend(timestamp, hour to hour)

       select  current year to day - interval(9) day to day from table

使用BLOB space:

create table emplyee( 

name char(14),

       Pic   BYTE put in imgdbs);

创建临时表:

       create temp table tab_name ( ) with no log;

       select * from tab_name into temp tab_name with no log;

Alter语法的使用:

       Alter table tab_name drop col;

                                    Modify col  integer not null

                                    Add col integer before col2

                                    Modify next size 200;

                                    Lock mode (row);

                                    Type (raw/standard);

       Alter index idx_name to cluster;

       Alter index idx_name to not cluster;                    

Rename column col1 to col2

                     Database db_name1 to db_name2

                     Table tab_name1 to tab_name2

设置表常驻内存:

       set table tab_name MEMORY_RESIDENT;

       set table tab_name        NON_RESIDENT;

失活模式:

       set  index idx_name disable;

       set  trigger tri_name disable;

       set  constraints con_name disable;

 

优化器指示字:

optcompind=0:只按索引考虑连接对

optcompind=1:对于可重复读隔离级别只按索引考虑连接对,否则选择开销最小的方法。

Optcompind=2:总是选择开销最小的方法

Set optimization [high|low|first_rows]

需要设置环境变量:OPT_GOAL

 

set explain on

对UNIX环境是当前目录下的sqlexplain.out

对NT的环境是%INFORMIXDIR%\sqlexpln\username.out

限制空间:

       在使用update statistics期间通过使用环境变量DBUPSPACE可以限制排序操作使用的空间。DBUPSPACE=space-in-kbytes export DBUPSPACE

       数据库服务器内部限制排序操作使用的内存是4M。

 
阅读(681) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~