我正在使用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但仍然是同样的错误。
有没有办法在第一个if语句之前检查play_score和no_pins中传递的数字是否为小数?
答案 0 :(得分: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 ...