【问题标题】:Concate string with Max Value for auto ID in Oracle在 Oracle 中使用自动 ID 的最大值连接字符串
【发布时间】:2016-01-23 12:22:30
【问题描述】:
我想在不使用序列的情况下在 Oracle Form 6i 中生成自动 ID 连接字符串:
EXAMPLE
EMP1
EMP2
EMP3
EMP4
这个触发器有什么错误:
SELECT concat('EMP',TO_CHAR(NVL(MAX(EMP_ID),0) + 1))
INTO :EMP_Block.EMP_ID FROM EMPLOYEES WHERE EMP_ID LIKE 'EMP%';
【问题讨论】:
标签:
oracle
plsql
oracle10g
oracle-sqldeveloper
oracleforms
【解决方案1】:
为什么不想使用序列?您需要考虑您的方法将如何处理来自另一个会话的未提交数据。假设您选择了“5”的“最大值”,但在您提交之前,其他一些会话也选择了最大值——他们也会得到“5”并尝试使用它。现在您有两个单独的会话,最大值为 5,并且不知道另一个会话。而且,如果您尝试进行某种排队(例如 SELECT FOR UPDATE 或放置显式锁定),则会降低性能,因为所有需要此操作的会话都必须彼此排成一行。
【解决方案2】:
问题是EMP_ID 是varchar。如果不从EMP4 中过滤EMP,则无法向其添加数字。您需要在concat 中使用类似下面的内容。我无法对其进行测试,但如果您仍然发现任何问题,请告诉我。
concat('EMP',to_char(replace(max(emp_id),'EMP','')+1))