简单的任务
variable dept_id NUMBER
DECLARE
max_deptno NUMBER;
dept_name departments.department_name%TYPE := 'Education';
BEGIN
select max(department_id)
into max_deptno
from departments;
:dept_id := max_deptno + 10;
insert into departments (department_id, department_name, location_id)
values (:dept_id, dept_name, null);
DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
END;
Run Code Online (Sandbox Code Playgroud)
max_deptno不是NULL.为什么dept_id在赋值后为NULL?我究竟做错了什么?
脚本输出:
MAX(DEPARTMENT_ID)
------------------
520
Error starting at line 10 in command:
DECLARE
max_deptno NUMBER;
dept_name departments.department_name%TYPE := 'Education1';
BEGIN
select max(department_id)
into max_deptno
from departments;
:dept_id := max_deptno + 10;
insert into departments (department_id, department_name, location_id)
values (:dept_id, dept_name, null);
DBMS_OUTPUT.PUT_LINE('The maximum department id is ' || max_deptno);
DBMS_OUTPUT.PUT_LINE('Rows made by insert: ' || SQL%ROWCOUNT);
END;
Run Code Online (Sandbox Code Playgroud)
错误报告:
ORA-01400: ?????????? ???????? NULL ? ("ANDKOM"."DEPARTMENTS"."DEPARTMENT_ID")
ORA-06512: ?? line 9
01400. 00000 - "cannot insert NULL into (%s)"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然而,更现实的是完全抛弃替代变量
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28699 次 |
| 最近记录: |