隔离级别
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。
| | |