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>