Oracle培训笔记 8.7 schema 对象


schema: is collecton of database objects that owned by particular user

1、表
堆表:heap table

簇表:cluster; 簇:一堆, 默认索引簇
create cluster dept(deptid number) size 7000;
create index dept_idx on cluster dept;

select * from dba_clusters;
select * from dba_segments where segment_name='DEPT';

create table emp(id number,name varchar2(20),deptid number) cluster dept(deptid);
select * from dba_segments where segment_name='EMP';

insert into emp values(1,'name1',1);
insert into emp values(2,'name2',2);

select dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_row_number(rowid),id from emp;

begin
for i in 1..10000 loop
insert into emp values(i,'name1',1);
end loop;
for i in 10001..20000 loop
insert into emp values(i,'name1',2);
end loop;
for i in 20001..30000 loop
insert into emp values(i,'name1',2);
end loop;
end;
commit;

create table emp1(id number,name varchar2(20),deptid number);
declare
d number;
begin
for i in 1..30000 loop
d:=mod(i,3)+1;
insert into emp1 values(i,'name1',d);
end loop;
end;
commit;

select * from emp1 where deptid=1;
select * from emp where deptid=1;


哈希簇
create cluster dept1(deptid number(10,0)) size 7000 hash is deptid hashkeys 100;

索引组织表:index organized table
drop table emp1;
drop cluster dept including tables;

create table emp(id number,name varchar2(20),deptid number);
create index emp_idx on emp(id);
begin
for i in 1..100000 loop
insert into emp values(i,'name1',1);
end loop;
end;
commit;

create table emp1(id number primary key,name varchar2(20),deptid number) organization index;
[注]要主键
begin
for i in 1..100000 loop
insert into emp1 values(i,'name1',1);
end loop;
end;
commit;

临时表:temporary table

drop table emp;
drop table emp1;

create table emp(id number,name varchar2(20),deptid number);
create global temporary table emp1(id number,name varchar2(20),deptid number) ;
on commit delete rows|preserve rows;

select * from dba_tables where table_name like 'EMP%'

生成redo量

记录redo量 1
select a.sid,b.name,a.value
from v$sesstat a join v$statname b
on a.statistic#=b.statistic#
and a.sid=(select sid from v$mystat where rownum<2)
and b.name like 'redo size%'

begin
for i in 1..100000 loop
insert into emp1 values(i,'name1',1);
end loop;
end;
commit;

记录redo量 2
select a.sid,b.name,a.value
from v$sesstat a join v$statname b
on a.statistic#=b.statistic#
and a.sid=(select sid from v$mystat where rownum<2)
and b.name like 'redo size%'

begin
for i in 1..100000 loop
insert into emp values(i,'name1',1);
end loop;
end;
commit;

记录redo量 3
select a.sid,b.name,a.value
from v$sesstat a join v$statname b
on a.statistic#=b.statistic#
and a.sid=(select sid from v$mystat where rownum<2)
and b.name like 'redo size%'

【】观察两种表生成redo量的大小

2、索引
B*tree: balance
bitmap: olap 数据仓库

create [unique][bitmap]index on 表(列)

drop table emp;
drop table emp1;

create table emp(id number,name varchar2(20),deptid number);
create index emp_idx1 on emp(id);
insert into emp values(1,'a',1);
insert into emp values(1,'b',2);
delete from emp;
drop index emp_idx1;

create unique index emp_idx1 on emp(id);
insert into emp values(1,'a',1);

create table emp1(id number primary key,name varchar2(20) unique,deptid number);
select * from dba_indexes where table_name='EMP1'

create bitmap index emp_idx2 on emp(deptid);

drop index emp_idx1;
drop index emp_idx2;

create unique index emp_idx1 on emp(id,name);

insert into emp(id) values(1);
select * from emp;

select * from dba_indexes
select * from dba_objects

3、视图
create [force] view 视图名 as 子查询
with read only|with check option;

create force view v1 as select * from emp2;
select * from dba_views where view_name='V1'
create table emp2(id number);
select * from v1;

create view v2 as select * from emp2 with read only;
select * from v2;
insert into v2 values(100);


create view v3 as select * from emp2 where id>2000 with check option;
insert into v3 values(3000);
insert into v3 values(1000);
update v3 set id=10000 where id=100; X
update v3 set id=2000 where id=3000;
delete from v3 where id<4000;

insert into emp2 values(100);
select * from emp2

4、物化视图
http://cuuzhang.blog.163.com/blog/static/608115292010913102253107/


grant create materialized view to u1;
sqlplus u1/u1

drop table t1;
purge recyclebin;
create table t1(id number,name varchar2(20));

手动刷新
create materialized view v1 refresh with rowid as select * from t1;
select * from user_mviews
select * from user_segments

insert into t1 values(3,'c');
commit;

begin
dbms_mview.refresh(list => 'V1');
end;
select * from t1;
select * from v1;

drop materialized view v1;

提交刷新
create materialized view v2 refresh on commit with rowid as select * from t1;

