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 语句之前的小数吗?

4

1 回答 1

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 ...
于 2013-06-01T19:44:25.980 回答