Stored procedures 检查输入中的值是否为十进制

Stored procedures 检查输入中的值是否为十进制,stored-procedures,sqlanywhere,Stored Procedures,Sqlanywhere,我正在使用SQLAnywhere学习SQL,我相信它使用了相当标准的SQL语法 我的问题是我创建了一个表MatchRecord,Id为char(4)notnull,分数为decimal,pins为decimal 现在我想创建一个过程insert_scores,将值插入到表中 到目前为止,我已经做到了: create procedure insert_scores(IN play_id char(4), IN play_score decimal(5, 2), IN no_pin

我正在使用SQLAnywhere学习SQL,我相信它使用了相当标准的SQL语法

我的问题是我创建了一个表MatchRecord,Id为char(4)notnull,分数为decimal,pins为decimal

现在我想创建一个过程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 and no_pins中传递的数字在第一个if语句之前是否为十进制?

您可以尝试将数字转换为字符串,然后检查字符串中是否有点。像这样的东西可以达到目的

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 ...

谢谢Radu,但是如果输入是2a.5,它仍然会失败。您没有指定这样的情况。您应该从应用程序中删除字母和其他字符。或者你想严格遵守SQL吗?试着严格遵守SQL。我试图对照SQLSTATE进行检查,但它不接受,因此我尝试捕获异常,但它也不会这样做。这会使SQL部分变得非常复杂,以便在解析输入时考虑到各种可能的情况。在您的业务层中是否没有办法实现这一点?目前还没有业务层,只是试图捕获任何可能的不正确输入并使其尽可能简单。