我是一般的PL/SQL和存储过程的新手。我正在尝试编写一个将通过CallableStatement从Java程序执行的存储过程。该过程需要两个参数,获取最后一个记录的id,将其增加并插入一个新记录,并添加新增的id。我在网上发现了一些基本上做同样事情的例子,但我无法解决这些错误。INSERT存储过程(PL/SQL)
CREATE OR REPLACE PROCEDURE insertEmployeeProcedure
(lastname IN VARCHAR, firstname IN VARCHAR) AS
BEGIN
lastEmpId NUMBER := SELECT COUNT(*)
INTO lastEmpId
FROM Employees;
INSERT INTO Employees(id, lname, fname) VALUES(lastEmpId + 1, lastname, firstname);
END insertEmployeeProcedure;
/
的错误是:
Executed successfully in 0.018 s, 0 rows affected.
Line 1, column 1
Error code 984, SQL state 42000: ORA-00984: column not allowed here
Line 8, column 5
Error code 900, SQL state 42000: ORA-00900: invalid SQL statement
Line 9, column 1
Error code 0, SQL state null: java.lang.NullPointerException
Line 9, column 1
Execution finished after 0.018 s, 3 error(s) occurred.
据我明白一个存储过程是PL的混合和SQL.That说,我试图递增lastEmpId(如lastEmpId:= lastEmpId + 1)但得到了“无效的SQL语句”错误。 另外,Oracle docs(http://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm#CIHBCBHC)在解释如何定义和使用存储过程中的局部变量方面做得并不好。
在此先感谢。
即使忽略了一个事实,你是这里不使用序列 - 执行'select max(id)from ...'而不是count(*)'会更好,因为oracle可以使用最小/最大扫描并获得最多只有两个(或三个)来自索引的CR。 – haki 2013-04-28 08:34:42
varchar2是更常见的数据类型 - Oracle不鼓励使用varchar。另外,对象名称在Oracle中不区分大小写,除非使用双引号(大多数从业者不会),而“procedure”一词是多余的,因此该过程的更常规名称为insert_employee。 – 2013-04-28 17:53:15