今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢

思来想去觉得还是在sql里直接删除比较合适,

为什么呢?

第一,涉及数据库的读写操作一定要遵从ACID原则,

第二,java中操作单个删除太麻烦,而且占用内存,多次打开数据库链接,造成资源浪费

第三,好久没写储存过程了,太咸

下面是这个表的结构

create table T_BRAND_CLASS
(
ID VARCHAR2(32) not null,
BRAND_NAME VARCHAR2(100),
BRAND_IMG VARCHAR2(32),
BRAND_INITLAL VARCHAR2(10),
BRAND_ISHOT VARCHAR2(10),
BRAND_ISSTICK VARCHAR2(10),
constraint PK_T_BRAND_CLASS primary key (ID)
USING INDEX ENABLE
); comment on table T_BRAND_CLASS is
'品牌分类';
create table T_BRAND_TYPE
(
ID VARCHAR2(32) not null,
BRAND_CLASS_ID VARCHAR2(32),
TYPE_NAME VARCHAR2(100),
constraint PK_T_BRAND_TYPE primary key (ID)
USING INDEX ENABLE
); comment on table T_BRAND_TYPE is
'品牌型号';
create table T_BRAND_SPECIFICATION
(
ID VARCHAR2(32) not null,
BRAND_ID VARCHAR2(32),
BRAND_CC VARCHAR2(32),
CC_TYPE NUMBER,
constraint PK_T_BRAND_SPECIFICATION primary key (ID)
USING INDEX ENABLE
); comment on table T_BRAND_SPECIFICATION is
'品牌规格';
create table T_BRAND_SERIES
(
ID VARCHAR2(32) not null,
SERIES_NAME VARCHAR2(100),
SPECIFCATION_ID VARCHAR2(32),
SERIES_YEAR VARCHAR2(10),
constraint PK_T_BRAND_SERIES primary key (ID)
USING INDEX ENABLE
); comment on table T_BRAND_SERIES is
'品牌车系';

大概的可以看出来这个一个树状结构的表,彼此的关联就是一个对方的id,温习了下储存过程常用的关键字

cursor :游标 紧跟后面的sql查询的结果会自动给定义的变量赋值,数据结构类似lua里的table,
BEGIN:BEGIN和end之间的代码会动态的执行;
for .. in .. loop:循环
v_sql VARCHAR2(1000);:定义数据类型
v_sql:= :赋值方式
execute immediate .aa.USING bb :aa是一个要执行的sql语句,bb是一个aa中的输出占位符填充数据
看完上面大概后一个简单的储存过程就可以写出来了,如下传入一个表名的id 就可以删除对应表数据下面的所有关联数据

create or replace PROCEDURE DEL_brand_class(istable_id  in VARCHAR2)
is
v_sql VARCHAR2(1000);
typeid VARCHAR2(1000);
speid VARCHAR2(1000);
serid VARCHAR2(1000);
cursor cur_tableid is
select a.id as id,
b.id as typeid,
c.id as speid,
d.id as serid
from t_brand_class a
left join T_BRAND_TYPE b on a.id = b.BRAND_CLASS_ID
left join T_BRAND_SPECIFICATION c on b.id = c.BRAND_ID
left join T_BRAND_SERIES d on c.ID = d.SPECIFCATION_ID
where a.id = istable_id;
BEGIN
for rec_id in cur_tableid loop v_sql:='delete from t_brand_class where id =:1';
typeid:='delete from T_BRAND_TYPE where id = :1';
speid:='delete from T_BRAND_SPECIFICATION where id = :1';
serid:='delete from T_BRAND_SERIES where id = :1';
execute immediate v_sql USING rec_id.id;
execute immediate typeid USING rec_id.typeid;
execute immediate speid USING rec_id.speid;
execute immediate serid USING rec_id.serid;
end loop;
commit;
END DEL_brand_class;

最新文章

  1. Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“
  2. 异步-学习笔记3 Task
  3. Silverlight 上传文件源代码
  4. Unity3D研究院之Jenkins的使用(七十八)
  5. HDU 4862(费用流)
  6. PHP学习心得(八)——运算符
  7. (转) 学习C++ -> 引用( References )
  8. OpenProcess() 函数
  9. 新浪云-PHP实现上传原图,缩略图
  10. CodeForces 725A
  11. vim的基本介绍
  12. Java中字符串相加和字符串常量相加区别
  13. 图 总结 AI
  14. .net 定时启动任务
  15. 信噪比——信号加噪相关的知识
  16. EXT3.0在IE下Range不兼容解决办法
  17. RabbitMQ添加rabbitmqadmin和其使用方法(类似Redis的redis-cli)
  18. MySQL主从复制-指定数据库复制
  19. Codeforces Round #354 (Div. 2) A. Nicholas and Permutation 水题
  20. Sybase中的load table的用法

热门文章

  1. Tmux入门教程
  2. DevExpress中Tile Application窗体的模型架构图
  3. 用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇
  4. Hibernate一级缓存测试分析
  5. 应用于电力电子变压器的双向DC_DC变换器综述(学习笔记)
  6. 认识与学习shell
  7. Day 12 装饰器,开发封闭.
  8. jzoj4419
  9. Python面向对象(类的成员之字段)
  10. 七,apache配置域名