您的位置:首页 > 数据库 > Oracle

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

2010-09-09 00:18 483 查看
一、同义词:
语法: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;
/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