Informix11.70培训笔记(3)

来源:互联网 发布:数据审计追踪 编辑:程序博客网 时间:2024/05/16 11:29
删除存储过程:(需要指定参数,即使是空参数)
drop procedure proc1(); --删除空参数
drop procedure proc1(int);
drop procedure proc1(varchar);


create procedure proc4()
returning int;
define i,j,sum int;
begin
let i=1;
let j=2;
let sum=(i+j);
end;
return sum;
end procedure;


execute procedure proc4();


create table t3
(
id int,
name varchar(20)
);
insert into t3 values (1,'a1');
insert into t3 values (2,'a2');
insert into t3 values (3,'a3');


create procedure proc5()
returning varchar(20);
define result varchar(20);
begin
select name into result from t3 where id=3;
end;
return result;
end procedure;


execute procedure proc5();


create procedure proc6()
returning varchar(50);
define result varchar(50);
define a,b int;
begin
let a=10;
let b=20;
if(a>b) then
let result= 'a > b';
elif(a==b) then
let result = 'a = b';
else
let result = 'a < b';
end if;
end;
return result;
end procedure;


execute procedure proc6();
echo 'execute procedure proc6()' | dbaccess java2


create procedure proc7()
returning varchar(50);
define i int;
begin
for i=4 to 100
insert into t3 values(i,'a_' || i);
end for;
end;
return 'ok';
end procedure;


execute procedure proc7();
select first 10 * from t3;


判断表的记录是否为空:
if exists(select * from t3);


查看procedure的语句内容:
select tabname from systables where tabname matches '*body*';
select procname,procid from sysprocedures where procname matches 'proc*';
select data from sysprocbody where procid=462;
info columns for sysprocbody;


异常处理:
create procedure proc9()
returning varchar(50);
define result varchar(50);
begin
on exception
rollback work;
let result=' exception raised!';
end exception;
begin work;
delete from t2;
delete from t3;
let result='OK';
commit work;
end;
return result;
end procedure;


-先drop t3表,查看t2表里面的内容
execute procedure proc9();
执行出现异常,t2的内容还存在。
如果不是给触发器使用的存储过程,都应该添加异常处理(触发器本身就是个事务)


存储过程互相调用:
create procedure proc11()
returning int;
define i,result int;
begin
call proc1() returning i;
let result=i;
end;
return result;
end procedure;


execute procedure proc11();


动态sql:
create procedure proc12()
returning varchar(50);
define t1 varchar(100);
begin
let t1='create table tt1(id int)';
execute immediate t1;
end;
end procedure;


execute procedure proc12();


存储过程是手工调用,触发器是自动调用
触发器:(如非有必要,不写触发器,维护与排错都很困难)触发器本身就是事务,调用的存储过程中,不能写事务。
insert  delete  update


针对t2表定义触发器,满足往t2表中录入数据时触发,做什么是通过调用存储过程实现。
info tables;
info columns for t2;


create table t22
(
op varchar(20)
);


create procedure proc20()
begin
insert into t22 values ('insert_t2');
end;
end procedure;


select * from t22; --空记录


定义触发器
create trigger t2_tr1 insert on t2
for each row
(
execute procedure proc20()
);


测试一下:
insert into t2 values(22);
select * from t2;
select * from t22;




一个触发器,调用多个存储过程:
create procedure proc21()
begin
insert into t22 values ('delete_t2');
end;
end procedure;


create trigger t2_tr2 delete on t2
for each row
(
execute procedure proc20(),
execute procedure proc21()
);


delete from t2 where id=22;
select * from t2;
select * from t22;


删除t2表中的数据时,写入到t20中。
create table t20
(
id int
);


drop trigger t2_tr2;


create procedure proc22(tid int)
begin
insert into t20 values(tid);
end;
end procedure;


在删除和录入时有临时表:insert new,delete:old 不能直接使用,需要使用别名引用
create trigger t2_tr2 delete on t2
referencing old as temp
for each row
(
execute procedure proc22(temp.id)
);


select * from t2;
insert into t2 values(1);
insert into t2 values(3);
insert into t2 values(4);




数据库的调整:监控,优化的设置


1、空间的管理
2、sql语句的优化
3、参数调整
4、工具的使用


空间设置:管理方面、优化方面
数据的保存:默认都是保存在相同的位置(rootdbs表空间中)
避免IO的争用:分散数据的保存,通过定义多个表空间实现
数据库是安装在某个表空间上的(默认rootdbs)
onstat -c |grep ROOT


ROOTNAME rootdbs --表空间的名称
ROOTPATH /dbs/rootdbs --文件或设备
ROOTOFFSET 0 --偏移量,文件的偏移量都是0,设备非0值(一个设备上,可能创建多个表空间的,区分就是靠偏移量来实现),对设备来说,如果不知道怎么设,开始就设1(指创建单个表空间的时候)
ROOTSIZE 200000 --大小


表空间是逻辑概念,管理的是块(chunk),看块的保存位置、类型(文件系统,裸设备),大小


生成新的表空间:
查看表空间和块的信息:onstat -d
表空间---块(chunk)--dbblock(2k)
pgsize × size = ROOTSIZE


创建表空间:onspaces --help
类型:数据表空间(永久表空间)、临时表空间
生成相应的块:把块生成到不同的磁盘上(优化与安全的角度考虑)
为vm添加磁盘,查看磁盘信息fdisk -l
reboot


分区,格式化(裸设备不需要格式化):
fdisk /dev/sdb 所有空间都创建为扩展分区。然后再分出两个500M的空间


格式化5和6
fdisk -l /dev/sdb
mkfs.ext3 /dev/sdb5
mkfs.ext3 /dev/sdb6
fdisk -l /dev/sdb
mkdir -p /disk/sdb5
mkdir -p /disk/sdb6
mount /dev/sdb5 /disk/sdb5
mount /dev/sdb6 /disk/sdb6
df -h


创建tbs1:(root)
mkdir -p /disk/sdb5/dbs
chown informix:informix /disk/sdb5/dbs
touch /disk/sdb5/dbs/tbs1
chmod 770 /disk/sdb5/dbs
chmod 660 /disk/sdb5/dbs/tbs1
chown informix:informix /disk/sdb5/dbs/tbs1


生成表空间:(informix)注意确认所在的实例(实例需要启动)
(informix用户)onspaces -c -d tbs1 -o 0 -s 102400 -p /disk/sdb5/dbs/tbs1


onstat -d --查看表空间


使用数据库空间:
把数据库创建到特定的空间上,把表创建到特定的空间,把索引创建到特定的空间
不同的数据库使用不同的表空间,同一个数据库的不同大表使用不同的表空间。


create database java01  in tbs1 with buffered log;
create table t1
(
in int
); --表创建到数据库所在的空间上


创建tbs2:(root)
touch /disk/sdb5/dbs/tbs2
chmod 660 /disk/sdb5/dbs/tbs2
chown informix:informix /disk/sdb5/dbs/tbs2
(informix用户)onspaces -c -d tbs2 -o 0 -s 102400 -p /disk/sdb5/dbs/tbs2


create table t1
(
in int
)
in tbs2; --表创建在不同的表空间上




create index idx1 on t1(id);
create index idx2 on t2(id) tbs1;
0 0
原创粉丝点击