Oracle自定义编码规则的实现

在编写程序的过程中,我们经常会用到对一些记录进行编码的实现,有时候定义的编码规则并不能很好的实现需求,比如使用lpad(rpad)函数进行补充的时候,有个长度的限制,这时候就影响了编码的正常使用。

在下面提供了一个公用的扩展性比较好的编码规则

1、创建编码的客户化表

-- Create table

create table CUX.CUX_DOC_SEQUENCES

(

doc_type VARCHAR2 (30 ),

pk1_value VARCHAR2 (50 ),

pk2_value VARCHAR2 (50 ),

pk3_value VARCHAR2 (50 ),

pk4_value VARCHAR2 (50 ),

pk5_value VARCHAR2 (50 ),

next_seq_number NUMBER ,

created_by NUMBER ,

creation_date DATE ,

last_updated_by NUMBER ,

last_update_date DATE ,

last_update_login NUMBER

)

tablespace APPS_TS_TX_DATA

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 128 K

next 128 K

minextents 1

maxextents unlimited

pctincrease 0

);

-- Create/Recreate indexes

create unique index CUX.CUX_DOC_SEQUENCES_U1 on CUX.CUX_DOC_SEQUENCES (DOC_TYPE, PK1_VALUE, PK2_VALUE, PK3_VALUE, PK4_VALUE, PK5_VALUE)

tablespace APPS_TS_TX_IDX

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 128 K

next 128 K

minextents 1

maxextents unlimited

pctincrease 0

);

2、定义生成编码的function

FUNCTION next_seq_number(p_doc_type IN VARCHAR2 ,

p_pk1_value IN VARCHAR2 DEFAULT NULL ,

p_pk2_value IN VARCHAR2 DEFAULT NULL ,

p_pk3_value IN VARCHAR2 DEFAULT NULL ,

p_pk4_value IN VARCHAR2 DEFAULT NULL ,

p_pk5_value IN VARCHAR2 DEFAULT NULL ,

p_init_number IN NUMBER DEFAULT 1 ) RETURN NUMBER IS

PRAGMA AUTONOMOUS_TRANSACTION ;

CURSOR c_seq IS

SELECT ds.rowid row_id, ds.next_seq_number

FROM cux_doc_sequences ds

WHERE ds.doc_type = p_doc_type

AND ds.pk1_value = nvl(p_pk1_value, '-1' )

AND ds.pk2_value = nvl(p_pk2_value, '-1' )

AND ds.pk3_value = nvl(p_pk3_value, '-1' )

AND ds.pk4_value = nvl(p_pk4_value, '-1' )

AND ds.pk5_value = nvl(p_pk5_value, '-1' )

FOR UPDATE NOWAIT;

l_row_id VARCHAR2 (18 );

l_next_seq_number NUMBER ;

BEGIN

OPEN c_seq;

FETCH c_seq

INTO l_row_id, l_next_seq_number;

IF c_seq%NOTFOUND THEN

l_next_seq_number := nvl(p_init_number, 1 );

INSERT INTO cux_doc_sequences

(doc_type,

pk1_value,

pk2_value,

pk3_value,

pk4_value,

pk5_value,

next_seq_number,

creation_date,

created_by,

last_update_date,

last_updated_by,

last_update_login)

VALUES

(p_doc_type,

nvl(p_pk1_value, '-1' ),

nvl(p_pk2_value, '-1' ),

nvl(p_pk3_value, '-1' ),

nvl(p_pk4_value, '-1' ),

nvl(p_pk5_value, '-1' ),

l_next_seq_number,

SYSDATE ,

fnd_global.user_id,

SYSDATE ,

fnd_global.user_id,

fnd_global.login_id);

ELSE

l_next_seq_number := l_next_seq_number + 1 ;

UPDATE cux_doc_sequences

SET next_seq_number = l_next_seq_number,

last_update_date = SYSDATE ,

last_updated_by = fnd_global.user_id,

last_update_login = fnd_global.login_id

WHERE ROWID = l_row_id;

END IF ;

CLOSE c_seq;

COMMIT ;

RETURN l_next_seq_number;

END next_seq_number;

FUNCTION next_seq_number(p_doc_type IN VARCHAR2 ,

p_doc_prefix IN VARCHAR2 ,

p_seq_length IN NUMBER DEFAULT 0 ,

p_pk1_value IN VARCHAR2 DEFAULT NULL ,

p_pk2_value IN VARCHAR2 DEFAULT NULL ,

p_pk3_value IN VARCHAR2 DEFAULT NULL ,

p_pk4_value IN VARCHAR2 DEFAULT NULL ,

p_pk5_value IN VARCHAR2 DEFAULT NULL ,

p_init_number IN NUMBER DEFAULT 1 ) RETURN VARCHAR2 IS

l_next_seq_number NUMBER ;

l_doc_number VARCHAR2 (150 );

BEGIN

l_next_seq_number := next_seq_number(p_doc_type => p_doc_type,

p_pk1_value => p_pk1_value,

p_pk2_value => p_pk2_value,

p_pk3_value => p_pk3_value,

p_pk4_value => p_pk4_value,

p_pk5_value => p_pk5_value,

p_init_number => p_init_number);

IF p_seq_length IS NULL OR p_seq_length = 0 THEN

l_doc_number := p_doc_prefix || l_next_seq_number;

ELSE

IF length(l_next_seq_number) >= p_seq_length THEN

l_doc_number := p_doc_prefix || l_next_seq_number;

ELSE

l_doc_number := p_doc_prefix ||

lpad(l_next_seq_number, p_seq_length, '0' );

END IF ;

END IF ;

RETURN l_doc_number;

