暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 包和功能

askTom 2017-05-09
145

问题描述

我有一个包装规格和主体,如下所示,用于在APEX应用程序中生成一个以某些值和年份为前缀的自动递增数字,如下所示

CREATE OR REPLACE PACKAGE GISWTR.PKG_WI_BUSINESS_RULES IS

C_PROJECT_PREFIX_PD CONSTANT VARCHAR2(4) := 'WP' ;
C_SHORT_DATE_FORMAT CONSTANT VARCHAR2(10) := 'YYYY/MM/DD';

FUNCTION GetMaxProjectNumber
(v_ProjectType VARCHAR2 := C_PROJECT_PREFIX_PD,
v_year VARCHAR2 DEFAULT to_char(SYSDATE, 'RR'))
RETURN VARCHAR2;

CREATE OR REPLACE PACKAGE BODY GISWTR.PKG_WI_BUSINESS_RULES IS

/**************************************************************************************************
-------------------------------------
-- START of Functions and Procedures
-------------------------------------

/**************************************************************************************************
 GetMaxProjectNumber
 Finds the maximum project number and add 1 then, prefix it with the
project Type, 2-digit year. Example: WP-13001 (001 is the project number sequence).

Concurrent users can potentially come up with the same sequence but this is
Technical Design

------------------ --------- -----------------------------------------

*************************************************************************************************/
C_COL_SEP CONSTANT CHAR(1) := '~';
C_ROW_START CONSTANT CHAR(1) := '{';
C_ROW_END CONSTANT CHAR(1) := '}';
C_ROW_SEP CONSTANT CHAR(2) := '}{';

FUNCTION GetMaxProjectNumber
(v_ProjectType VARCHAR2 := C_PROJECT_PREFIX_PD,
v_year VARCHAR2 DEFAULT to_char(SYSDATE, 'RR'))
RETURN VARCHAR2 IS

CURSOR c_get_max_project IS
select max(to_number(substr(pj_seq, 1, 3)))
from (select --get the project 3-digit sequence, remove the non-numeric characters
regexp_replace(substr(project_number, 6, 5), '[^0-9]') pj_seq
from projects
where substr(project_number, 1, 3) = v_projecttype||'-'
and to_char(substr(project_number, 4, 2)) = v_year
);

v_projectnumber projects.project_number%TYPE;
v_project_sequence INTEGER;


BEGIN

OPEN c_get_max_project;
FETCH c_get_max_project INTO v_project_sequence;
CLOSE c_get_max_project;

v_project_sequence := NVL(v_project_sequence, 0) + 1;


v_projectnumber := v_ProjectType || '-' || v_year || LPAD(v_project_sequence, 3, '0');

RETURN v_projectnumber;

END GetMaxProjectNumber;
复制


但是问题是此功能仅适用于 “wp”,而不适用于 “infl' 或其他任何其他值。

我为选择列表 (项目类型字段) 创建了一个动态操作,在选择时更改APEX应用程序中的文本值字段 (项目编号),但这似乎只适用于 'WP',而不是其他项目类型。我正在使用sql语句在动态操作中设置值,例如从DUAL中选择pkg_wi_business_rules.GetMaxProjectNumber('INFL');
从DUAL中选择PKG_WI_BUSINESS_RULES.GETMAXPROJECTNUMBER('WP');

即使在数据库中,该值也仅为 “wp” 值递增。请帮忙

专家解答

在你走得更远之前... 这种方法行不通。

当 * 两个人做的时候:

从我的表中选择最大 (值) 1

然后它们将 * 两者 * 得到相同的结果,因此获取唯一标识符的概念将失败。

唯一的解决方法是锁定整个表... 最终使您的应用程序成为一次单一用户应用程序。

使用序列,问题就消失了。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论