常用数据库对象

常用的Oracle的数据库对象介绍:表、视图、序列、索引、同义词、约束、存储过程、存储函数、包和包体、触发器

视图 view
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal* 12 annsal,d.dname
from emp e,dept d
where e.deptno=d.deptno;
with read only;
ORA- 01031: 权限不足 grant create view to scott 授权创建视图

desc empinfoview
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER( 4)
ENAME VARCHAR2( 10)
SAL NUMBER( 7, 2)
ANNSAL NUMBER
DNAME VARCHAR2( 14)

select * from empinfoview;

EMPNO ENAME SAL ANNSAL DNAME
------ ---------- ---------- ---------- --------------
7369 SMITH 800 9600 RESEARCH
7499 ALLEN 1600 19200 SALES
7521 WARD 1250 15000 SALES



序列 sequence
create sequence myseq;

create table testseq (tid number,tname varchar2( 20));

select myseq.nextval from dual; 序列的下个一值

NEXTVAL
----------
1

select myseq.currval from dual; 序列的当前值

CURRVAL
----------
1

insert into testseq values(myseq.nextval, 'aaa');
insert into testseq values(myseq.nextval, 'aaa');
insert into testseq values(myseq.nextval, 'aaa');
insert into testseq values(myseq.nextval, 'aaa');

select * from testseq;

TID TNAME
---------- --------------------
2 aaa
3 aaa
4 aaa
5 aaa


索引 index
SQL的执行计划
explain plan for select * from emp where deptno= 10;
select * from table(dbms_xplan.display);

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 261 | 3 ( 0)| 00: 00: 01 |
|* 1 | TABLE ACCESS FULL| EMP | 3 | 261 | 3 ( 0)| 00: 00: 01 |
--------------------------------------------------------------------------

创建目录(索引)
create index myindex on emp(deptno);

explain plan for select * from emp where deptno= 10;
select * from table(dbms_xplan.display);
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 261 | 2 ( 0)| 00: 00: 01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 3 | 261 | 2 ( 0)| 00: 00: 01 |
|* 2 | INDEX RANGE SCAN | MYINDEX | 3 | | 1 ( 0)| 00: 00: 01 |


同义词(别名) synonym
show user
USER 为 "SCOTT"

select count(*) from hr.employees;

为hr.employees起别名 ---> 同义词

create synonym hremp for hr.employees;

select count(*) from hremp;

COUNT(*)
----------
107


约束 constraint
create table student(
sid number constraint student_pk primary key,
sname varchar2( 20) constraint student_name_notnull not null,
gender varchar2( 2) constraint student_gender check (gender in ( '男', '女')),
email varchar2( 40) constraint student_email_unique unique
constraint student_email_notnull not null,
deptno number constraint student_fk references dept(deptno) on delete set null
);

check 检查
create table test3(
tid number,
tname varchar2( 20),
gender varchar2( 2) check (gender in ( '男', '女')),
sal number check (sal > 0)
);

存储过程 procedure
--打印Hello World
--创建存储过程
create or replace procedure sayhelloworld
as
--说明部分
begin
dbms_output.put_line( 'Hello World');
end;

--调用存储过程:
1exec sayhelloworld();
2begin
sayhelloworld();
sayhelloworld();
end;
/

--给指定的员工涨100,并且打印涨前和涨后的薪水
create or replace procedure raiseSalary(eno in number)
is
--定义变量保存涨前的薪水
psal emp.sal% type;
begin
--得到涨前的薪水
select sal into psal from emp where empno=eno;
--涨100
update emp set sal=sal+ 100 where empno=eno;
--这里不用commit 谁调用谁提交
dbms_output.put_line( '涨前:'||psal|| ' 涨后:'||(psal+ 100));
end raiseSalary;
/

--查询某个员工的姓名 薪水和职位
/*
1、查询某个员工的所有信息 ---> out参数太多
2、查询某个部门中的所有员工信息 ----> 返回的是集合
*/

create or replace procedure queryEmpInformation(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)
is
begin
select ename,sal,job into pename,psal,pjob from emp where empno=eno;

end queryEmpInformation;

存储函数 function
--查询某个员工的年收入
create or replace function queryEmpIncome(eno in number)
return number
is
--定义变量保存月薪和奖金
psal emp.sal% type;
pcomm emp.comm% type;
begin
--得到月薪和奖金
select sal,comm into psal,pcomm from emp where empno=eno;
--返回年收入
return psal* 12+nvl(pcomm, 0);

end queryEmpIncome;

包和包体 package and package body
--2、查询某个部门中的所有员工信息 ----> 返回的是集合
create or replace package mypackage is

type empcursor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor);

end mypackage;
create or replace package body mypackage is

procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno;
end;

end mypackage;

触发器 trigger
每当成功插入新员工后,自动打印“成功插入新员工”

create trigger firsttrigger
after insert
on emp
declare
begin
dbms_output.put_line( '成功插入新员工');
end;
/

强制审计
标准审计(配置)
基于值的审计
细粒度审计
管理员审计


/*
实施复杂的安全性检查
禁止在非工作时间 插入新员工

1、周末: to_char(sysdate,'day') in ('星期六','星期日')
2、上班前 下班后:to_number(to_char(sysdate,'hh24')) not between 9 and 17
*/
create or replace trigger securityemp
before insert
on emp
begin
if to_char( sysdate, 'day') in ( '星期六', '星期日', '星期五') or
to_number(to_char( sysdate, 'hh24')) not between 9 and 17 then
--禁止insert
raise_application_error(- 20001, '禁止在非工作时间插入新员工');
end if;
end securityemp;
/

/*
数据的确认
涨后的薪水不能少于涨前的薪水
*/
create or replace trigger checksalary
before update
on emp
for each row
begin
--if 涨后的薪水 < 涨前的薪水 then
if :new.sal < :old.sal then
raise_application_error(- 20002, '涨后的薪水不能少于涨前的薪水。涨前:'||:old.sal|| ' 涨后:'||:new.sal);
end if;
end checksalary;
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值