1

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

在此处输入图像描述

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

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

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

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

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

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

请帮忙。

编辑1:

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

编辑2:

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

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;

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

4

3 回答 3

3

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

  1. 为每个产品创建一个 Oracle 序列,也许使用某种可以检测新产品并动态创建序列的维护程序。

  2. 滚动您自己的序列码。将最后一个值存储在 Product 表中。编写一个为给定产品生成新值的过程。该过程将首先在产品表上获得一个行锁(这样您就不会让两个会话同时获得相同的值),推进该值,并将新值写入产品表。您需要将此过程作为一个自治事务(否则,如果会话没有立即提交或回滚,其他会话将只是等待)。

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

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

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

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

编辑

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

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

使用字符串连接函数附加产品前缀 - 例如||

于 2012-05-18T06:40:32.690 回答
1

似乎是您在这里对数据模型进行了非规范化。

里程表与产品表是 1:1 的,里程表值还取决于当前分配给该产品的员工数量。

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

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

于 2012-05-18T08:00:36.333 回答
0

也许我在这里遗漏了一些东西,如果是这样,请接受我的道歉。

在我看来,里程表只是一个计数器,用于计算有多少员工可以访问每种产品。

如果是这种情况,为什么不完全摆脱表(和 EMP_CODE 列)并在一个或多个视图中“构建”该信息?

亚历山德罗

PS:看起来我发布了与大卫奥尔德里奇相同的建议。对困惑感到抱歉。

于 2012-05-18T08:03:01.403 回答