今天在刪除一個車輛品牌表的時候,遇到了一個問題,是在java的代碼中作邏輯刪除仍是直接在Oracle中一次刪除完成呢java
思來想去以爲仍是在sql裏直接刪除比較合適,sql
爲何呢?數據庫
第一,涉及數據庫的讀寫操做必定要聽從ACID原則,數據結構
第二,java中操做單個刪除太麻煩,並且佔用內存,屢次打開數據庫連接,形成資源浪費oop
第三,很久沒寫儲存過程了,太鹹lua
下面是這個表的結構spa
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,溫習了下儲存過程經常使用的關鍵字code
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;