2013-04-27 74 views
0

我是一般的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)在解釋如何定義和使用存儲過程中的局部變量方面做得並不好。

在此先感謝。

+0

即使忽略了一個事實,你是這裏不使用序列 - 執行'select max(id)from ...'而不是count(*)'會更好,因爲oracle可以使用最小/最大掃描並獲得最多隻有兩個(或三個)來自索引的CR。 – haki 2013-04-28 08:34:42

+0

varchar2是更常見的數據類型 - Oracle不鼓勵使用varchar。另外,對象名稱在Oracle中不區分大小寫,除非使用雙引號(大多數從業者不會),而「procedure」一詞是多餘的,因此該過程的更常規名稱爲insert_employee。 – 2013-04-28 17:53:15

回答

3

你可能要像

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 

後,它會告訴你任何問題,你真正調用程序之前。

+0

移動聲明塊中的變量。謝謝。在INSERT行仍然出現「列不允許在這裏」。看起來像適合我的SQL。 – Dmitry 2013-04-27 19:20:07

+0

我只是試了一下,它工作正常。你有更多的細節嗎? – 2013-04-27 19:27:25

+0

我已連接到數據庫並從NetBeans IDE運行命令。將嘗試SQL開發。 – Dmitry 2013-04-27 19:34:22

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; 
+0

試過這個。大多數錯誤都沒有了!由於某種奇怪的原因,最後一行仍然是「無效的SQL」。謝謝。 – Dmitry 2013-04-27 19:32:30

相關問題