• 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;
  • 相关阅读:
    Python 面向对象(初级篇)
    python中的运算符
    初识Python
    浅谈计算机
    Zeppelin interperter 模式设置总结图解2
    maven 使用错误
    TensorFlow anaconda命令备忘
    zeppelin ERROR总结
    YARN 命令总结
    Zeppelin interperter 模式设置总结图解1
  • 原文地址:https://www.cnblogs.com/dmeck/p/9391521.html
Copyright © 2020-2023  润新知