2

我正在尝试创建一个存储过程,该过程将采用 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 [CREATE - 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

4 回答 4

1

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

set term ++ ;

create procedure ...
:
end ++

set term ; ++
于 2012-10-26T03:26:27.303 回答
0

您应该添加一个暂停命令以返回行。例子:

comma_flag = 'Y';
suspend; -- returns a row
于 2012-10-26T03:30:49.267 回答
0

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

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

于 2012-10-26T09:22:28.503 回答
0

在表达

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

ELSE 后缺少关键字IF

于 2012-10-26T04:49:19.800 回答