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