問題は、FlameRobin が、ステートメントがいつ終了し、次のステートメントが開始されるかを知る必要があることです。デフォルトでは、これにはセミコロン ( ;
) が使用されます。ただし、EXECUTE BLOCK
は基本的にデータベースに保存されないストアド プロシージャであるため、セミコロンをステートメント区切り文字として使用する PSQL コードも含まれています。
この結果、FlameRobin が不完全なステートメントをサーバーに送信しているため (つまり、;
遭遇するたびにステートメントを送信しているため)、構文エラーが発生します。
を使用して別のステートメント ターミネータを使用するように FlameRobin に指示する必要がありますSET TERM
。他の Firebird クエリ ツール (isql など) でもこれが必要ですが、実際には Firebird 自体の構文の一部ではありません!
したがって、コードを次のように実行する必要があります。
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
AS
DECLARE customerID INT = 1234;
BEGIN
SELECT * FROM customers WHERE customerid = :customerID;
END#
-- Restore terminator to ;
SET TERM ;#
ただし、このクエリは PSQL では無効であるため、これを行うとエラーが発生しますSELECT
。PSQL ブロック内の A にはINTO
、列を変数にマップする句が必要です。また、FlameRobin に返された から値を取得するには、次のドキュメントで説明されているように句EXECUTE BLOCK
を指定する必要もあります。RETURNS
EXECUTE BLOCK
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
RETURNS (col1 INTEGER, col2 VARCHAR(100))
AS
DECLARE customerID INT = 1234;
BEGIN
SELECT col1, col2 FROM customers WHERE customerid = :customerID INTO :col1, :col2;
SUSPEND;
END#
-- Restore terminator to ;
SET TERM ;#
私の知る限り、SUSPEND
ここでは技術的には必要ありませんが、含まれていない場合、Flamerobin は返された行をフェッチしません。
ただし、選択によって複数の行が生成される場合、上記は機能しません。そのためには、次FOR SELECT ... DO
のものと組み合わせて使用する必要がありSUSPEND
ます。
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
RETURNS (col1 INTEGER, col2 VARCHAR(100))
AS
DECLARE customerID INT = 1234;
BEGIN
FOR SELECT col1, col2 FROM customers WHERE customerid = :customerID INTO :col1, :col2
DO
SUSPEND;
END#
-- Restore terminator to ;
SET TERM ;#
here は行を返し、SUSPEND
呼び出し元がその行をフェッチしてからFOR
ループを続行するまで待機します。このようにして、結果を反復処理します。
IMHOは、パラメータ化に多大な労力を費やしています。FlameRobin を使用する場合は単純にパラメータ化しないことを検討するか、Firebird の通常のパラメータ プレースホルダのパラメータ値の要求をサポートするツールを使用することをお勧めします (ただし、正直なところ、存在するかどうかはわかりません)。