一,Oracle简介

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。
特点:
(1)支持多用户、大事务量的事务处理
(2)数据安全性和完整性控制
(3)支持分布式数据处理
(4)可移植性

二,Oracle的下载

官网地址:https://www.oracle.com/cn/database/technologies/oracle-database-software-downloads.html–11g

三,Oracle的体系结构

1.数据库:Oracle是一种关系型的数据库管理系统;
2.数据库实例:数据库实例其实就是用来访问和使用数据库的一块进程,它只存在于内存中,就像Java中new出来的实例对象一样。一个数据库可以有n个实例;
3.表空间:Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表,可以有N个数据文件;

4.数据文件:数据文件是数据库的物理存储单位。数据库的数据是存储再表空间中的,真正是在某一个或者多个数据文件中,而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间,一旦数据文件被加入到某个表空间后,就不饿能删除这个文件,如果要删除某个数据文件,只能删除其所属与的表空间才行;

5.用户:Oracle数据库建好后,要想在数据库里建表,必须先为数据库建立用户,并为用户指定表空间;

四,Oracle的窗口化连接

既然是使用窗口化连接,那我们就需要一个窗口化连接的工具,这里我们使用的是代码补全提示比较好的PLSQL Developer。


需要进项配置才能使用
如果orcle是直接下载本地的,则这步不需要.
找到这个路径的文件tnsnames,修改下此文件

五,准备工作

–创建表空间
create table waterboss
datafile ‘c:\waterboss.dbf’
size 100m –大小
autoextend on–自动扩展
next 10m;

–创建用户
create user wateruser
identified by itcast
default tablespace waterboss;

–赋予dba权限 (可以用此用户登入PLSQL)
grant dba to wateruser

六,数据类型

1.字符型

1.1CHAR:固定长度的字符类型,最多存储2000个字节
1.2VARVCHAR2:可变长度的字符类型,最多4000个字节
1.3LONG:打文本类型,最大可存储2个G

2.数值型

NUMBER:数值类型
例如:NUMBER(5) 最大可以存的数为99999
NUMBER(5,2) 最大可以存的数为999.99–(5为总位数)

3.日期型

3.1DATE:日期时间型,精确到秒
3.2TIMESTAMP:精确到秒的小数点后9位

4.二进制(大数据类型)

4.1CLOB:存储字符,最大4G
4.2BLOB:存储图像、声音、视频等二进制数据,最多4个G

七,DDL语言

7.1创建表

create table 表名(
列名 列的类型 [列的约束],
列名 列的类型 [列的约束]
);

7.2复制表

create table 表名 as 查询语句;

7.3删除表

方式一:drop table 表名;
方式二:truncate table 表名;

7.4修改表

7.41添加一列
格式:alter table 表名 add 列名 列的类型;
演示:alter table users add phone varchar2(11);
7.42修改列名
格式:alter table 表名 rename column 旧列名 to 新列名;
演示:alter table users rename column phone to mobile;
7.43修改类型
格式:alter table 表名 modify 列名 列的类型;
演示:alter table users modify mobile char(11);
7.44删除一列
格式:alter table 表名 drop column 列名;
演示:alter table users drop column mobile;
7.45修改表名
格式:rename 旧表名 to 新表名;
演示:rename users to myusers;

八, DML语言

8.1插入语句

格式:insert into 表名(列名1,列名2,…) values(值1,值2,…);
演示:insert into category(cid,cname) values(1,‘电视’);
注意:commit;

8.2修改语句

格式:update 表名 set 列名1=值1,列名2=值2,… where 查询条件;
演示:update category set cname=‘汽车’ where cid = 1;
注意:commit;

8.3删除语句

格式:delete from 表名 where 查询条件;
演示:delete from category where cid = 1;
注意:commit;
truncate table 表名; –先摧毁表结构,在重构.不需要commit且无法回滚

九,数据的导出与导入

9.1整库的导出与导入

