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

每个员工都有一个唯一的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;但是,如何确保它在事务中运行,以及如何将产品前缀附加到生成的数字中。
发布于 2012-05-18 06:40:32
你有两个我能想到的选择:
dynamically.
#1的一个优点是它是最快的。
#1的一个缺点是,您必须运行动态DDL,并且您必须确保产品的DDL已经运行,然后才能尝试为其插入里程计记录。如果某个产品被删除,您可能还需要考虑是否删除一个序列。
#1的另一个缺点是,您只能使用动态SQL获取序列值(您必须在运行时确定序列的名称)。
#2的一个缺点是,对于允许并发DML的系统来说,很容易出错。您需要确保逻辑正确,并在高并发负载下测试它。而且,#2的性能会比#1差,因为它序列化了每个产品的访问。
编辑
“
”,但如何确保它在事务中运行,以及如何将产品前缀附加到生成的数字中。
事务在Oracle中是自动的。但是,在这种情况下,您需要的是一个 transaction。
附加产品前缀是使用字符串连接函数(例如|| )完成的
发布于 2012-05-18 08:00:36
看上去你是在去篡改数据模型。
计量器表与产品表是1:1,里程表值也取决于当前分配给该产品的雇员人数。
emp_code序列号可以从员工id和产品表中导出。显然,标识符前缀也可以从产品id中推断出来,因此实际上您的模式中有冗余列和冗余表。
你确定你真的需要它们吗?
发布于 2012-05-18 08:03:01
也许我在这里遗漏了什么,如果是的话,请接受我的道歉。
在我看来,里程计仅仅是每种产品有多少员工可以进入的计数器。
如果是这样的话,为什么不完全去掉表(和EMP_CODE列),在一个或多个视图中“构建”该信息呢?
阿莱桑德罗
PS:看来我发布了大卫·奥尔德里奇的同样建议。很抱歉给你造成了混乱。
https://stackoverflow.com/questions/10646744
复制相似问题