2016-06-27 75 views
0

我是學習存儲過程的新手,其中SQL執行存儲過程時出現'令牌未知'的錯誤

我想創建一個存儲過程,通過計算從自動數據插入值。

Attendance

EMPL_KODE |EMPL_NAME |DATE_IN |TIME_IN |TIME_OUT|TIME_IN |TIME_OUT 
001  | Michel |25.04.2016 |06:50 |15:40 |  | 
002  | Clara  |25.04.2016 |06:15 |15:43 |  | 
003  | Rafael |25.04.2016 |06:25 |15:45 |  | 
001  | Michel |26.04.2016 |06:23 |15:42 |  | 
002  | Clara  |26.04.2016 |06:10 |15:41 |  | 
003  | Rafael |26.04.2016 |06:30 |15:42 |  | 
001  | Michel |27.04.2016 |06:33 |15:42 |  | 
002  | Clara  |27.04.2016 |06:54 |15:44 |  | 
003  | Rafael |27.04.2016 |07:00 |15:45 |  | 

我想通過創建一個存儲過程,以填補自動TIME_INTIME_OUT值。下面是代碼:

CREATE PROCEDURE InsertTotalEmployee 
    @TOTAL_MINUTES int, 
    @TOTAL_HOURS float 
AS 
BEGIN 
    INSERT INTO ATTENDANCE (TOTAL_MINUTES, TOTAL_HOURS) 
    VALUES (
     SELECT 
      DATEDIFF(MINUTE, ATTENDANCE.TIME_IN, ATTENDANCE.TIME_OUT), 
      DATEDIFF(MINUTE, ATTENDANCE.TIME_IN, ATTENDANCE.TIME_OUT)/60.0 
    ) 
END 

後,我寫和執行我的發言,會出現一個消息錯誤:

令牌未知 - 2號線,5列@

我運行代碼使用Flamerobin。

+0

另外:你有一致的錯字 - 這是**出席**(而不是「隨意」,因爲你繼續拼寫它) –

+1

@marc_s我很抱歉我犯的錯誤。感謝您提醒。 –

回答

1

它看起來像你試圖在Firebird中使用Microsoft SQL Server語法,這是行不通的。

其中之一,@是不允許這樣的標識符(除非你使用雙引號),參數列表必須括在括號內。

請參閱CREATE PROCEDURE的語法。您需要將其更改爲:

CREATE PROCEDURE InsertTotalEmployee(TOTAL_MINUTES int, TOTAL_HOURS float) 

您也可能希望將數據類型更改floatdouble precision,和存儲過程的身體似乎因爲你是從什麼選擇是不完整的(一個select需要一個表從中選擇),並在語句結尾缺少分號。

總而言之,我建議你學習Firebird language reference,然後嘗試創建一個功能插入,然後創建一個存儲過程。

另請注意,在Flamerobin中創建存儲過程時,必須使用set term來切換語句終結符,否則Flamerobin無法正確發送存儲過程,另請參閱Procedural SQL (PSQL) Statements中的第一部分。

+0

感謝給我解釋。但是,我仍然對輸入和輸出參數感到困惑。還有關於聲明變量。 –

+0

它在[documentation](http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql.html)中有解釋,否則你應該問一個新的具體問題。 –

相關問題