Oracle同义词 序列 索引 异常处理 示例分析

一、同义词: 语法:create [public] synonym [模式名.]同义词 for [模式名.]表名 (以下例题使用的是scott模式下的emp表) 例1:(创建本模式下的私有同义词) create synonym emp for scott.emp; 例2:(创建其他模式下的私有同义词) create synonym system.emp for scott.emp; (创建system模式下的私有同义词) 例3:(创建公有同义词) create public emp for scott.emp; 知识点:1、同义词可以用来简化SQL语句,但它不可以代替权限,在使用同义词前要确保用户已取得 访问对象的权限。 比如:例3 中创建的公有同义词 emp 在任何模式下都可以使用它,但如果 该模式没有访问 scott模式 的 emp 表的权限的话,在使用公有同义词 emp 时是查不到数据的。 解决的方案是赋予此用户访问 scott模式 的 emp 表的权限: grant all on scott.emp to 模式名 2、公有同义词可以被所有用户访问,而私有同义词只可以被特定的用户访问。比如: 例1 中 创建的私有同义词只可以在创建它的用户下使用, 而例2 中创建的私有同义词只可以在 system 模式下访问。 3、创建其它模式下的私有同义词(例2)需要有 create any synonym 的权限, 可以在sys 或 system 模式下: grant create any synonym to 模式名, 相应的要删除其他模式下的私有同义词要有 drop any synonym 的权限。 创建公有同义词(例3)需要有 create public synonym 的权限,删除 公有同义词要有 drop public synonym 的权限。 这些权限都可以在 sys 或 system模式下赋予。 4、删除同义词: drop [public] synonym; *扩充:1、可创建同名的私有同义词和公有同义词; 2、可创建与公有同义词同名的对象,但不能创建与对象同名的公有同义词; 3、查询本模式下的所有同义词: select * from user_synonyms; 二、序列: 语法: create sequence 序列名 [start with 起始值] [increment by 增量] ----增量为正值表示是递增序列,为负值表示是递减序列 [maxvalue 最大值] [minvalue 最小值] [cycle | nocycle] ----序列达到最大(或最小)值后,是否继续从头开始生成值 [cache 预先缓存数 | nocache] 知识点: 1、序列用来生成唯一、连续的整数,通常用来自动生成主键或唯一键值,类似于 SQL Server 中的自增列。 2、第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返 回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使 用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里 面使用多个NEXTVAL,其值就是不一样的。 (注:切换用户后nextval的值仍然会从切换前处开始接着往后增长) 例1: CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10; SELECT emp_sequence .currval FROM DUAL; SQL> SELECT emp_sequence.nextval FROM DUAL; NEXTVAL ---------- 1 SQL> SELECT emp_sequence.currval FROM DUAL; CURRVAL ---------- 1 3、 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里 面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down 掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache 防止这种情况。 例2: SQL> SELECT emp_sequence.currval FROM DUAL; CURRVAL ---------- 1 SQL> conn / as sysdba 已连接。 SQL> shutdown abort ORACLE 例程已经关闭。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 135338868 bytes Fixed Size 453492 bytes Variable Size 109051904 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes 数据库装载完毕。 数据库已经打开。 SQL> conn scott/tiger 已连接。 SQL> SELECT emp_sequence.currval FROM DUAL; SELECT emp_sequence.currval FROM DUAL * ERROR 位于第 1 行: ORA-08002: 序列EMP_SEQUENCE.CURRVAL 尚未在此进程中定义 SQL> SELECT emp_sequence.nextval FROM DUAL; NEXTVAL ---------- 11 4、使用 RollBack 回滚事务时无法回滚序列的值: 例3: SQL> SELECT emp_sequence.currval FROM DUAL; CURRVAL ---------- 1 SELECT emp_sequence.currval FROM DUAL; CURRVAL ---------- 2 roll back; SELECT emp_sequence.currval FROM DUAL; CURRVAL ---------- 3 5、使用 alter 语句修改序列时无法修改start with项的值。 6、删除序列: drop sequence 序列名 7、查询本模式下所有的序列: select * from user_sequences; 三、视图: 语法: create [force | noforce] view 视图名 [ ( 别名[,别名]... ) ] as select 语句 [with check option] ---- 指定只能插入或更新视图可以访问的行 [with read only] ---- 只读 注意: with check option 和 with read only 不可以同时使用 例1:create view view_dept (部门编号, 部门名称, 地址) as select * from scott.dept where loc in ('DALLAS', 'CHICAGO', 'BOSTON') with check option; SQL> select * from view_dept; 部门编号 部门名称 地址 ---------- -------------- ------------- 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> select * from scott.dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 例2:create force view view_nothing as select * from system.nothing with read only; 知识点:1、可以将视图视为“已存储的查询”或“虚拟表”,在可以使用表的大多数场合都可以使用视图。 2、与同义词相似,视图也不能代替权限,在使用视图前要确保用户已取得访问对象的权限。 3、如果视图的创建语句中包含 with check option 块,则无法将视图可访问的行修改为不可访问的行。 如 例 1 中,由于where子句的限制,视图 view_dept只能看到 scott 模式下 dept 表中的3条记录, 那么在执行下面的更新语句时就会出错:(下面的语句企图将视图中可见的一行数据修改成视图不可见的) SQL> update view_dept set 地址='Beijing' where 地址='DALLAS'; update view_dept set 地址='Beijing' where 地址='DALLAS' * ERROR 位于第 1 行: ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句 4、视图只能更新它可以访问的列,而不能更新其他列。 5、在联接视图中,如果视图包含一个表的主键,并且也是这个视图的主键,则这个表称为键保留表。 在联接视图中,通过视图只能更新键保留表,而无法更新其它基表。 例3: (emp表是键保留表) create view v_emp_dept as select e.empno, e.ename, e.sal, e.deptno, d.dname, d.loc from emp e, dept d where e.deptno = d.deptno; 6、可以通过 force 项来强制创建视图(例2),不论select语句中的表和列是否存在都将成功创建视图, 只是在执行时可能返回警告语句,而且如果该表或列不存在的话,即使成功创建视图,该视图也是不可 用的。 7、删除视图: drop view 视图名 8、查询本模式下所有的视图: select * from user_views; *扩充:1、即使视图的创建语句中包含 with check option 块,仍然能够通过视图删除视图可见的行。 SQL> delete from view_dept where 地址='BOSTON'; 已删除 1 行。 2、如果视图的创建语句中包含 with check option 块,则不能通过视图插入视图不可见的行。 SQL> insert into view_dept 2 values (1, 'Bush','HOSTON'); insert into view_dept * ERROR 位于第 1 行: ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句 3、如果视图的创建语句中包含 with check option 块,则通过视图更新表中的数据中时有下面的规律: (1) 视图可见记录 ---> 不可见记录 (出错: 视图 WITH CHECK OPTIDN 违反 where 子句); (2) 视图可见记录 ---> 可见记录(可以成功执行); (3) 视图不可见记录 ---> 可见记录(不报错,但无法更新); (4) 视图不可见记录 ---> 不可见记录(不报错,但无法更新); java substring(4,6)后面的数字一定大与前面的值 sql里面的 select +space(10)+'3'+space(12)+'4' oracle里面的 select lpad('4',4) from dual select lpad(' ',4*(level-1))||ename||mgr as ename from emp start with with mgr is null connect by prior empno:mgr 字符前有3个空格 四、索引: 语法: create index 索引名 on 表名(列名) 知识点:1、索引可以提高查询数据的效率,同时它也会降低更新、删除及插入的性能,所以不要为表创建过多的索引。 注意:只有在where子句中用到了索引中指定的列时才会提高查询效率。 2、索引在物理和逻辑上都独立于关联表中的数据,在任何时候都可以创建或删除索引,而不会影响基表或其它 索引。它需要占用存储空间。 3、索引的分类: (1) B 树索引(即: 标准索引); (2) 唯一索引 : create unique index 索引名 on 表名(列名) (3) 组合索引 : create index 索引名 on 表名(列名1, 列名2,……) (4) 反向键索引 : (通常建立在一些值连续增长的列上,比如: 序号 列) create index 索引名 on 表名(列名) reverse (5) 位图索引 : (适用于低基数列,也就是不同值的数目比表中的行数少的列,比如:性别、民族 列) create bitmap index 索引名 on 表名(列名) (6) 基于函数的索引 4、 B 树索引 和 反向键索引 间可以相互转换,但它们都不能转换为 位图索引。 alter index 索引名 rebuild reverse ---- B 树索引 转 反向键索引 alter index 索引名 rebuild noreverse ---- 反向键索引 转 B 树索引 下面的写法是错误的: alter index 索引名 rebuild bitmap 5、删除索引: drop index 索引名 6、查询本模式下所有的索引: select * from user_indexes; 五、其他: 1、查询本模式下所有的表、视图和同义词: select * from tab; 2、外连接:(注意:在第一种写法中where条件中有+号的一端的表示从表,另一端是主表) select a.deptno,b.deptno,ename,dname from emp a,dept b where a.deptno(+)=b.deptno 相当于 select a.deptno,b.deptno,ename,dname from emp a RIGHT OUTER JOIN dept b on a.deptno=b.deptno 3、建立主键 alter table ORDER_MASTER add constraint pk_ord_master primary key (ORDERNO); alter table VENDOR_MASTER add constraint pk_ven_master primary key (VENCODE); 4、重新编译视图 alter view VEN_ORD_VIEW compile; 5、 查看可更新的列 SELECT * FROM user_updatable_columns WHERE table_name ='VEN_ORD_VIEW'; 6、show parameter create_bit;--查看位图索引在内存中的大小 alter system set create_bitmap_area_size=9388608;--修改位图索引在内存中的大小(测试未通过) --根据内存更改合适大小可以优化速度。 7、alter index reverse_id rebuild [online];--(重建旧有索引) 8、 alter index reverse_id coalesce;---碎片重整 9、 alter index reverse_id monitoring usage;---标识索引是否用到 10、analyze index reverse_id validate structure;--检查索引的有效性 desc index_stats;------查看索引的统计信息 11、 alter index 索引名 logging (索引的更新记入日志) alter index 索引名 nologging (索引的更新不记入日志) 12、create index partition_index on emp2(empno) local;---本地分区索引 select * from user_segments where segment_name='PARATITION_INDEX'; 13、查看当前用户名: show user; 异常 系统异常 too_many_rows no_data_found 自定义异常 declare invalidate exception; id_deptno number(4); row_dept dept%rowtype; queryString varchar2(1000); begin id_deptno:=&deptno; if id_deptno not in (10,20,30,40) then raise invalidate ; else queryString:='select * from dept where deptno =:id'; execute immediate queryString into row_dept using id_deptno; dbms_output.put_line('部门编码' || ' ' || '部门名称'); dbms_output.put_line(row_dept.dname || ' ' ||row_dept.deptno); end if; exception when invalidate then dbms_output.put_line('该部门编码没有对应数据!'); end; /

你可能感兴趣的:(Oracle同义词 序列 索引 异常处理 示例分析)