oracle存储过程删除树状结构的表数据
今天在删除一个车辆品牌表的时候,遇到了一个问题,是在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;
oracle存储过程删除树状结构的表数据的更多相关文章
- lua 怎样输出树状结构的table?
为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据. ccmlog.lua local function __tostring(value, indent, vmap) local str ...
- oracle 树状结构递归 PL/SQL输出控制 包括空格输出控制
树状结构 存储过程中通过递归构建,类似BBS回帖显示,代码共三段: 建表,插入数据,创建存储过程显示: 1.create table article(id number primary key,con ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- EntityFrameworkCore 单表树状结构配置
数据结构 public class TreeNode { [Key] public long Id { get; set; } public string NodeName { get; set; } ...
- 用Django ORM实现树状结构
前言 之前看对于用关系数据库实现树状结构的方法就知道一直做自关联的表,但是感觉自关联查询太慢了,最近看到一篇文章,感觉视野开拓了好多,文章:数据库表设计,没有最好只有最适合来自:微信. 下面就针对这里 ...
- openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】
1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...
- oracle中的树状查询
oracle中的树状查询 工作中经常会遇到将数据库中的数据以树的形式展现的需求.以下我们来看一下该需求在Oracle中如何实现. 首先我们需要有一个树形的表结构(当然有时候会出现表结构不是典型的树形结 ...
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...
随机推荐
- MYC编译器源码之词法分析
前文 .NET框架源码解读之MYC编译器 和 MYC编译器源码分析之程序入口 分别讲解了 SSCLI 里示例编译器的架构和程序入口,本文接着分析它的词法分析部分的代码. 词法解析的工作都由Tok类处 ...
- HTML/HTML5
HTML/HTML5 一.文档加载顺序. 文档入下,数字编号为加载顺序. <html><!--1--> <head><!--2--> <link ...
- VS版本与系统不兼容问题
1.VS2012在win7 64位系统安装快结束时报出一个不兼容的错误. 2.这种情况官方给出解决方法: http://www.microsoft.com/en-us/download/details ...
- Python 读取大文件的方式
对于读取容量小的文件,可以使用下面的方法: with open("path", "r") as f: f.read() 但是如果文件容量很大,高达几个G或者十几 ...
- 线程TLAB局部缓存区域(Thread Local Allocation Buffer)
TLAB(Thread Local Allocation Buffer) 1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,Sun ...
- Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用
关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的 应用程序,大家如果真正的有所兴趣,建议大家看看源码, ...
- Using Time Profiler in Instruments
要用 release 版本来profile 概述 time profile 是使用采样的方法来统计,而不是记录每一个方法调用的起始和结束,采样间隔是 1 ms.  在上图中,main 函数被采样了 ...
- linux,修改文件夹权限
chmod -R 777 dist/ chown windseek:staff dist/ 改变dist的权限到staff组里的windseek用户下 alias ll=`ls -al` ...
- git问题--Push rejected: Push to origin/master was rejected
解决git问题 Push rejected: Push to origin/master was rejected 意思是git拒绝合并两个不相干的东西 此时你需要在打开Git Bash,然后进入相应 ...
- Swift 4.0 废弃的柯里化
// 柯里化 // http://www.jianshu.com/p/6eaacadafa1a Swift 2.0 柯里化方法 (废弃) / ...