Firebird数据库存储过程出错

时间:2012-10-25 18:57:30

标签: firebird

我正在尝试创建一个存储过程,该过程将占用50个字节的字符串,并一次扫描一个字节以查找逗号。找到后我想更新一个字段,然后继续扫描字符串以查找其他逗号。

我正在使用Firebird数据库并使用DBVisualizer来开发代码。

@delimiter ++;

CREATE PROCEDURE scan_for_comma(
       lastname_field CHAR(50),
       sr_bold_id     int
 )
 RETURNS (
    comma_flag varchar(1))
    AS
 declare variable   max_bytes inv default 50;
 declare variable I integer;

 BEGIN
 I = 0;
 While 
  (I <= max_bytes)
  DO
  Begin
  if (substring(name_field from I for 1) = ',') then
     Begin
       comma_flag = 'Y'
       I = I +1
       UPDATE sr_address
       SET lastname = (substring(name_field from i for 1) = ' ')
       WHERE bold_id   = :sr_bold_id
     end     
  ELSE 
     (substring(name_field from loop_cnt for 1) != ',') then
      Begin
      I = I +1
      END
  END
END
++
@delimiter ;++

我收到此错误

  14:45:34 [@DELIMITER - 0行,0.000秒]
  命令处理
  14:45:34 [创建 - 0行,0.000秒]
  [错误代码:335544569,SQL状态:HY000]
  GDS例外。 335544569.
  动态SQL错误SQL错误代码= -104令牌未知 - 第21行,第12列   14:45:34 [@DELIMITER - 0行,0.000秒]
  命令已处理...
  执行3个语句,0行受影响,执行/获取时间:0.000 / 0.000秒
  [2个成功,0个警告,1个错误]

非常感谢任何帮助/方向。

非常感谢。

4 个答案:

答案 0 :(得分:1)

我不知道DBVisualizer,但我会尝试语法:

set term ++ ;

create procedure ...
:
end ++

set term ; ++

答案 1 :(得分:0)

您应该添加一个suspend命令来返回行。 例如:

comma_flag = 'Y';
suspend; -- returns a row

答案 2 :(得分:0)

在表达

  ...
  ELSE 
     (substring(name_field from loop_cnt for 1) != ',') then
  ...

在ELSE之后缺少关键字 IF

答案 3 :(得分:0)

在ISQL中它不是@delimiter,而是SET TERM,但这只是关于ISQL和其他一些工具(例如FlameRobin)。

但是,SET TERM的使用并不特定于Firebird本身(数据库引擎本身不知道该命令)。您很可能不需要在此工具中指定分隔符。只是在程序的END之后不要使用分隔符。