导出:exp system/itcast file=文件名 full=y(如不指定文件,默认导出为为EXPDAT.dmp)
导入:imp system/itcast full=y(如不指定文件,默认从EXPDAT.dmp文件导入)

9.2按用户导出与导入

导出:exp system/itcast owner=wateruser file=wateruser.dmp
导入:imp system/itcast file=wateruser.dmp fromuser=wateruser

9.3按表导出与导入

导出:exp wateruser/itcast file=a.dmp tables=t_account,a_rea
导入:imp wateruser/itcast file=a.dmp tables=t_account,a_rea

十,DQL查询

完整语法:
select [TOP|DISTINCT] [选择列表]|[*]
from 数据源
[where 查询条件]
[group by 分组条件]
[having 过滤条件]
[order by 排序条件 asc|desc nulls first|last];

10.1简单查询

并列查询
and/or and的优先级比or大,
范围查询
/between and
空值查询
is null/is not null
去重查询
distinct
例子:

----对addressid和ownertypeid两个字段并列去重select distinct addressid,ownertypeid from t_owners; 

10.2排序查询

升序:order by 字段 (asc);默认asc可省
降序:order by 字段 desc;
伪列rowid

select rowid,t.* from t_owners t --要给表起别名

伪列rownum

select rownum,t.* from t_owners t --要给表起别名

10.3聚合函数

求和 sum
平均 avg
最大最小 max/min
统计个数 count
分组聚合统计(select后一定是分组聚合的条件或者是聚合函数)

select areaid,sum(money) from t_account group by areaid 

分组后条件查询 having

10.4连接查询

(1)内连接

隐式内连接:select * from emp e1, dept d1 where e1.deptno = d1.deptno;显示内连接:select * from emp e1 inner join dept d1 on e1.deptno = d1.deptno;

(2)外连接
左外连接

隐式左外连接:select * from emp e1,dept d1 where e1.deptno = d1.deptno(+);显示左外连接:select * from emp e1 left outer join dept d1 on e1.deptno = d1.deptno;

右外连接

隐式右外连接:select * from emp e1,dept d1 where e1.deptno(+) = d1.deptno;显示右外连接:select * from emp e1 right outer join dept d1 on e1.deptno = d1.deptno;

全外连接:

select * from emp e1 full outer join dept d1 on e1.deptno = d1.deptno;

(3)交叉连接

隐式交叉连接:select * from emp, dept;显示交叉连接:select * from emp e1 cross join dept d1;

10.5子查询

单行子查询:>、>=、<、<=、!=、、=、
多行子查询:in、not in、any、some、all、exits
1、in的使用

--查询所有经理的信息select * from emp where empno in (select mgr from emp where mgr is not null);

2、not in的使用

--查询不是经理的信息select * from emp where empno not in (select mgr from emp where mgr is not null);

3、any的使用

--查询出比10号部门任意一个员工薪资高的员工信息select * from emp where sal > any (select sal from emp where deptno = 10);

4、some的使用

--查询出比10号部门任意一个员工薪资高的员工信息select * from emp where sal > some (select sal from emp where deptno = 10);

5、all的使用

--查询出比20号部门所有员工薪资高的员工信息select * from emp where sal > all (select sal from emp where deptno = 20);

6、exits的使用

--查询有员工的部门的信息select * from dept d1 where exists (select * from emp e1 where e1.deptno = d1.deptno);

7、from子查询

select * from(select * from emp e1 where e1.deptno = d1.deptno);

8、select子句中的子查询
select子句中的子查询必须为单行子查询

select id,name,(select name from t_address where id=addressid) addressname from t_owners;

10.6分页查询

简单分页

--rownum只能用<<=,不能使用>>=select rownum,t.* from t_account t where rownum<10;

或用子查询

--查询前10条员工的信息--注意:Oracle中不支持limit,需要在原始表加上一列:行号,然后使用子查询来实现分页select * from (select rownum r,e.* from t_account t) where r >=1 and r <= 10;

基于排序的分页

--两层子查询select * from (select rownum r,t.*from (select * from T_account t order by usenum desc ) t) where r>=1 and r<10;

