1. 程式人生 > 其它 >oracle資料庫 自增長及批量處理資料

oracle資料庫 自增長及批量處理資料

技術標籤:資料庫資料庫oracle觸發器

資料庫物件命名規範

資料庫物件包括表、檢視(查詢)、儲存過程(引數查詢)、函式、約束。物件名字由字首和實際名字組成,長度不超過30。
1)字首:
使用小寫字母。如:
表(Table) tb_
欄位(Column)
主鍵(Primary key) pk_
外來鍵(Foreign key) fk_
Check約束(Check Constraint) ck_
Default 約束(Default Constraint) df_
檢視(View) vi_
索引(Index) idx_
儲存過程(Stored procedure) sp_
使用者定義函式 (User-defined function) fn_

序列(Sequence) seq_
表空間(Tablespace) ts_
變數名(Variable) @
觸發器(Trigger) tr_
2)實際名字:
實際名字儘量描述實體的內容,由單詞或單詞組合,每個單詞的首字母大寫,其他
字母小寫,不以數字和_開頭。如:
表 User_Info
檢視 User_List
儲存過程 User_Delete
3)示例:
合法的物件名字類似如下:
表 tb_User_Info tb_Message_Detail
檢視 vi_Message_List
儲存過程 sp_Message_Add

oracle 主鍵自增長

第一種方式:序列化+顯示呼叫序列化。
第二種方式:序列化+觸發器;

一:
第一步:建立序列sequence
(序列名格式要求 :序列(Sequence) seq_XXX )

//建立sequence
create sequence seq_on_table
increment by 1
start with 1
nomaxvalue
nocycle
nocache;

第二步:顯示呼叫序列

insert into table values('001', '安保部', '000', 1, seq_on_test.nextval);

第三步:查詢進行檢視

select * from table 

