Rock.et 发表于 2012-10-24 23:21:26

Oracle生成流水号函数(DJJT12090600003)

Oracle生成流水号函数(DJJT12090600003)

Oracle生成流水号函数(DJJT12090600003):
例如当前最新的流水号为:DJJT12090600003,下一流水号:如果是当天生成的为:DJJT12090600004,如果是隔天生成的为:DJJT12090700001

CREATE OR REPLACE FUNCTION fn_no_make(v_type       VARCHAR2,                                    v_number_col VARCHAR2,                                    v_table_name VARCHAR2)/** 编码示例:DJJT12090600003* author: Rock.et* create date: 2012/09/06* 参数说明:* v_type: 编码前缀* v_number_col:编码所在列名* v_table_name:编码所在表名*/ RETURN VARCHAR2 ISv_old_no   VARCHAR2(50); --原编码v_old_numNUMBER; -- 原编码后五位编号v_new_numVARCHAR2(10); --新编码后五位编号v_maked_no VARCHAR2(50); --新编码v_date_noVARCHAR2(20); --当前日期编号v_sql      VARCHAR2(4000);BEGINv_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,''YYMMDD''), 1, 6) AS DATE_NO FROM DUAL';EXECUTE IMMEDIATE v_sql    INTO v_date_no;v_old_num := to_number(substr(v_old_no, 11, 5));v_new_num := to_char(v_old_num + 1);WHILE length(v_new_num) < 5LOOP    v_new_num := '0' || v_new_num;END LOOP;IF v_old_no IS NULL OR   substr(v_old_no, 5, 6) <> v_date_noTHEN    v_maked_no := v_type || v_date_no || '00001';ELSE    v_maked_no := v_type || v_date_no || v_new_num;END IF;RETURN(v_maked_no);EXCEPTIONWHEN OTHERS THEN    dbms_output.put_line(SQLERRM);END fn_no_make;
页: [1]
查看完整版本: Oracle生成流水号函数(DJJT12090600003)