我有一个存储过程,它从列中选择最大值。我正在检索最大值,经过一些计算后,将最大值增加为1.这样可以正常工作,直到多个会话在同一时刻访问相同的过程。在这种情况下,所有会话都返回相同的值。
当一个会话正在使用时,我需要一种方法来阻止其他会话检索SP中列的最大值。
请让我知道一种方法吗?
我无法使用序列,因为我需要从预定义的值开始直到固定值。此范围再次有条件地计算。
最大查询如下:
SELECT NVL(MAX(EMP_NBR),0)
INTO V_MAX_EMP_NO
FROM EMP
where emp_name like '%John%'
答案 0 :(得分:2)
如果您可以处理值中的差距,则应使用sequence。
修改强>
我担心你必须用现有的星座锁定整个桌子。
这样的事情:
DECLARE
v_emp_nbr emp.emp_nbr%TYPE;
BEGIN
LOCK TABLE emp IN SHARE MODE;
SELECT NVL(MAX(emp_existing.emp_nbr),0) + 1
INTO v_emp_nbr
FROM emp emp_existing
WHERE emp_existing.emp_name LIKE '%John%';
INSERT INTO emp( emp_nbr, emp_name ) VALUES ( v_emp_nbr, 'John Doe' );
END;
/
如果您真的需要像这样计算emp_nr
,请再想一想。您在每次插入新记录时都会锁定整个表,并且由于在搜索词的开头有通配符(emp_name
),因此无法在%
上使用索引。对于您拥有的每个新条目,您的查询都会变慢。
如果我们知道你为什么需要这个,我们或许可以建议一个更好的解决方案。