Oracle数据库学习[02]:【序列、触发器、视图、存储过程】

984 阅读5分钟

内容

1.序列
2.触发器
3.视图
4.同义词
5.索引
6.权限控制
7.存储过程
8.Java代码连接Oracle

序列

1、用来生成一系列有序的数据,常用作完成主键的生成(Oracle主键默认是不支持主键自增)。 2、语法:

CREATE SEQUENCE 序列名称 
[INCREMENT BY 步长] [START WITH 开始值]
[MAXVALUE 最大值 | NOMAXVALUE] 
[MINVALUE 最小值 | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE 缓存个数 | NOCACHE] ;

如果直接使用了“CREATE SEQUENCE 序列名称 ”创建序列的话,那么默认的不长是1,开始值也是1,没用最大值,最小值是1,采用非循环序列(NOCYEL)、默认的缓存个数是20个。

1、select * from user_sequences;//查询当前用户的所有序列
2、Select 序列名. currval from dual; //查询某个序列的当前值
3、Select 序列名. nextval from dual; //查询某个序列的下一个值 注意:新创建的序列必须先执行查询序列的下一个值:

insert into tab2 values(seq1.nextval,'小木马')//使用序列完成表中主键的增长

drop sequence 序列名

触发器

通过执行某一个事件,同时在执行这个事件之前后者之后来自动触发调用另外一个事件。
语法:

create or replace trigger mytr1
  before insert
  on tab2
  for each statement
declare
  --local variables here
begin
  调用另外一个事件;
end mytr1;

案例:通过触发器实现表插入数据前自动调用序列:

create or replace trigger mytri1
  before insert
  on tab2
  for each row
declare
  -- local variables here
begin
  select seq1.nextval into :new.tid from dual;
end mytri1;

案例:数据表实时备份

create or replace trigger mytr2
    after insert
    on tab2
    for each row
declare
    --local variables here
begin
    insert into tab1(aid,anme) values(:new.tid,:new.tname);
end mytr2;

案例:同步删除的数据

create or replace trigger mytr3
    after delete
    on tab2
    for each row
declare
    --local variables here
begin
    delete from tab1 where aid=:old.tid;
end mytr3;

删除触发器:

drop trigger 触发器名;

视图

什么时候用视图:对某一个结果集频繁操作的时候,可以将该结果集封装为一个视图。 所以所谓的视图指的就是封装了一条查询语句的对象。
语法:CREATE [OR REPLACE ] VIEW 视图名称 AS子查询;
注意:
1、作用是方便查询;

select * from myv1 where sal>2000;
select * from myv1 where job='CLERK';

SELECT * FROM EMP WHERE DEPTNO=20 AND SAL>2000;
SELECT * FROM EMP WHERE DEPTNO=20 JOB='clerk';

2、视图是不允许更新。如果视图封装的子查询是单表查询时,语法上是可以更新的,视图封装的子查询是多表的查询时,语法上是不可以更新的。
3、当视图封装的是单表的结果集时,也可以限制视图不被更新。
CREATE [OR REPLACE] VIEW 视图名称 AS子查询 with check option;(保证子查询的限定条件字段不可以被更新,其他字段还可以更新)
CREATE [OR REPLACE] VIEW 视图名称 AS子查询 with read only;(视图不可以被更新)
案例1:

create or replace view myv1 as select * from emp where deptno=20;

案例2:

create or replace view myv1 as 
    select tm.*, d.dname 
    from dept d  left join 
    (select avg(sal) salavg,max(sal) maxsal, deptno from emp group by deptno) tm 
on d.deptno=tm.deptno;

删除视图:drop view 视图名

同义词

为非当前用户的表创建别名,该别名称为同义词。
sys.dual=dual
语法:

创建:CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户名.表名称(加 public 代表是公共同义词)
删除命令:drop [public] synonym 同义词名称;
用户切换:
//超级管理员切换:

conn sys/change_on_install as sysdba;

//普通用户的切换:

conn scott/tiger;

索引

索引:是一种相对而言提升数据库性能的操作手段。但是一定要记住,永远不会存在有绝对性的性能调整。
什么时候不建议加索引 1、数据量少,数据值分步范围比较小;
2、频繁对某一个列做增删改时,不建议加索引;
3、不会经常用作条件查询的列,不建议加索引;
4、对于clob,blob大的数据类型不建议加索引;
5、模糊查询不支持索引;
反之,添加索引的情况:
1、数据量大,数据值分布范围比较广; 2、频繁根据某一个字段查询时,加索引; 3、在经常需要搜索、主键、外键。
创建索引:

create index 索引名 on 表(列名);

删除索引:drop index 索引名

权限控制

1、用户切换:

1、超级管理员切换

conn sys/change_on_install as sysdba;

2、普通用户的切换

conn scott/tiger;

2、创建用户

create user 用户名 indentified by 密码

3、为用户赋予权限或者角色

grant 权限 to 用户;
grant 角色名 to 用户;//当前用户有该角色对应的所有权限;

常用角色:

CONNECCT,RESOURCE----sys.dba_sys_privs

查询某个角色对应的权限:

select * from dba_sys_privs where grantee='RESOURCE'

4、用户密码修改

alter user 用户名 identified by 新密码;

5、锁定用户和解锁用户

alter user 用户名 account lock/unlock;

6、撤回权限或者角色

revoke 权限 from 用户;
revoke 角色名 from 用户;

7、删除用户

drop user 用户名 cascade;

存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

1、特点:

1、一组为了完成特定功能的SQL语句集; 2、一次编译后永久有效; 3、存储过程可以携带参数(输入参数,输出参数);

2、语法:

1、无参的存储过程:

create or relpace procedure p1 is
begin
    完成特定功能的SQL语句集;
end p1;

案例:

2、含有输入参数的存储过程:

create or replace procedure p2(ename in varchar2) is
begin
    dbms_output.put_line('输入参数为:'|| ename);
end p2;

3、含有输入和输出参数的存储过程

根据输入年龄判断用户对应的年级:

Java代码链接Oracle

1.加入数据库依赖包:ojdbc6.jar

2.测试连接:

public class OTest {
  public static void main(String[] args) throws Exception {
	
	  String url="jdbc:oracle:thin:@localhost:1521:orcl";
	  Class.forName("oracle.jdbc.OracleDriver");
	  Connection conn = DriverManager.getConnection(url, "scott", "tiger");
	  PreparedStatement ps = conn.prepareStatement("select * from emp");
	  ResultSet rs = ps.executeQuery();
	  while(rs.next()) {
		 System.out.println(rs.getInt("empno")+":"+rs.getString("ename")); 
	  }
	  rs.close();
	  ps.close();
	  conn.close();
  }
}