2

50 バイトの文字列を取り、一度に 1 バイトずつスキャンしてカンマを探すストアド プロシージャを作成しようとしています。見つかったら、フィールドを更新し、文字列のスキャンを続けて追加のコンマを探します。

私は 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

表情で

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

ELSE の後にキーワードIFがありません

于 2012-10-26T04:49:19.800 に答える
0

ISQL では @delimiter ではなく SET TERM ですが、これは ISQL とその他のツール (FlameRobin など) に関するものにすぎません。

ただし、SET TERM の使用は Firebird 自体に固有のものではありません (データベース エンジン自体はそのコマンドを認識しません)。ほとんどの場合、このツールで区切り記号を指定する必要はありません。ENDプロシージャの後に区切り記号を使用しないでください。

于 2012-10-26T09:22:28.503 に答える
0

行を返すには、サスペンド コマンドを追加する必要があります。例:

comma_flag = 'Y';
suspend; -- returns a row
于 2012-10-26T03:30:49.267 に答える