Переменная хоста DEPT_ID
не равна NULL после назначения.Проблема в том, что ваш оператор INSERT
использует локальную переменную NEW_DPT
в INSERT
, и что локальной переменной не присвоено значение.Если вы действительно хотите использовать переменную хоста в PL / SQL (вы, по сути, никогда не сделаете этого в реальной жизни), вам необходимо использовать это в своем блоке PL / SQL
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 max_deptno NUMBER;
3 new_dpt NUMBER;
4 dept_name departments.department_name%TYPE := 'Education';
5 BEGIN
6 select max(department_id)
7 into max_deptno
8 from departments;
9 :dept_id := max_deptno + 10;
10 insert into departments (department_id, department_name, location_id)
11 values (:dept_id, dept_name, null);
12 DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
13 DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
14* END;
SQL> /
The maximum department id is 270
Rows made by insert: 1
PL/SQL procedure successfully completed.
SQL> select :dept_id from dual;
:DEPT_ID
----------
280
Однако более реалистичнобыло бы полностью исключить переменную подстановки
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 max_deptno NUMBER;
3 new_dpt NUMBER;
4 dept_name departments.department_name%TYPE := 'Education';
5 BEGIN
6 select max(department_id)
7 into max_deptno
8 from departments;
9 new_dpt := max_deptno + 10;
10 insert into departments (department_id, department_name, location_id)
11 values (new_dpt, dept_name, null);
12 DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
13 DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
14* END;
SQL> /
The maximum department id is 280
Rows made by insert: 1
PL/SQL procedure successfully completed.