PL/SQL过程成功完成,但是当我想显示Max(dectment_id)时,任何人都可以建议



max(depentment_id(,任何人都可以建议

<set serveroutput on;
DECLARE
 v_max_deptno DEPARTMENTS.DEPARTMENT_ID%TYPE; 
 BEGIN
 SELECT Max(department_id)
 INTO v_max_deptno
 FROM   departments
 Where department_id = v_max_deptno;
 DBMS_OUTPUT.PUT_LINE('The maximum department_id is: '|| v_max_deptno);
 END;/>

此声明:

v_max_deptno DEPARTMENTS.DEPARTMENT_ID%TYPE;

用于局部变量。由于您不提供默认值,并且永远不会分配任何值,因此默认为NULL

SQL查询中的此谓词:

Where department_id = v_max_deptno

表示查询应仅返回depption_ID等于该变量的值的行。由于变量为 NULL,并且由于没有值能等于 NULL,因此查询返回没有行。

由于您的查询基于简单的聚合(MAX(,因此查询返回而不会出错。由于没有行,因此MAX功能再次返回NULL再次回到同一变量。

要获得进一步的帮助,您需要说明代码的目的是什么以及您期望获得什么价值。如果您当前在所有行中需要最大的depption_id,则只需删除where子句。

注意:如果您查找当前最大ID的目的是为新记录设置Deppents_ID,则此方法还有其他问题(与并发会话有关(。

您的查询没有多大意义,因为它试图找到MAX(department_id)(并将其值放入V_MAX_DEPTNO变量(,而WHERE子句中使用相同的变量。

在声明时, V_MAX_DEPTNO为null,在 WHERE子句中也为null,没有部门的ID与null"相等",因此查询返回 nothing nothing

如果您初始化了V_MAX_DEPTNO(当然是愚蠢的(,您会得到

SQL> DECLARE
  2     v_max_deptno   departments.department_id%TYPE := 20;
  3  BEGIN
  4     SELECT MAX (department_id)
  5       INTO v_max_deptno
  6       FROM departments
  7      WHERE department_id = v_max_deptno;
  8
  9     DBMS_OUTPUT.put_line ('The maximum department_id is: ' || v_max_deptno);
 10  END;
 11  /
The maximum department_id is: 20
PL/SQL procedure successfully completed.
SQL>

所以问题是:您想做什么?我认为,正确的方法是删除此WHERE子句,即

SQL> DECLARE
  2     v_max_deptno   departments.department_id%TYPE := 20;
  3  BEGIN
  4     SELECT MAX (department_id)
  5       INTO v_max_deptno
  6       FROM departments;
  7
  8     DBMS_OUTPUT.put_line ('The maximum department_id is: ' || v_max_deptno);
  9  END;
 10  /
The maximum department_id is: 40
PL/SQL procedure successfully completed.
SQL>

最新更新