首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成序列号的Oracle存储过程?

生成序列号的Oracle存储过程?
EN

Stack Overflow用户
提问于 2012-05-18 04:32:43
回答 3查看 3.4K关注 0票数 1

我有一个员工、产品和产品表,如下所示

每个员工都有一个唯一的emp_code,这取决于他可以访问的产品。

每个产品的标识符都有一个唯一的前缀。

我需要为每个产品生成一个唯一的字母数字标识符,并将其分配给员工。

此产品标识符将为9个字符,包括前缀。

里程表将存储分配给该特定产品中的员工的最后一次emp_code。

如何编写存储过程,以便根据系统中添加的每个新员工的产品生成这些字母数字emp_codes?

请帮帮忙。

编辑1:

只是在表中的一个小修正,我们可能不需要存储作为A00000001的里程表。相反,我们只能存储00000001,然后追加前缀。

编辑2:

到目前为止,这就是我所做的。

代码语言:javascript
复制
create or replace PROCEDURE SP_GEN_NEXT_DUMMY_DB_PRISM_ID
(
  in_product_id number,
  db_prism_id out varchar2
)
AS
BEGIN

  UPDATE BI_DB_PRISM_ID_ODOMETER
  SET DB_PRISM_ID =  DB_PRISM_ID + 1
  WHERE 
    PRODUCT_ID = in_product_id; 

  SELECT to_char(db_prism_id, 'FM00000000') into db_prism_id FROM     BI_DB_PRISM_ID_ODOMETER WHERE PRODUCT_ID = in_product_id; 

END;

但是,如何确保它在事务中运行,以及如何将产品前缀附加到生成的数字中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-18 06:40:32

你有两个我能想到的选择:

dynamically.

  • Roll

  • 为每个产品创建一个Oracle序列,可能使用某种维护过程来检测新产品并创建序列--您自己的序列代码。在Product中存储最后一个值。编写一个为给定产品生成新值的过程。该过程将首先获得产品表上的行锁(这样您就不会得到两个会话同时得到相同的值),提前值,并将新的值写入product。您将需要这个过程成为一个独立的事务(否则,如果会话不立即提交或回滚,其他会话就会等待)。

#1的一个优点是它是最快的。

#1的一个缺点是,您必须运行动态DDL,并且您必须确保产品的DDL已经运行,然后才能尝试为其插入里程计记录。如果某个产品被删除,您可能还需要考虑是否删除一个序列。

#1的另一个缺点是,您只能使用动态SQL获取序列值(您必须在运行时确定序列的名称)。

#2的一个缺点是,对于允许并发DML的系统来说,很容易出错。您需要确保逻辑正确,并在高并发负载下测试它。而且,#2的性能会比#1差,因为它序列化了每个产品的访问。

编辑

”,但如何确保它在事务中运行,以及如何将产品前缀附加到生成的数字中。

事务在Oracle中是自动的。但是,在这种情况下,您需要的是一个 transaction

附加产品前缀是使用字符串连接函数(例如|| )完成的

票数 3
EN

Stack Overflow用户

发布于 2012-05-18 08:00:36

看上去你是在去篡改数据模型。

计量器表与产品表是1:1,里程表值也取决于当前分配给该产品的雇员人数。

emp_code序列号可以从员工id和产品表中导出。显然,标识符前缀也可以从产品id中推断出来,因此实际上您的模式中有冗余列和冗余表。

你确定你真的需要它们吗?

票数 1
EN

Stack Overflow用户

发布于 2012-05-18 08:03:01

也许我在这里遗漏了什么,如果是的话,请接受我的道歉。

在我看来,里程计仅仅是每种产品有多少员工可以进入的计数器。

如果是这样的话,为什么不完全去掉表(和EMP_CODE列),在一个或多个视图中“构建”该信息呢?

阿莱桑德罗

PS:看来我发布了大卫·奥尔德里奇的同样建议。很抱歉给你造成了混乱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10646744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档