插入语句中的PL / SQL绑定变量,

0 oracle plsql

VARIABLE dept_id NUMBER

SET AUTOPRINT ON

DECLARE
max_dept departments.department_id%TYPE; 
dept_name departments.department_name%TYPE := 'Revenue';

BEGIN

SELECT MAX(department_id) 
INTO max_dept 
FROM departments; 

:dept_id := max_dept +10;

INSERT INTO departments (department_id,department_name,location_id)
VALUES(:dept_id,dept_name,NULL); 



END;

Run Code Online (Sandbox Code Playgroud)

返回错误

错误报告:ORA-01400:无法将NULL插入(“ HR”。“ DEPARTMENTS”。“ DEPARTMENT_ID”)ORA-06512:在第13行01400。00000-“无法将NULL插入(%s)” *原因:

Con*_*ald 5

我将在这里提出一些完全不同的建议。一旦您的应用程序“疯狂”退出,该方法注定会失败。

假设您的应用程序取得了巨大的成功,现在您有数十个人同时使用它,并假设当前有1000个部门是最高的部门。

现在,我们大约有20个人同时做:

SELECT MAX(department_id) 
INTO max_dept 
FROM departments; 
Run Code Online (Sandbox Code Playgroud)

结果它们将全部获得1000,然后将它们全部尝试将1010插入表中。然后会发生两件事之一

a)除主键之外的所有键都会因主键冲突而产生错误,b)您将有多行都带有dept = 1010的行

这些显然都不是很大。这就是为什么我们有一个叫做序列的东西可以保证为您提供唯一值的原因。您只需:

create sequence DEPT_SEQ;
Run Code Online (Sandbox Code Playgroud)

然后插入:

INSERT INTO departments (department_id,department_name,location_id)
VALUES(dept_seq.nextval,dept_name,NULL); 
Run Code Online (Sandbox Code Playgroud)

甚至还有更简单的机制(google代表“ oracle身份列”),但这很好地解释了前进的方向,并将使您免受当前方法的困扰。