insert into t1 values(2,'b');
commit;

select * from t1;
select * from v2;

drop materialized view v2;

定时刷新
drop materialized view v3;
create materialized view v3 refresh with rowid start with sysdate next sysdate + (1/14400) as select * from t1;

insert into t1 values(8,'e');
commit;
select * from t1;
select * from v3;
select sysdate,sysdate+1/14400 from dual

drop materialized view v3;

增加物化视图日志
drop materialized view v4;
create materialized view v4 refresh fast with rowid start with sysdate next sysdate+1/1440 as select * from t1;

create materialized view log on t1 with rowid;
select * from dba_mview_logs
select * from MLOG$_T1;

insert into t1 values(7,'g');
commit;

select * from v4;

Refresh方法-FAST子句
 增量刷新用物化视图日志(参照上面所述)来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志
Refresh方法- COMPLETE子句
 完全刷新重新生成整个视图,如果请求完全刷新,oracle会完成完全刷新即使增量刷新可用。
Refresh Method – FORCE 子句
 当指定FORCE子句,如果增量刷新可用Oracle将完成增量刷新,否则将完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE),Force选项是默认选项


5、序列
drop sequence seq1;
create sequence seq1 start with 10 maxvalue 40 cycle cache 10;
select * from user_sequences;
select * from dba_sequences where sequence_name='SEQ1';

select seq1.nextval,seq1.currval from dual;

表主键:
代理主键:使用没有任何业务含义的列作为主键
自然主键:使用有业务含义的列作为主键

5、同义词
create [public] synonym 名 for 对象;

create synonym t1s for t1;
select * from t1s;

select * from user_synonyms
select * from dba_synonyms where synonym_name='T1S'

drop public synonym t1s
create public synonym t1s for t2;

select * from t1s;

6、数据库链接
授权
C:\>sqlplus / as sysdba
SQL> grant create database link to u1;

配置远程数据库服务命名 tnsnames.ora
remote =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.120)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydb)
    )
  )


sqlplus u1/u1
create database link link1 connect to u1 identified by u1 using 'remote';
select * from t1@link1;

create synonym t1s_remote for t1@link1;

select * from t1s_remote;

7、命名程序

授权
C:\>sqlplus / as sysdba
SQL> grant create procedure,create trigger to u1;


过程
函数

包体
create or replace package mypack is
procedure add(p1 number,p2 number, res out number);
function add(p1 number,p2 number) return number;
end;

create or replace package body mypack is
procedure add(p1 number,p2 number, res out number) is
begin
res:=p1+p2;
end;
function add(p1 number,p2 number) return number is
begin
return p1+p2;
end;
end;

调用
declare
p1 number;
p2 number;
res number;
begin
p1:=100;
p2:=200;
mypack.add(p1,p2,res);
dbms_output.put_line(res);

p1:=1000;
p2:=2000;
res:=mypack.add(p1,p2);
dbms_output.put_line(res);
end;


触发器
DDL:create alter drop ...

--创建日志表
create table ddllog(txt varchar2(1000));

--创建ddl触发器,捕获create语句
create or replace trigger ddlt
after create on schema
declare
t dbms_standard.ora_name_list_t;
res binary_integer;
txt varchar2(1000):='';
begin
res:=dbms_standard.sql_txt(t);
for i in 1..t.COUNT loop
txt:=txt||t(i)||' ';
end loop;
insert into ddllog values(txt);
end;

--测试
create table t01(id number);
select * from ddllog;

--嵌套表类型
create type booklist as table of varchar2(100);
create type booklist as array(10) of varchar2(100);

DML触发器
--创建表
create table salary(name varchar2(20),salary number);
insert into salary values('a',1000);

--创建日志表
create table dmllog(txt varchar2(1000));

伪行
:new :old
update:
insert:
delete:

--行级触发器,捕获修改前后的数据
create or replace trigger dmlt
after update on salary
for each row
declare
ename varchar2(20);
osalary number;
nsalary number;
begin
ename:=:new.name;
osalary:=:old.salary;
nsalary:=:new.salary;
insert into dmllog values(ename||','||osalary||','||nsalary);
end;

instead of触发器
create table dept(deptid number,deptname varchar2(20));
create table emp(empid number,empname varchar2(20),deptid number);

create view dept_emp as
select dept.deptid,dept.deptname,emp.empid,emp.empname from dept,emp where dept.deptid=emp.empid;

create or replace trigger insteadt
instead of insert on dept_emp
begin
insert into dept values(:new.deptid,:new.deptname);
insert into emp values(:new.empid,:new.empname,:new.deptid);
end;

insert into dept_emp values(1,'d1',101,'e1');

select * from dept;
select * from emp;


系统触发器
logon logoff starup shutdown

sqlplus / as sysdba
create table logon(d date,u varchar2(20));

create or replace trigger logont after logon on database
begin
insert into logon values(sysdate,sys.login_user);
end;


 

你可能感兴趣的:(Oracle培训笔记 8.7 schema 对象)