oracle数据库开发案例
1、数据库在应用系统中的重要性
定义:是数据集合或仓库,在计算机存储上,有组织的
类型:关系数据库、内存数据库、嵌入数据库等
环节:需求设计、开发测试、部署实施、监控维护和patch升级等
数据库开发(后台开发)
我们的应用开发离不开数据库开发
java、c++、c等中的数据库编程≠数据库开发
我们不仅仅掌握简单的DML语句
2、常见(对象|函数|数据字典|操作符)
常见对象
table、index、materialized view/snapshot、cluster
存储上占物理空间
Procedure、function、trigger、package、package body
程序体
View、sequence、synonym、db link
常见数据字典
对象级的
user_clusters、user_db_links、user_indexes、user_mviews、user_sequences、user_snapshots、user_synonyms、user_tables、user_types、user_views、user_triggers
有关表的
user_tab_cols、user_tab_columns、user_tab_comments、user_tab_partitions、user_tab_privs、user_tab_subpartitions
有关索引的
user_indextypes、user_ind_columns、user_ind_partitions、user_ind_subpartitions
有关权限和约束的
user_sys_privs、user_ts_quotas、user_col_privs、user_constraints、user_cons_columns
其他的
tab、dict、dual等
常见操作符
+、- 、 * 、 / 、 NULL 、 || 、 = 、!= 、 <> 、 < 、 > 、 <= 、 >=、 (not) between... And、like、or、 (not) exists
(not) in、any、all
union(all)、intersect、minus
3、养成良好的编码规范
好的命名吗
数据库对象名、脚本文件名,程序体变量名等
有注释吗
为每个脚本文件每个对象每个属性作有助的注释
布局合理吗
换行、缩进、关键字突出打头,begin/end对齐等
异常有处理吗
不要吝啬Exception when/try catch等的使用
回滚脚本
4、开发案例实战演习
场景描述
sp提供业务供用户定购使用(Mini版)
场景设计
E-R图,模型建立等
基本对象定义:
Sp信息表spinfo
业务表service
用户表subscriber
定购关系事实表subscription
============================================================================
5、实战演习
select语句
结果集
select into的俘获异常
select for update的Lock产生
需要select *么?
索引的正确使用
索引是什么
什么情况下要使用索引和不使用索引
索引对于性能来将是一把双刃剑
游标问题
什么情况下需使用游标
显式游标和隐式游标
解决“ora-010000”异常的产生
特殊字符与通配符的处理
%、&等
关键字escape的使用
set define off的使用
字符串中两个单引号代表一个单引号等
主从表问题
PK和FK
操作时的先后顺序
参数“ON DELETE CASCADE”的看法
==============================================================================
实战脚本
Rem
Rem Subject: oracle数据库开发案例脚本
Rem Copyright (c) ASPire 2007. All Rights Reserved.
Rem Dbversion:1.0.0
Rem MODIFIED (YYYY/MM/DD) DESCRIPTION
Rem (有待添加)
Rem ShiYiHai 2007/9/10 新建开发案例脚本
-----------------------------------1、建表、索引和约束---------------------------------------------
prompt
prompt SP信息表
prompt ======================================
prompt
CREATE TABLE SPinfo
(
SPId VARCHAR2(12) NOT NULL,
SPName VARCHAR2(100) NOT NULL,
Status VARCHAR2(1) NOT NULL
);
alter table SPinfo
add constraint pk_spinfo primary key (SPID)
using index;
prompt
prompt 服务信息表
prompt ======================================
prompt
CREATE TABLE Service
(
ServiceId VARCHAR2(12) primary key,
ServName VARCHAR2(64) NOT NULL,
SPId VARCHAR2(12) NOT NULL,
StartTime VARCHAR2(14),
EndTime VARCHAR2(14),
status VARCHAR2(2)
);
prompt
prompt 用户基本信息
prompt ======================================
prompt
CREATE TABLE SUBSCRIBER
(
SubsId VARCHAR2(15) NOT NULL,
Name VARCHAR2(128) NOT NULL,
Sex CHAR(1) NOT NULL,--M:男 F:女
Status CHAR(1) NOT NULL,
score number(12),
constraint pk_SUBSCRIBER primary key(SubsId)
);
prompt
prompt 订购关系事实表
prompt ======================================
prompt
CREATE TABLE SUBSCRIPTION
(
SubsId VARCHAR2(15) NOT NULL,
ServiceId VARCHAR2(12) NOT NULL,
Subscribe_Date DATE default sysdate NOT NULL
);
alter table Service
add constraint FK_Service_SPid foreign key (spid) references spinfo(spid);
create index indx_SUBSCRIPTION_SubsId on SUBSCRIPTION(SubsId);
-----------------------------------2、采用不同方式初始化数据---------------------------------------------
insert into SPINFO (SPID, SPNAME, STATUS)
values ('444401', '444401', 'A');
insert into SPINFO (SPID, SPNAME, STATUS)
values ('900652', 'AutoCSSP', 'S');
insert into SPINFO (SPID, SPNAME, STATUS)
values ('832014', '紫移通', 'X');
insert into SPINFO
values ('911001', '灵通网fs1', 'A');
commit;
--A正常,S暂停,X下线
create sequence seq_service_serviceid
increment by 1
start with 1
maxvalue 999999999
nocycle
cache 20;
declare
v_num number;
v_servname varchar2(64);
v_spid varchar2(12);
v_starttime date;
v_endtime date;
v_status varchar2(2);
begin
for v_num in 1 .. 1000 loop
v_servname := '业务'||v_num;
v_spid := '444401';
v_starttime := sysdate;
v_endtime := sysdate+365;
v_status := 'A';
insert into Service(serviceid,servname,spid,starttime,endtime,status)
values(seq_service_serviceid.nextval,v_servname,v_spid,v_starttime,v_endtime,v_status);
if mod(v_num,100)=0 then
commit;
end if;
end loop;
exception
when others then
rollback;
dbms_output.put_line(substr(sqlerrm,1,256));
return;
end;
/
insert /*+ append */ into service
select seq_service_serviceid.nextval,'业务'||seq_service_serviceid.currval,
'900652',sysdate,to_date('20100101235959','yyyy-mm-dd hh24:mi:ss'),'S'
from service;
commit;
insert into service
select seq_service_serviceid.nextval,'业务'||seq_service_serviceid.currval,
'832014',sysdate,to_date('20090109235959','yyyy-mm-dd hh24:mi:ss'),'X'
from service
where spid='444401';
commit;
--采用sqlldr往subscriber中插入数据
--采用@执行脚本载入数据
---------------3、当sp下线时sp相应的业务也下线,当sp暂停时sp相应的业务也暂停-----------
prompt
prompt sp状态变更时业务对应状态也作相应变更
prompt 当sp下线时sp相应的业务也下线,当sp暂停时sp相应的业务也暂停
prompt ======================================
prompt
create or replace trigger trg_spinfo
AFTER update on spinfo
for each row
begin
if updating then
if(:old.status <> 'X') and (:new.status = 'X') then
update service
set status = 'X'
where spid = :new.spid;
end if;
if(:old.status = 'A') and (:new.status = 'S') then
update service
set status = 'S'
where spid = :new.spid;
end if;
end if;
end trg_spinfo;
/
-------4、每月订购业务数排名前100的用户奖励积分,积分为当月定购的业务数;同时将订购人气最旺的业务有效期延长半年时间-----------
prompt
prompt 创建中间表来保存每月订购业务数的对应中间表
prompt ======================================
prompt
create table make_score_user
(
SubsId VARCHAR2(15) NOT NULL,
num number(12)
);
prompt
prompt 每月订购业务数排名前100的用户奖励积分,积分为当月定购的业务数;
prompt 同时将订购人气最旺的业务有效期延长半年时间
prompt ==================================================
prompt
CREATE OR REPLACE PROCEDURE proc_make_score(p_month in varchar2)
AS
BEGIN
--对输入参数做判定
if(length(p_month)<>6) then --检查日期的格式
dbms_output.put_line('日期格式不对,请输入YYYYMM.');
return;
end if;
--清理中间表数据
begin
execute immediate 'truncate table make_score_user';
exception
when others then
dbms_output.put_line(substr(sqlerrm,1,256));
return;
end;
--插入每月用户订购业务数到中间表中
begin
insert into make_score_user(subsid,num)
select subsid,count(distinct serviceid)
from SUBSCRIPTION
where to_char(Subscribe_Date,'yyyymm') = p_month
group by subsid;
commit;
exception
when others then
dbms_output.put_line(substr(sqlerrm,1,256));
rollback;
return;
end;
--给积分(积分为当月定购的业务数)
begin
FOR vcursor in (select subsid,num from (select rownum as rn,subsid,num from (select subsid,num from make_score_user order by num desc)) a where a.rn<=100)
loop
update SUBSCRIBER
set score=score+vcursor.num
where subsid=vcursor.subsid;
end loop;
commit;
exception
when others then
dbms_output.put_line(substr(sqlerrm,1,256));
rollback;
return;
end;
--将订购人气最旺的业务有效期延长半年时间
begin
update service
set endtime=add_months(endtime,6)
where serviceid in (
select serviceid from subscription
group by serviceid having count(*)=
(select max(num) from
(select serviceid,count(*) as num
from subscription
group by serviceid
)
)
);
commit;
exception
when others then
dbms_output.put_line(substr(sqlerrm,1,256));
rollback;
return;
end;
commit;
return;
EXCEPTION
when OTHERS then
rollback;
END proc_make_score;
/
-------5、实现用户数据同步的n种方式-----------
prompt 1、视图方式;
prompt 2、同义词方式;
prompt 3、实体化视图方式;
prompt 4、procedure方式;
ACCEPT user_data_user CHAR prompt 'Please input the db user name for train to another user:'
--也可以是db link
--ACCEPT user_data_link CHAR prompt 'Please input the db link name for dbA to dbB:'
prompt
prompt Creating package syn_user_data
prompt =========================
prompt
create or replace package syn_user_data as
-- 1. 同步方法1(全量在一个事务中)
procedure proc_syn_full_user_data;
-- 2. 同步方法2(一条一条记录比较)
procedure proc_syn_increment_user_data;
end syn_user_data;
/
prompt
prompt Creating package body syn_user_data
prompt ==============================
prompt
create or replace package body syn_user_data as
--increment方式
PROCEDURE proc_syn_full_user_data IS
BEGIN
delete from SUBSCRIBER;
insert into SUBSCRIBER(subsid,name,sex,status,score)
select subsid,name,sex,status,score
from &user_data_user .SUBSCRIBER;
commit;
return;
END proc_syn_full_user_data;
--increment方式
PROCEDURE proc_syn_increment_user_data IS
TYPE RefCurTyp IS REF CURSOR;
vcursor RefCurTyp;
errstr varchar2(1024);
v_full_count number(2);
v_pk_count number(2);
BEGIN
FOR vcursor in (select subsid,name,sex,status,score from &user_data_user .SUBSCRIBER)
LOOP
begin
select nvl(count(*),0) into v_full_count from SUBSCRIBER
where subsid = vcursor.subsid
and name = vcursor.name
and sex = vcursor.sex
and status = vcursor.status
and ((score = vcursor.score and vcursor.score is not null) or (score is null and vcursor.score is null));
if v_full_count > 0 then --两边数据完全匹配,不作任何操作
null;
else
select nvl(count(*),0) into v_pk_count from SUBSCRIBER
where subsid = vcursor.subsid;
if v_pk_count > 0 then --两边数据不完全匹配,需update
update SUBSCRIBER set (subsid,name,sex,status,score)
=(select vcursor.subsid,vcursor.name,vcursor.sex,vcursor.status,vcursor.score from dual)
where subsid = vcursor.subsid;
else --不存在的数据,需insert
insert into SUBSCRIBER(subsid,name,sex,status,score)
values(vcursor.subsid,vcursor.name,vcursor.sex,vcursor.status,vcursor.score);
end if;
end if;
EXCEPTION
when OTHERS then
begin
errstr := SQLERRM;
--这里可写同步出错日志信息到日志表中
end;
end;
END LOOP;
--删除portal用户下冗余的sp
delete from SUBSCRIBER a where not exists (select 1 from &user_data_user .SUBSCRIBER b where a.subsid = b.subsid);
commit;
return;
END proc_syn_increment_user_data;
end syn_user_data;
/
prompt
prompt 每天定时在早上6点执行同步用户信息
prompt =============================
prompt
variable v_job number;
Set ServerOutput on
begin
Dbms_Job.Submit
(
job => :v_job,
what => 'syn_user_data.proc_syn_increment_user_data;',
next_date => to_date(to_char(sysdate+1,'yyyy/mm/dd') || ' 6:00:00','yyyy/mm/dd hh24:mi:ss'), /* run at 6:00 */
interval => 'to_date(to_char(sysdate+1,''yyyy/mm/dd'') || '' 6:00:00'',''yyyy/mm/dd hh24:mi:ss'')'
);
Dbms_Job.Run ( :v_job );
Dbms_Output.Put_Line ( 'Submitted as job # ' || to_char ( :v_job ) );
end;
/
commit;
oracle数据库开发案例相关推荐
- 视频教程-Oracle数据库开发技巧与经典案例讲解一-Oracle
Oracle数据库开发技巧与经典案例讲解一 Oracle DBA,熟悉Unix操作系统,精通Oracle数据库. 曾任职某大型金融IT公司,负责银行领域数据库构建与运维,维护大量银行数据库系统.目前在 ...
- 获取oracle数据库war报告,Oracle 数据库开发及SQL基础实战
Oracle 数据库开发及SQL基础实战 一.数据库基础 主键(Primary Key): 1.某一列或某些列的组合,构成一个主键,在这张二维表里,主键必须不重复.用于在这些行之间进行唯一的区别. 2 ...
- oracle数据库作业1,北京语言20秋《Oracle数据库开发》作业1(100分)
-[北京语言大学]20秋<Oracle数据库开发>作业1 试卷总分:100 得分:100 第1题,Orcacle提供了(),用于支持采用向导方式创建数据库. A.SQL*Plus B ...
- 北语20春oracle数据开发2,北语20春《Oracle数据库开发》作业3题目【标准答案】
20春<Oracle数据库开发>作业3 试卷总分:100 得分:100 一.单选题 (共 17 道试题,共 85 分) 1.当启动Oracle实例,如果不需要装置数据库,可以使用如下() ...
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第42讲:PHP数据库开发案例
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第42讲:PHP数据库开发案例 上节学习了Mysql数据的操作,本节结合贵阳网站建设的实践经验,通过MVC思想进行实例开发和程序设计. 一.网站建设流程介绍 ...
- 13 Oracle数据库开发与设计入门篇
Oracle数据库SQL语言基础 SQL(Structured Query Language,结构化查询语言)语言是一种在关系数据库中定义和操纵数据的标准语言,是用户与数据库之间进行交流的接口.SQL ...
- 【JSP】JSP与oracle数据库交互案例
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- jsp源码oracle数据库,JSP与oracle数据库交互案例
本案例为咖啡销售情况录入查询系统 一.数据输入系统: 1. 设计输入信息页面 代码如下: 咖啡管理系统--录入系统 欢迎来到录入系统 vcm0gYWN0aW9uPQ=="inputactio ...
- 简述与oracle相关的程序组,北语网院18秋《Oracle数据库开发》作业_4答案
交卷时间:2018-11-04 23:45:51 一.老虎奥鹏 www.aopengzuoye.com 1. (4分)在Oracle中,在执行SQL语句时,你不小心使用Update命令将所有的ID值设 ...
最新文章
- Yahoo!团队实践分享:网站性能优化的34条黄金守则
- springcloud全局过滤_微服务技术SpringCloud 互联网网站架构演变过程
- dva的用法_dva.js 用法详解:列表展示
- SpringMVC学习(二)——快速搭建SpringMVC开发环境(注解方式)
- 算法导论-算法基础-2.1插入排序 (从小到大)
- 人民币数字金额转大写金额
- SAP如何自定义客户编码
- 【Hadoop 分布式部署 十 一: NameNode HA 自动故障转移】
- AVI编码器的常见编码
- c语言项目答辩演讲稿,关于竞选社团负责人的演讲稿
- linux服务器突然有大量连接,linux服务器出现丢包的解决方法
- 登录后刷新token
- task5b-验证lncRNA只有部分具有polyA尾结构
- 捋一捋Unified Language Model Pre-training for Natural Language Understanding and Generation
- ValueError: binary mode doesn‘t take an encoding argument
- Docker Volume 使用
- OpenCV每日函数 特征检测和描述模块(5) KAZE类/AKAZE类(提取关键点和计算描述符)
- CCF 201712-4 行车路线(100分)
- 2014 Hulu Upfront Updates
- 安卓Android活动社交仿QQ聊天app设计