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

时间:2019-06-11 11:50:23

标签: 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;

返回错误

  

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

1 个答案:

答案 0 :(得分:5)

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

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

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

SELECT MAX(department_id) 
INTO max_dept 
FROM departments; 

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

a)除一个键外,所有键都将因主键冲突而出错, b)您将有多行都带有dept = 1010

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

create sequence DEPT_SEQ;

然后插入:

INSERT INTO departments (department_id,department_name,location_id)
VALUES(dept_seq.nextval,dept_name,NULL); 

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