我是PL / SQL和存储过程的新手。我正在尝试编写一个将通过CallableStatement从Java程序执行的存储过程。该过程采用两个参数,获取最后一条记录的id,递增它并使用新增加的id插入新记录。我在网上发现了一些基本上做同样事情的例子,但我无法解决错误。
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的混合。那么说,我尝试增加lastEmpId(如lastEmpId:= lastEmpId + 1),但得到了“无效的SQL语句”错误。 此外,Oracle文档(http://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm#CIHBCBHC)在解释如何在存储过程中定义和使用局部变量方面做得不好。
提前致谢。
答案 0 :(得分:5)
你可能想要像
这样的东西CREATE OR REPLACE PROCEDURE insertEmployeeProcedure
(lastname IN VARCHAR, firstname IN VARCHAR) AS
lastEmpId NUMBER;
BEGIN
SELECT COUNT(*)
INTO lastEmpId
FROM Employees;
INSERT INTO Employees(id, lname, fname) VALUES(lastEmpId + 1, lastname, firstname);
END insertEmployeeProcedure;
/
请注意,变量在BEGIN部分之前声明。
另外,如果您使用SQL开发人员,则在执行包创建代码后运行
show errors
在您实际调用该程序之前,它会向您显示任何问题。
答案 1 :(得分:2)
您必须使用序列来增加id列。并非总是行数匹配上次使用的ID
创建序列的示例:
CREATE SEQUENCE sequence_name
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
如何使用此序列的示例如下:
CREATE OR REPLACE PROCEDURE insertEmployeeProcedure
(lastname IN VARCHAR, firstname IN VARCHAR) AS
BEGIN
INSERT INTO Employees(id, lname, fname) VALUES(sequence_name.nextval, lastname, firstname);
END insertEmployeeProcedure;