資料庫 給表格設定預設值 來顯示呼叫序列化的值
在這裡插入圖片描述
bean.xml中使用序列化實現新增

	<insert id="addDevice">
		<selectKey keyProperty="vo.主鍵名" resultType="long"
			order="BEFORE">
			SELECT 序列名.nextval FROM DUAL
		</selectKey>
		insert into
		表名(id,列名)
		values(#{vo.deviceId},#{vo.列名對應值})
	</insert>

二:
第一步:建立序列sequence

create sequence SEQ_LOG_ID
minvalue 1  --增長最小值
maxvalue 9999999999  --增長最大值,也可以設定NOMAXvalue -- 不設定最大值
start with 101  --從101開始計數
increment by 1  --自增步長為1
cache 50  --設定快取cache個序列,如果系統down掉了或者其它情況將會導致序列不連續,也可以設定為---NOCACHE防止跳號
cycle;  --迴圈,當達到最大值時,不是從start with設定的值開始迴圈。而是從1開始迴圈

第二步:建立觸發器
(命名格式:觸發器(Trigger) tr_XXX )

create or replace trigger tr_test_id
  before insert on S_Depart   --defore在新增時觸發S_Depart 是表名
  for each row  --行級觸發器
declare
  nextid number;
begin
  IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
    select SEQ_ID.nextval --SEQ_ID正是剛才建立的
    into nextid
    from sys.dual;
    :new.DepartId:=nextid;
  end if;
end tr_test_id;

第三步:插入資料測試看主鍵是否自增

sql 查詢分頁

踩坑
1: *號 不能隨便用,如果不同表名之間含有相同列名,則資料庫無法查出資料。外層sql只是單純繼承內部時可用。
2:sql 有嚴格的空格 要求。
3:xml裡最後一個值 後面不能接逗號 會報錯
4:對傳入的變數要進行判空處理,避免出現異常
5:資料庫對列的值 有範圍要求時 要寫明在介面文件內
6:特殊字元要進行轉義處理
7:陣列物件要進行迭代
8:變數型別,和資料庫型別不同是要進行宣告處理

<foreach collection="devIdList" item="item" open=","
			separator=",">
			#{item}
		</foreach>

查詢分頁sql
在已經查詢出來的結果集合中按照特定範圍進行巢狀查詢 返回結果

<select id="getWorkOrdersPages" resultType="com.nw.hms.server.v2.vo.workOrder.WorkOrderVo">
		select t.work_order_id workOrderId,
		t.station_name stationName,
		t.station_id stationId,
		t.item_code itemCode,
		t.item_name itemName,
		t.dev_name deviceName,
		t.dev_id deviceId,
		t.dev_addr deviceAddr,
		t.maintenance_id maintenanceId,
		t.maintenance_name maintenanceName,
		t.maintenance_tel maintenanceTel,
		t.faultType_id faultTypeId,
		t.faultType_name faultTypeName,
		t.status status,
		t.created createTime,
		t.start_time startTime,
		t.finish_time finishTime,
		t.remarks remarks
		from
		(select rownum rowno, t9.*
		from (select t1.work_order_id,
		t2.station_name,
		t1.station_id,
		t1.item_code,
		t3.item_name,
		t4.dev_name,
		t4.dev_id,
		t4.dev_addr,
		t5.maintenance_id,
		t5.maintenance_name,
		t5.maintenance_tel,
		t6.faultType_id,
		t6.faultType_name,
		t1.status,
		t1.created,
		t1.start_time,
		t1.finish_time,
		t1.remarks
		from work_order t1
		inner join config_station t2
		on t2.id = t1.station_id
		inner join
		monitor_item t3
		on t3.item_code = t1.item_code
		inner join config_device
		t4
		on t4.dev_id = t1.dev_id
		inner join maintenance_info t5
		on
		t5.maintenance_id = t1.maintenance_id
		inner join fault_type t6
		on
		t6.faultType_id = t1.faultType_id
		where t1.user_id = #{vo.userId}
		and
		t1.faultType_id = #{vo.faultTypeId}
		<if test="vo.searchText != null and vo.searchText != ''">
			and (
			t2.station_name like
			'%'||#{vo.searchText,javaType=String,jdbcType=VARCHAR}||'%'
			or
			t3.item_name like '%'||
			#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
			or t4.dev_id
			like '%'|| #{vo.searchText,javaType=String,jdbcType=VARCHAR}
			||'%'
			or
			t4.dev_name like '%'||
			#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
			or t4.dev_addr
			like '%'||
			#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
			or
			t5.maintenance_name like '%'||
			#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
			or
			t6.faultType_name like '%'||
			#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
			or t1.status
			like '%'|| #{vo.searchText,javaType=String,jdbcType=VARCHAR}
			||'%'
			)
		</if>
		) t9) t
		where t.rowno <![CDATA[>]]>
		#{vo.start}
		and t.rowno <![CDATA[<=]]>
		#{vo.end}
	</select

批量處理資料

新增1

<insert id="addRoleObjRef">
    <if test="roleIds.size != 0">
    insert all
    <foreach collection="roleIds" item="item" separator=",">
    into sys_role_obj_ref(role_id,obj_id,obj_type)
    values(#{item},#{objId},#{objType})
    </foreach>
    select 1 from dual
    </if>
    </insert>

新增2

<insert id="addUserSelectAreas" parameterType="java.util.ArrayList"  useGeneratedKeys="false">
		insert into user_select_area(
		id,
		user_id,
		type_id,
		area_id
		) SELECT SEQ_USER_SELECT_AREA.nextval,a.user_id,a.type_id,a.area_id FROM (
		 <foreach collection="voList" item="vo" separator="union all">
           SELECT
		#{vo.userId,jdbcType=NUMERIC} user_id,
		#{vo.typeId,jdbcType=NUMERIC} type_id,
		#{vo.areaId,jdbcType=NUMERIC} area_id
		  FROM dual
        </foreach>
		) a
	</insert>

刪除

	<delete id="delUserSelectAreas">
    delete from user_select_area
    where  1=1
     
    <if test="idList != null and idList.size > 0 ">
			and id in
			 <foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
                 #{id}
           </foreach>
		</if>
    </delete>