5

私の目標は、複数の行からすべてのフィールド値を 1 つの出力変数 (おそらく varchar(some_length)) に収集できるストアド プロシージャを作成することです。奇妙な解決策に思えるかもしれませんが、その状況で使用できる唯一の解決策であると確信しています。以前に Firebird を使用したことがなく、ストアド プロシージャは他のよく知られている db システムとは大きく異なります。私の Firebird は 1.5 で、方言は 3 です (意味がわからない)。だから多分誰かがアルゴリズムの例で私を助けることができます.

4

3 に答える 3

5

次の手順は、説明したことを行います。

SET TERM !!;
CREATE PROCEDURE concat_names
  RETURNS (concat VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(100);
BEGIN
  concat = '';
  FOR SELECT first_name || ' ' || last_name FROM employee INTO :name
  DO BEGIN
    concat = concat || name || ', ';
  END
END!!
SET TERM ;!!
EXECUTE PROCEDURE concat_names;

しかし、私はこの解決策の賢明さに疑問を呈します。VARCHAR が必要なデータセットのすべての行に対して十分な長さであることをどのように確認しますか?

クエリを実行して結果を行ごとにアプリケーションに返す方が、はるかに簡単で安全です。すべてのアプリケーション プログラミング言語には、文字列を連結するためのメソッドがありますが、さらに重要なことは、データの増加を管理するためのより柔軟なメソッドを備えていることです。

ところで、Firebird と InterBase の「方言」は、InterBase 5.x 用に開発されたアプリケーションが InterBase と Firebird の新しいバージョンで動作できるようにするために導入された互換モードを指します。それはほぼ 10 年前のことであり、私の知る限り、今日では方言 3 より低い言語を使用する必要はありません。

于 2008-10-08T18:24:38.907 に答える
0

連結するときにnull値をテストする必要があります。これは、2つのフィールドとそれらの間のセパレーターの例です。

    CREATE PROCEDURE CONCAT(
    F1 VARCHAR(385),
    F2 VARCHAR(385),
    SEPARATOR VARCHAR(10))
RETURNS (
    RESULT VARCHAR(780))
AS
begin

  if ((:f1 is not null) and (:f1 <> '')) then
    result = :f1;

  if ((:f2 is not null) and (:f2 <> '')) then
    if ((result is not null) and (result <> '')) then
      begin
        if ((:separator is not null) and (separator <> '')) then
          result = result||separator||f2;
        else
          result = result||f2;
      end
    else
      result = f2;

  suspend;
end
于 2008-10-09T04:18:24.840 に答える
0

Firebird ストアド プロシージャを使用して複数の行を返すのは非常に簡単です。

使用しないでください:

execute procedure proc_name(value);

代わりに次を使用します。

select * from proc_name(value);
于 2012-08-31T02:28:13.723 に答える