Oracle生成流水号函数
一、参考
1:日期范围上 smalldatetime的有效时间范围1900/1/1~2079/6/6
datetime的有效时间范围1753/1/1~9999/12/31 2:精准度上 smalldatetime只精准到分,而datetime则可精准到3位的毫秒。 3:存储空间上 smalldatetime占用4个字节,前2个字节存储base date(1900年1月1日)之后的天数。后2个字节存储午夜后的分钟数。 datetime占用8个字节,前4个字节存储base date(即1900年1月1日)之前或之后的天数,后4个字节存储午夜后的毫秒数 Oracle生成流水号函数(5位流水号)
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,''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) < 5
LOOP
v_new_num := '' || v_new_num;
END LOOP; IF v_old_no IS NULL OR
substr(v_old_no, 5, 6) <> v_date_no
THEN
v_maked_no := v_type || v_date_no || '';
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; --调用
--SELECT fn_no_make(v_type=>'', v_number_col=>'SEQNO_SELF',v_table_name=>'I_YCSQJFYJS') AS SEQNO_SELF FROM DUAL;
1.数据库导入,导出命令 数据导出:
a. 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp test/test@ORACLE_192.168.28.1 file=d:\daochu.dmp full=y b. 将数据库中system用户与sys用户的表导出
exp test/test@ORACLE_192.168.28.1 file=d:\daochu.dmp owner=(system,sys)
数据导入: a 将D:\daochu.dmp 中的数据导入 TEST数据库中。
imp dev/dev@ORACLE_192.168.28.2 file=d:\daochu.dmp
imp dev/dev@ORACLE_192.168.28.2 full=y file=file= d:\data\newsmgnt.dmp ignore=y
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上 ignore=y 就可以了。
b 将d:\daochu.dmp中的表table1 导入
imp dev/dev@TEST file=d:\daochu.dmp tables=(table1) 2.数据库表中Clob,Blob 导入导出命令 exp 数据库用户名/密码@配置名称 file=输出文件路径 log=日志文件路径 tables=(数据库表名) query=\"查询条件\" imp 数据库用户名/密码@配置名称 file=输入文件路径 log=日志文件路径 tables=(数据库表名) ignore=y exp test/test@ORACLE_192.168.28.1 file=c:\11.dmp log=c:\11.log tables=(table1) query=\"where createdby='sysadmin' and to_char(createtime,'YYYY-MM-DD')='2012-05-17'\" imp dev/dev@ORACLE_192.168.28.2 file=c:\11.dmp log=c:\121.log tables=(table1) ignore=y 用cmd.exe 执行就可以,注意的地方就是query 地方 \" 先执行exp 后执行imp 二、需求完成(参考一) 流水号格式改为20170215 1234567(年月日+7位数字),依次递增,每月1号后7位重置为0000001
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_start_no VARCHAR2(20);--流水号重新计算(按月份)
v_type_len INT; --编码前缀 长度
v_sql VARCHAR2(4000);
BEGIN
--编码前缀 长度 int
v_sql := 'select decode(length('''||v_type||'''),NULL,0,length('''||v_type||''')) from DUAL';
EXECUTE IMMEDIATE v_sql
INTO v_type_len; --取最大流水号的值
IF v_type_len=0 THEN
v_sql := 'SELECT MAX(' || v_number_col || ') FROM ' || v_table_name ||' WHERE 1=1 AND LENGTH('||v_number_col||')=15';
EXECUTE IMMEDIATE v_sql
INTO v_old_no;
ELSE
v_sql := 'SELECT MAX(' || v_number_col || ') FROM ' || v_table_name || ' WHERE 1=1 AND SUBSTR(' || v_number_col || ',1,'||v_type_len||')='''||v_type||''' ';
EXECUTE IMMEDIATE v_sql
INTO v_old_no;
END IF; --当前日期编号
v_sql := 'SELECT SUBSTR(TO_CHAR(SYSDATE,''YYYYMMDD''), 1, 8) AS DATE_NO FROM DUAL';
EXECUTE IMMEDIATE v_sql
INTO v_date_no; --当前年月编号
v_sql := 'SELECT SUBSTR(TO_CHAR(SYSDATE,''YYYYMMDD''), 1, 6) AS START_NO FROM DUAL';
EXECUTE IMMEDIATE v_sql
INTO v_start_no; v_old_num := to_number(substr(v_old_no,v_type_len+9, 7)); v_new_num := to_char(v_old_num + 1); WHILE length(v_new_num) < 7
LOOP
v_new_num := '' || v_new_num;
END LOOP; IF v_old_no IS NULL OR
substr(v_old_no, v_type_len+1, 6) <> v_start_no
THEN
v_maked_no := v_type || v_date_no || '';
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; --调用
--BEGIN
--dbms_output.put_line(fn_no_make(v_type=>'A', v_number_col=>'SEQNO_SELF',v_table_name=>'I_YCSQJFYJS'));
--END; --SELECT fn_no_make(v_type=>'', v_number_col=>'SEQNO_SELF',v_table_name=>'I_YCSQJFYJS') AS SEQNO_SELF FROM DUAL;
参考:Oracle生成流水号函数
Oracle生成流水号函数的更多相关文章
- Oracle生成千万测试数据
oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- oracle生成.net的guid方法;
最近在做一个T1的.NET项目,数据库oracle的时候,遇到一个问题..NET里面的某个数据库表类的某个字段是guid类型.但是用oracle生成的guid.跟.NET的guid 无法识别.导致报错 ...
- Oracle 生成随机密码
需求:需要定期更改密码.要求是1.密码位数11位.2.必须包含大小写字母.数字.特殊字符.3.排除一些特殊字符如().@.& oracle数据库中有可已生成随机密码包dbms_random,但 ...
- Oracle中REGEXP_SUBSTR函数(转)
Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','2 ...
- Oracle创建WM_CONCAT函数
Oracle创建WM_CONCAT函数 WM_CONCAT这个函数会出错,所以从 11g开始.官方不认可 WM_CONCAT.然后就没这个函数了, 下面就是创建WM_CONCAT这个函数的步骤 第一步 ...
- Oracle中REGEXP_SUBSTR函数(字符串转多行)
Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...
- Oracle中REGEXP_SUBSTR函数
Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
随机推荐
- Cordova+jQuery Mobile+Spring REST
Cordova可以方便地建立跨平台的移动应用,使用jQuery Mobile做手机界面,后台使用rest提供数据交互. 首先,使用jQuery Mobile建立一个页面: <!DOCTYPE h ...
- windows下安装phpredis模块 (转)
1.下载: http://pecl.php.net/package/redis/2.2.7/windows 2.下载后 由于里面有两个模块分别是vc6,vc9编译的,我们需要知道我们的Php是vc6还 ...
- php自动获取字符串编码函数mb_detect_encoding(转)
使用 mb_detect_encoding() 函数来判断字符串是什么编码的. 当在php中使用mb_detect_encoding函数进行编码识别时,很多人都碰到过识别编码有误的问题,例如对与GB2 ...
- k8s之Service
一.概述 在k8s中暴露Service访问(无论内部还是外部),都要经过kube-proxy: 如下图:
- win7系统总是安装不了net2.0的解决方法
一些网友询问说ghost win7系统总是安装不了net2.0怎么办呢?net2.0是什么?ATI显卡的控制中心 就需要在NET2.0的基础上.可是一些用户说win7系统总是安装不了net2.0如何解 ...
- error nr.1045 access denied for user 'root'@'localhost' (using passwd:no)
在windows上卸载了mysql,再次重新安装的时候运行失败,并报以下错误: 解决办法: 1.服务里面停止Mysql服务. 2.卸载Mysql,删除MySQL的安装目录. 3.此外还要删除以下目录的 ...
- 一个“蝇量级” C 语言协程库
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...
- Android Developers:保存文件
Android使用一个和其它平台基于硬盘文件系统相似的文件系统.这个课程描述了如何和在Android文件系统使用File APIs读和写文件. 一个File对象适用于读或者写从头到尾没用中断的大型数据 ...
- django -- 用包来组织数据库模型
默认情况下一个django app的所有模型都保存在一个叫models.py的文件中.这样事实是不方便管理的: 通过包来组织模型是比较方便的. 一.第一步:删除models.py: rm -rf mo ...
- windows如何查看某个端口被谁占用
我们在启动应用的时候经常发现我们需要使用的端口被别的程序占用,但是我们又不知道是被谁占用,这时候我们需要找出“真凶”,如何做到呢? cmd命令中 输入命令:netstat -ano,列出所有端口的情况 ...