当多个会话访问同一数据库时,从列中选择最大值

时间:2014-03-27 15:05:39

标签: sql oracle

我有一个存储过程,它从列中选择最大值。我正在检索最大值,经过一些计算后,将最大值增加为1.这样可以正常工作,直到多个会话在同一时刻访问相同的过程。在这种情况下,所有会话都返回相同的值。

当一个会话正在使用时,我需要一种方法来阻止其他会话检索SP中列的最大值。

请让我知道一种方法吗?

我无法使用序列,因为我需要从预定义的值开始直到固定值。此范围再次有条件地计算。

最大查询如下:

SELECT NVL(MAX(EMP_NBR),0)
INTO V_MAX_EMP_NO
FROM EMP
where emp_name like '%John%'

1 个答案:

答案 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),因此无法在%上使用索引。对于您拥有的每个新条目,您的查询都会变慢。

如果我们知道你为什么需要这个,我们或许可以建议一个更好的解决方案。