END next_seq_number;

3、调用function生成编码

例子:

FUNCTION get_receipt_number(p_org_id IN NUMBER, p_receipt_date DATE )

RETURN VARCHAR2 IS

l_receipt_number VARCHAR2 (30 );

BEGIN

l_receipt_number := cux_doc_sequence_utl.next_seq_number(p_doc_type => 'POS_AR_RECEIPT_NUMBER' ,

p_doc_prefix => 'POS_' ||

to_char(p_receipt_date,

'YYYYMM' ),

p_seq_length => 5 ,

p_pk1_value => p_org_id,

p_pk2_value => to_char(p_receipt_date,

'YYYYMM' ));

RETURN l_receipt_number;

EXCEPTION

WHEN no_data_found THEN

RETURN NULL ;

cux_conc_utl.log_msg( 'FUNCTION get_receipt_number ERROR:' ||

'NO_DATA_FOUND' );

--RAISE fnd_api.g_exc_error;

WHEN too_many_rows THEN

RETURN NULL ;

cux_conc_utl.log_msg( 'FUNCTION get_receipt_number ERROR:' ||

'TOO_MANY_ROWS' );

--RAISE fnd_api.g_exc_error;

WHEN OTHERS THEN

RETURN NULL ;

cux_conc_utl.log_msg( 'FUNCTION get_receipt_number ERROR:' || SQLERRM );

--RAISE fnd_api.g_exc_error;

END get_receipt_number;

oracle更改编码规则,Oracle自定义编码规则相关推荐

  1. oracle更改密码机制,Oracle密码机制以及常用操作

    Oracle 默认有3个用户: sys 密码:自定:system 密码:自定 :scott 密码:Tiger(默认锁定):注:用Sys用户登录须根 [as sysdba Oracle 默认有3个用户: ...

  2. oracle 更改启动内存,Oracle 11gR2修改内存参数后无法启动问题

    Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\windows\system32>n ...

  3. oracle更改分区表结构,Oracle分区修改的语句

    Oracle分区修改的语句 1.增加一个分区 ALTER TABLE sales ADD PARTITION jan96 VALUES LESS THAN ( '01-FEB-1999' ) TABL ...

  4. ORACLE HANDBOOK系列之十:字符集、编码以及Oracle的那些事

    第一部分字符集与编码常识 字符集: 人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集. 编码: 当前面收集的工作完成以后,为了让只认识数字的"愚蠢"的计算机也能够 ...

  5. oracle ebs应用产品安全性-交叉验证规则

    定义: Oracle键弹性域可以根据自定义键弹性域时所定义的规则,执行段值组合的自动交叉验证.使用交叉验证来严密控制新的键弹性域组合的创建过程:Oracle应用产品提供了多个键弹性域的交叉验证机制,如 ...

  6. FatFs 之二 路径规则、字符编码、编码页、卷管理详解

    写在前面 本文的内容部分来自于 FatFs 的官方文档,但是添加了一些额外的章节及内容.其并不是原版 FatFs 的官方文档的翻译.如果关注与 FatFs 的官方文档,请从本文的 参考 章节前去查看即 ...

  7. oracle数据库字符6,oracle 数据库字符编码

    理解ORACLE 字符集[转] 一.引言 ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处 ...

  8. oracle查看编码格式以及修改字符集编码

    oracle查看编码格式以及修改字符集编码 查看oracle数据库的编码集     客户端字符集环境select   *   from   nls_instance_parameter,其来源于v$p ...

  9. PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的。 检查Oracle服务器端字符编码,用 sel

    PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的. 检查Oracle服务器端字符编码,用 select ...

最新文章

  1. 过采样为什么能提高信噪比
  2. GitHub Copilot 支持 IntelliJ IDEA啦,插件装起来!
  3. python整理excel数据-利用python整理需要的excel报表(上)
  4. Linux 下搭建 Scala 开发环境
  5. VTK:可视化之ProjectSphere
  6. Supporting Multiple Screens 翻译 支持各种屏幕(上)
  7. sync.Once 的前世今生
  8. 误删50节点K8s集群为何3小时才能复原?Spotify揭自家事故幕后经验
  9. S9300 STP 配置规范
  10. 一段获取视频的简易方法
  11. centos 6.8 配置csh的shell和环境变量
  12. 基于Node.js实现一个小小的爬虫
  13. ​​​​尚硅谷—尚医通—前台用户系统—预约挂号—预约下单功能实现(155-160)
  14. MYSQL数据库导出和备份----mysqldump
  15. 仓库温度湿度控制措施_仓库温度湿度控制管理制度
  16. 计算机中的PS颜色填充快捷键,ps颜色填充快捷键【设置办法】
  17. C++:66---特殊工具与技术之(不可移植的特性:位域、volatile、extern “C“链接提示)
  18. 【压缩感知合集3】压缩感知的背景与意义
  19. java项目-第61期基于ssm项目在线心理测评系统
  20. 关于xml加载提示: Error on line 1 of document : 前言中不允许有内容

热门文章

  1. 单片机第一个程序----点亮LED灯
  2. 【C语言】语言篇——程序设计入门
  3. ubuntu18.04上安装anaconda-python深度学习环境
  4. 数据科学指南#基础篇 Matplotlib 入门
  5. Python 用pandas处理csv,dataframe,groupby等
  6. 小红书app滑块解决思路
  7. C#如何添加PDF水印
  8. mysql入学时间_2016年小学生开学时间-2016全国小学开学时间一览表最新权威版-东坡下载...
  9. pytorch——计算两个等大无序点云中的距离Earth Mover Distance
  10. python依托Excel批量实现调查问卷数据的图表可视化