我是一般的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