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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章