• 使用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;
    END LOOP;
    /*
    * 如果日期相同或者当前表为空
    * 执行流水号为第一个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;
    END IF;
    -- 最后返回新的流水号
    RETURN(v_maked_no);
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
    END fn_no_make;



    INSERT INTO TEST_AA VALUES(sys_guid(),fn_no_make(901,'XSCM_ADDR2','TEST_AA'));

    select fn_no_make(901,'XSCM_ADDR2','TEST_AA') from dual

    select sys_guid() from dual
    select * from xscm_mstr


    -- Create table
    create table TEST_AA
    (
    XSCM_ADDR VARCHAR2(80) default ' ' not null,
    XSCM_ADDR2 VARCHAR2(80) default ' ' not null
    )
    tablespace USERS
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
    initial 128K
    next 1M
    minextents 1
    maxextents unlimited
    );
    select * from TEST_AA

  • 相关阅读:
    Nginx浅谈
    MySQL 规范
    使用nginx反向代理实现隐藏端口号
    -bash: /etc/profile: line 11: syntax error near unexpected token `$'{ ''报错问题解决
    为什么禁止在 foreach 循环里进行元素的 remove/add 操作
    Java中String字符串常量池
    前端学习路径
    Linux关闭防火墙命令
    CXF实现webService服务
    Jquery Ajax 的例子。
  • 原文地址:https://www.cnblogs.com/yangpeng-jingjing/p/6845663.html
Copyright © 2020-2023  润新知