0

一般来说,我是 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 ) 没有很好地解释如何在存储过程中定义和使用局部变量。

提前致谢。

4

2 回答 2

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

它会在您实际调用该过程之前向您显示任何问题。

于 2013-04-27T19:12:48.997 回答
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;
于 2013-04-27T19:16:12.183 回答