2013-06-01 227 views
1

我正在學習使用SQLAnywhere的SQL,我相信使用一個相當標準的SQL語法檢查一個值是否在輸入

我的問題是我創建了一個表MatchRecord一個id爲char小數(4) NOT NULL,十進制分數和十進制引腳。

現在我想創建一個過程insert_scores把值插入到表 我有這麼遠:

create procedure insert_scores(IN play_id char(4), IN play_score decimal(5, 2), 
    IN no_pins decimal(5, 2), OUT a_message varchar(40)) 

    begin 
    if substr(play_id, 1, 1)in (Upper('M','F', 'J' 
    then 
     if isnumeric(substr(play_id 2, 3)) = 1 
     then 
      if isnumeric(play_score) = 1 
      then 
      if isnumeric(no_pins) = 1 
      then 
       insert into MatchRecord(id, score, pins) 
       values(play_id, play_score, no_pins); 
       set a_message = 'Entry successful'; 
      else 
      set a_message = 'Number of pins must be decimal ie, 1.6 '; 
      end if; 
      else 
      set a_message = 'Score must be decimal ie, 9.4 '; 
      end if; 
     else 
     set a_message = 'ID number must be in range 000 to 999 '; 
     end if; 
    else 
    set a_message = 'First character of ID must be M, F of J': 
    end if; 

這工作得很好除了對角色的任何意外插入系統拋出一個錯誤,似乎在讀取if語句之前檢查表的類型, 我試過isnumeric(string(play_score))= 1,但仍然是相同的錯誤。

有什麼辦法檢查在play_score和no_pins中傳遞的數字是否是第一個if語句之前的小數?

回答

0

您可以嘗試將您的號碼轉換爲字符串,然後檢查字符串中是否有點。像這樣的東西可以做到這一點。

DECLARE @number_is_ok BIT 

SET @number_is_ok = CASE charindex('.', CAST(play_score as CHAR)) 
     WHEN 0 THEN 0 
     ELSE 1 
     END 

你可以做一個簡單的檢查,如果數字是十進制或不是,然後繼續相應的邏輯。

IF @number_is_ok = 1 ... 
+0

感謝拉杜,但如果輸入是2a.5它仍然會失敗。 – nigs

+0

你沒有指定這種情況。您應該從應用程序中刪除字母和其他字符。或者你想嚴格遵守SQL? –

+0

試圖嚴格保持SQL。我試圖檢查SQLSTATE,但它不接受,所以我試圖捕獲一個異常,但它也不會這樣做。 – nigs

相關問題