使用oracle函式在建立表的時候自動加入生成的流水號直接上**加注釋生成格式是:字首+年月日+00000
create or replace function fn_no_make(v_type varchar2,
v_number_col varchar2,
v_table_name varchar2)
/* * 引數說明:
* v_type: 編碼字首
* v_number_col:編碼所在列名
* v_table_name:編碼所在表名
*/return varchar2 is
v_old_no varchar2(50); --原編碼
v_old_num number; -- 原編碼後五位編號
v_new_num varchar2(10); --新編碼後五位編號
v_maked_no varchar2(50); --新編碼
v_date_no varchar2(20); --當前日期編號
v_sql varchar2(4000);
begin
-- 找出其中最大的
v_sql := 'select max(' || v_number_col || ') from ' || v_table_name;
execute immediate v_sql
into v_old_no;
-- 將當前日期取出
v_sql := 'select substr(to_char(sysdate,''yyyymmdd''), 1, 8) as date_no from dual';
execute immediate v_sql
into v_date_no;
-- 擷取日期和新的日期
v_old_num := to_number(substr(v_old_no, 13, 5));
-- 增加流水號數量
v_new_num := to_char(v_old_num + 1);
-- 填充流水號為五位數
while length(v_new_num) < 5
loop
v_new_num := '0' || v_new_num;
endloop;
/** 如果日期相同或者當前表為空
* 執行流水號為第乙個00001
* 否則將上面計算好的流水號加入到新的流水號裡面
*/if v_old_no is
null
or substr(v_old_no, 4, 8) <> v_date_no
then
v_maked_no := v_type || v_date_no || '00001';
else
v_maked_no := v_type || v_date_no || v_new_num;
endif; -- 最後返回新的流水號
return(v_maked_no);
exception
when
others
then
dbms_output.put_line(sqlerrm);
end fn_no_make;
應用測試
-- 插入表主鍵和流水號
insert
into test_a values(sys_guid(),fn_no_make(901,'serial_number','test_a'));
Oracle 生成流水號函式
code sql code create or replace function fn no make v type varchar2,v number col varchar2,v table name varchar2 編碼示例 djjt12090600003 author rock.et cr...
Oracle生成流水號函式
1 日期範圍上 smalldatetime的有效時間範圍1900 1 1 2079 6 6datetime的有效時間範圍1753 1 1 9999 12 312 精準度上 smalldatetime只精準到分,而datetime則可精準到3位的毫秒。3 儲存空間上 smalldatetime占用4個...
Oracle 生成流水號
輔助表 rul sequence 表中資料如圖 輔助儲存過程 proc getseqence create or replace procedure proc getseqence seqcode in varchar2,returnnum out varchar2,messagecode out ...