十一,函数大全

11.1字符函数

--dual 是伪表--求字符串长度select length('ABCD') from dual;--求字符串子串select substr('ABCD',2,2) from dual;--求字符串拼接select concat(concat('ABCD',EF'),'F') from dual;select 'ABCD'||'E'||'F' from dual

11.2数值型函数

--四舍五入select round (100.567,2) from dual--数字截取select trunc (100.567,2) from dual

11.3日期函数

--加月select add_month(sysdate,2) from dual--求当月最后一天select last_day(sysdate) from dual--日期截取select trunc(sysdate) from dual--按日截取(把时间截掉)select trunc(sysdate,'mm') from dual--按月截取(日默认为1)

11.4转换函数

--数字转字符串select to_char(100) || '分' from dual;--日期转字符串select to_char(sysdate,'yyyy-mm-dd') from dual;--字符串转日期select to_date('2016-03-10','yyyy-mm-dd') from dual--字符串转数字select to_number('100')+ 10 from dual;

11.5其他函数


例子:

--空值处理select nvl(null,0) from dual--返回0select nvl(100,0) from dual--返回100第一个值为null,返回第二个值,否则返回第一个值--decode 条件判断select decode(100,1,2,3,4,100,200) from dual;--返回200select name,decode(ownertypeid,1,'居民',2,'行政',3,'商业') from t_owners;--根据id匹配信息--case when thenelse endselect name,(case ownertypeidwhen 1 then '居民' when 2 then '行政' when 3 then '商业' else '其他' end) from t_owners; select name,(case when ownertypeid=1 then '居民' when ownertypeid=2 then '行政' when ownertypeid=3 then '商业' else '其他' end) from t_owners;--可以修改=,适用于复杂情况

11.6行列转换

--行列转换,月份本来是行的信息变成了列的信息select (select name from t_area where id=areaid) 区域,sum(case when month='01' then money else 0 end) 一月,sum(case when month='02' then money else 0 end) 二月,sum(case when month='03' then money else 0 end) 三月,sum(case when month='04' then money else 0 end) 四月from t_account where year ='2022' group by areaid;select (select name from t_area where id=areaid) 区域,--case when 条件 and 条件 thenelse endsum(case when month>='01' and month<=03 then money else 0 end) 第一季度,sum(case when month>='04' and month<=06 then money else 0 end) 第二季度,sum(case when month>='07' and month<=09 then money else 0 end) 第三季度,sum(case when month>='10' and month<=12 then money else 0 end) 第四季度from t_account where year ='2022' group by areaid;

11.7分析函数

--分析函数 --值相同,排名相同,序号跳跃 rankselect rank() over(order by usenum desc) 排名,t.* from t_account t--值相同,排名相同,序号连续 dense_rankselect dense_rank() over(order by usenum desc) 排名,t.* from t_account t --序号连续,不管值是否相同 row_numberselect row_number() over(order by usenum desc) 排名,t.* from t_account t 

11.8集合运算

并集运算:union all(保留重复记录)
并集运算:union(去掉重复记录)
交集运算:intersect
差集运算:minus(注意前后顺序)

十二,Orcle对象-视图

12.1视图的定义和优点

视图是对查询结果的一个封装,视图里面所有的数据,都是来自于它查询的那张表,视图本身不存储任何数据,但是可以修改原数据,但是不建议这样使用
优点:
1.简化数据的操作
2.着重于特定数据
3.提供了一种简单的安全机制
4.提供向后兼容性

12.2语法

创建语法:

create [or replace] [force] view 视图名称as 查询语句[with check option]--检查约束[with read only];--只读约束

删除视图语法:

drop VIEW 视图名称

12.3案例

--创建简单视图creat view view_owners1 asselect *from t_owners where ownertypeid=1--查询简单视图select * from view_owners1 where addressid=1--修改视图数据update view owners1 set name='范小冰' where id=1;commit;select *from t_owners; --返回范的name为范小冰--结论:视图和表数据一起变化
--带检测约束的视图creat view view_adress2 asselect *from t_adress where areaid=2with check option--无法修改,该视图的条件是areaid=2update view view_adress2 set areaid=3 where id=4--只读约束的视图creat or replace view view_owners1 asselect *from t_owners where ownertypeid=1with read only; --不可修改了--创建带错误的视图create force view view_test asselect *from t_test--此表不存在,可以先建视图成功,后再建表

复杂视图

--复杂视图--多表关联create or replace view view_owners adselect ow.id 业主编号,ow.name 业主名称,ot.name 业主类型 from t_owners ow,t_ownertype otwhere ow.ownertypeid=ot.id;--查询复杂视图select * from view_owners --修改复杂视图(多表关联)的数据update view_owners set 业主名称='林玲玲' where 业主编号=4;--可修改update view_owners set 业主类型='商业' where 业主编号=4;--不可修改--结论:键保留表;把主键保留下来的那个表.只有键保留表的内容可以修改,其他不可修改

聚合统计的复杂视图

--聚合统计的复杂视图--不可修改create view view_accountsum asselect year,month,sum(money) from t_accountgroup by year,month order by year,monthupdate view_accountsum set month='04' where year='2012' and month ='03';--不可修改

十三,物化视图(oracle独有)

13.1什么是物化视图

视图是一个虚拟表(可以认为是一条语句),基于它创建时指定的查询语句返回的结果集.每次访问它都会导致这个查询语句被执行一次.为了避免每次都执行这个查询.可以将这个查询结果存储到一个物化视图(也叫实体化视图).物化视图相当于一张真实的表,需要建立副本.
优点:提高效率 缺点:占用空间

13.2创建物化视图语法

CREATE METERIALIZED VIEW view_name[BUILD IMMEDIATE | BUILD DEFERRED]REFRESH [FAST|COMPLETE|FORCE] --刷新方式,默认是force自动选择[ON [COMMIT|DEMAND] |START WITH (start_time) NEXT (next_time)]AS查询语句--build immediate 立刻(默认)--build deferred延期--complete 完全刷新--fast 增量更新--force自动选择(默认)--on commit 在基表做提交操作是刷新物化视图,自动刷新--on demand 手动刷新(默认)

删除视图

drop meterizlized view 物化视图名称

13.3案例

手动刷新的物化视图

--创建手动刷新的物化视图create meterialized view mv_address1 asselect ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid=ar.id;--查询物化视图select* from mv_address1;--执行下列语句进行刷新beginDBMS_MVIEW.refresh('mv_address1','c');end;--结论默认手动刷新如过基表新增数据需要执行刷新sql刷新数据

创建自动刷新的物化视图

--创建自动刷新的物化视图create meterialized view mv_address2 refreshon commitasselect ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid=ar.id;--基表新增数据,视图实时可以查到

创建时延期生成数据的物化视图

create meterialized view mv_address3build deferred refreshon commitasselect ad.id,ad.name,ar.name arname from t_address ad,t_area ar where ad.areaid=ar.id;--查询视图select * from mv_address3;--无数剧--必须手动执行刷新,执行后变自动beginDBMS_MVIEW.refresh('mv_address3','c');end;

创建增量刷新的物化视图

--创建增量刷新的物化视图--前提1 是必须创建物化视图日志;记录哪些基表发生哪些变化,用这些记录去更新物化视图create materialized view log on t address with rowid--前提2 创建物化视图的语句中,必须有基表的rowidcreate meterialized view mv_address4refresh fastasselect ad.rowidadrowid,ad.id,ad.name,ar.rowid arriwid,ar.name arname from t_address ad,t_area ar where ad.areaid=ar.id;

十四,序列(oracle独有)

14.1什么是序列

序列是Oracle提供的用意产生一系列唯一数字的数据库对象

14.2创建或使用简单序列

创建序列语法:

create sequence 序列名称;

14.3案例

创建简单序列

--创建简单序列create sequence seq_test;--查询序列的下一个值select seq_test.nextval from dual;--查询序列的当前值select seq_test.currval from dual;

创建复杂序列语法:

CREATE SEQUENCE 序列名称 [increment by n]--递增的序列值是n,如果n是正数就递增,如果是负数就递减,默认是1 [start with]--开始得值,递增默认是minvalue 递减是maxvalue [maxvalue|nomaxvalue]--最大值 [minvalue|nominvalue]--最小值 [cycle|nocycle]--循环/不循环 [cache n|nocache]--分配并存入内存中
--create sequence seq_test3 increment by 10 start with 10 minvalue 5 maxvalue 100 cycle

十五,同义词(oracle独有)

15.1含义

同义词就是别名的意思和视图的功能类似,就是一种映射关系.相当于表的别名

15.2语法

--创建--不加public是私有,仅此客户可查create [public] synonym 同义词名称 for 对象的名称;--修改create or replace [public] synonym 同义词名称 for 对象的名称;--删除drop [public] synonym 同义词名称;

十六,索引

16.1什么是索引

索引相当于是一本书的目录,能够提高我们的查询效率

16.2普通索引

createindex 索引名 on 表名(列名);--性能测试 创建一个表create table t_indextest(id number,name varchar(30));--向表中插入100万条记录begin for x in 1..1000000 loop insert into t_indextest value (x,'AA'||x);end loop;commit; end;--创建索引create index index_test on t_indextest(name);select * from t_indextest where id=765432;

16.3唯一索引

--创建唯一索引,此列数据唯一,相当于加了个唯一约束create uniqueindex 索引名 on 表名(列名);

16.4复合索引

--复合索引列不止一列createindex 索引名 on 表名(列名1,列名2,...);

16.5反向键索引

应用场景:
当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树,这样会增加查询的层数,性能会下降.简历反向键索引,可以使索引的值变的不规则,从而使索引树均匀分布.

--反向键索引create index 索引名称 on 表名(列名) reverse;

16.6位图索引

使用场景:位图索引适合创建在低基数列上
优点:减少响应时间

--位图索引,不能做范围查询,只能用=号条件查询create bitmap index 索引名称 on 表名(列名) reverse;

十七,PLSQL

17.1什么是PLSQL

PL/SQL(Procedure Language)是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力.把SQL语言的数据操纵能力与过程语言的数据处理能力结合其来,使得PLSQL面向过程但比过程语言简单、高效、灵活和使用.
基本语法:

declare--声明变量 begin--业务逻辑[exception--异常处理]end;

17.2变量

声明变量的语法:

变量名 类型(长度);

变量赋值的语法:

变量名:=变量值;
--select into 从数据库中查询declarev_price number(10,2);--单价 v_usenum number;--水费字数 v_usenum2 number(10,2);--吨数 v-money number(10,2);--金额 v_num0 number;--上月 v_num1 number;--本月水表数begin v_price:=2.45;--单价 select usenum into v_usenum from t_accountwhere year ='2022' and month='01' and owneruuid=1; v_usenum2 :=round(v_usenum/1000,2);--吨数 v-money :=v_price*v_usenum2;--金额 DBMS_OUTPUT.put_line('金额:'||v-money);end;

17.3属性类型

作用:引用某表某列的字段类型.

--属性类型(引用型 表名.列名%type)declarev_price number(10,2);--单价 v_usenum t_account.usenum%type ;--水费字数 v_usenum2 number(10,2);--吨数 v-money number(10,2);--金额 v_num0 t_account.num0%type;--上月 v_num1 t_account.num1%type;--本月水表数begin v_price:=2.45;--单价 select usenum into v_usenum from t_accountwhere year ='2022' and month='01' and owneruuid=1; v_usenum2 :=round(v_usenum/1000,2);--吨数 v-money :=v_price*v_usenum2;--金额 DBMS_OUTPUT.put_line('金额:'||v-money);end;
--属性类型(记录型 表名%rowtype)declarev_price number(10,2);--单价 v_usenum t_account.usenum%type ;--水费字数 v_usenum2 number(10,2);--吨数 v_money number(10,2);--金额 v_account t_account%rowtype;--台账行记录类型begin v_price:=2.45;--单价 select * into v_account from t_accountwhere year ='2022' and month='01' and owneruuid=1; v_usenum2 :=round(v_account.usenum/1000,2);--吨数 v-money :=v_price*v_usenum2;--金额 DBMS_OUTPUT.put_line('字数:'|| v_account.usenum '金额:'||v-money);end;

17.4异常

异常有两种类型
预定义异常和用户定义异常
预定义异常种类:

语法结构:

expectionwhen 异常类型 then异常处理逻辑

案例:

expectionwhen no_data_found thenDBMS_OUTPUT.put_line('没有找到账务数据')

17.5条件判断

--语法1if 条件1 then业务逻辑end if;
--语法2if 条件1 then业务逻辑 else 业务逻辑end if;
--语法3if 条件1 then业务逻辑 elsif 条件2 then 业务逻辑else业务逻辑end if;

17.6循环

1.无条件循环
语法:

loop 业务逻辑end loop

2.有条件循环
语法:

 while 条件 loop业务逻辑 end loop

3.for循环
语法:

 for 变量in [reverse] 起始值..结束值loop 业务逻辑 end loop

17.7游标

1什么是游标
游标是用来操作查询结果集,相当于是JDBC中ResultSet,它可以对查询的结果一行一行的获取.
2语法结构及案例
语法:

--声明游标cursor 游标名[(参数 参数类型)] is 查询语句;
--使用游标 open 游标名[(参数 参数类型)]; loopfetch 游标名 into 变量;exit when 游标名称%notfound end loop; --关闭游标close 游标名;

3案例
不带参数的游标

---不带参数的游标select * from t_pricetable where ownertypeid=1--游标 输出结果集declarecursor cur_pricetable is select * from t_pricetable where ownertypeid=1;--声明游标 v_pricetable t_pricetable%rowtype;begin open cur_pricetable;--打开游标loop fetch cur_pricetable into v_pricetable;--提取游标 exit when cur_pricetable%notfound;--退出循环游标 DBMS_OUTPUT.put_line('价格:'||v_pricetable.price||'吨位:'v_pricetable.minnum||'-'||v_pricetable.maxnum);end loop close cur_pricetable; --关闭游标end;

带参数的游标

---带参数的游标declarecursor cur_pricetable(v_ownertype number) is select * from t_pricetable where ownertypeid=v_ownertype;--声明游标 v_pricetable t_pricetable%rowtype;begin open cur_pricetable(1);--打开游标()内为参数loop fetch cur_pricetable into v_pricetable;--提取游标 exit when cur_pricetable%notfound;--退出循环游标 DBMS_OUTPUT.put_line('价格:'||v_pricetable.price||'吨位:'v_pricetable.minnum||'-'||v_pricetable.maxnum);end loop close cur_pricetable; --关闭游标end;

for循环

---for循环 带参数的游标declarecursor cur_pricetable(v_ownertype number) is select * from t_pricetable where ownertypeid=v_ownertype;--声明游标-- v_pricetable t_pricetable%rowtype;begin for v_pricetable in cur_pricetable(2)loop DBMS_OUTPUT.put_line('价格:'||v_pricetable.price||'吨位:'v_pricetable.minnum||'-'||v_pricetable.maxnum);end loop close cur_pricetable; --关闭游标end;

十八,存储函数

18.1什么是存储函数

存储函数又称自定义函数.可以接受参数,返回结果

18.2语法结构

create function 函数名称(参数名 in|out 参数类型,参数名 in|out 参数类型,...) return 返回的参数类型is|as --声明部分begin --业务逻辑return 结果变量; [exception异常处理部分]end;

18.3案例:

--存储函数的创建create or replace function fn_getaddress(v_id number)return varchar2is v_name varchar2(30);begin --查询地址表 select name into v_name from t_address where id=v_id; return v_name;end;--查询测试结果select fn_getaddress(3)from dual;

十九,存储过程

19.1什么是存储过程

存储过程实际上是封装在服务器上一段PLSQL代码片断,它已经编译好了,如果客户端调用存储过程,执行效率就会非常高效.
存储过程与存储函数的区别:
1.存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值.
2.存储函数可以在select语句中直接使用,而存储过程不能.过程多数是被应用程序所调用.
3.存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码.

19.2存储过程语法结构

--创建或修改语法create [or replace] procedure 存储过程名称(参数名 in|out 参数类型,参数名 in|out 参数类型,...) --不写默认为inis|as --声明部分begin --业务逻辑[expection异常处理]end;
--删除语法drop procedure 存储过程名称;

19.3案例

1.创建不带传出参数的存储过程

--创建不带传出参数的存储过程create sequence seq_owners start with 11;--业主序列create or replace procedure pro_owners_add(v_name varchar2,--名称v_addressid number,--地址编号v_housenumber varchar2,--门牌号v_watermeter varchar2,--水表号v_ownertypeid number--业主类型)isbegininsert into t_owners values(seq_owners.nextval,v_name,v_addressid,v_housenumber,v_watermeter,sysdate,v_ownertypeid)commit;end--调用不带传出参数的存储过程--方法1call pro_owners_add('hhh','1','2','3','1');--方法2beginpro_owners_add('hhh','1','2','3','1');end;

2.JDBC调用不带传出参数的存储过程

3.

--创建带传出参数的存储过程create sequence seq_owners start with 11;--业主序列create or replace procedure pro_owners_add(v_name varchar2,--名称v_addressid number,--地址编号v_housenumber varchar2,--门牌号v_watermeter varchar2,--水表号v_ownertypeid number,--业主类型v_id out number)isbegin --对传出参数赋值 select seq_owners.nextval into v_id from dual; --新增业主insert into t_owners values(seq_owners.nextval,v_name,v_addressid,v_housenumber,v_watermeter,sysdate,v_ownertypeid)commit;end--调用带传出参数的存储过程--只能用begin enddeclarev_id number;begin pro_owners_add('hhh2','1','2','3','1',v_id); dbms_output.put_line(v_id)end;

4.JDBC调用带传出参数的存储过程

二十,触发器

20.1什么是触发器

当用户执行了 insert | update | delete 这些操作之后,可以触发一系列其它的动作、业务逻辑,使用触发器可以协助应用在数据库端确保数据的完整性、日志记录 、数据校验等操作。使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在Oracle触发器不仅支持行级触发,还支持语句级触发.
用于:
1.数据确认
2.实施复杂的安全性检查
3.做审计
4.数据的备份和同步
触发器的分类:
1.前置触发器
2.后置触发器
或者分为行级和语句级

20.2创建触发器的语法

create trigger 触发器名称before|afterinsert|[or]update|[or]delete [of 列名]on 表名称[for each row]--行级触发器[when {条件}]--条件declare --声明部分begin --业务逻辑 end;
--删除触发器drop tigger 触发器名称;

在触发器中触发语句与伪记录变量的值
触发语句 (行级才有语句级没有)

触发语句:old:new
insert所有字段都是空(null)将要插入的数据
update更新以前该行的值更新后的值
delete删除以前该行的值所有字段都是空(null)

20.3案例

--前置触发器create or replace tigger tri_account_num1before updateof num1on t_accountfor each rowdeclarebegin --通过伪记录变量修改usenum字段的值 :new.usenum:=new.num1=:new.num2;end
--后置触发器--创建日志表,记录业主名称修改前和修改后的名称create table t_owners_log(updatetime date,ownerid number,oldname varchar2(30),newname varchar2(30));create or replace tigger tri_owners_logafterupdateof nameon t_ownersfor each rowdeclarebegin --向日志表插入记录 insert into t_owners_log values(sysdate,:new.id,:old.name,:new.name) :new.usenum:=new.num1=:new.num2;endupdate t_owners set name='林霖霖'where id=4;