0

私は次の関数を持っています(カスタムタイプのセットを返します)

CREATE OR REPLACE FUNCTION myfunction(in_myvar integer)
  RETURNS SETOF my_type AS
$BODY$

DECLARE
    v_data my_type%rowtype;
    v_another_var text;
BEGIN
    FOR v_data IN (

        -- I want to be able to do a SELECT INTO v_another_var in each iteration
        -- of the loop, ideally so I can use this value throughout the select
        -- statement e.g.:
        -- SELECT INTO v_another_var regex_replace(col3, '[^a-zA-Z0-9 ]', '');

        SELECT DISTINCT 
            col1
            col2,
            -- v_another_var AS some_column
            -- etc.
            -- perhaps use this v_another_var again here
            -- as part of something else.
          FROM mytable
          WHERE v_another_var = 'test' + some_function() = 'something'
                    -- want to use the variable again here.
    ) LOOP
        RETURN NEXT v_data;
    END LOOP;
    RETURN;
$BODY$

このように、変数を割り当てて、各 select ステートメントでループの一部として使用することは可能ですか? これが可能である場合でも、SELECT INTO ステートメントは私が持っている場所で機能しますか (col3 にアクセスできますか?)

この種の変数の使用法をpostgresで実現する方法はありますか?

4

2 に答える 2

3

ループの反復ごとに異なる値が必要な場合は、ループを制御するクエリで、またはLOOP/構文内でv_another_varの値を選択する必要があります。END LOOP必要に応じて、ループ内で他の値を割り当てるための追加のクエリをいつでも持つことができます。

より具体的な例がなければ、より具体的な提案をすることは困難です。

于 2012-04-20T12:44:19.560 に答える
1

あなたの質問はめちゃくちゃです。その多くはまったく意味がありません。

このように、変数を割り当てて、各 select ステートメントでループの一部として使用することは可能ですか?

  • 質問には SELECT ステートメントが1 つしかありません。あなたは意味がありません。

  • SELECT ステートメントの "in" にはループはありません。SELECT ステートメントの結果の行をループできます。

これが可能である場合でも、INSERT INTO ステートメントは私が持っている場所で機能しますか (col3 にアクセスできますか?)

  • それはまったくありません。あなたがそれを持っている場所でも、あなたがそこに持っているものでもありません。
    • 多分あなたはSELECT INTOを意味していましたか?
    • FROM句はありませんcol3。未定義です。
    • FOR ループ内のステートメントは1 つだけです。それについてはさらに下に。

さらに ...

  • FOR ループの SELECT に括弧は必要ありません。

  • regexp_replace()ではありませんregex_replace()

  • PostgreSQL でのテキスト連結:'test' || some_function()
    ない'test' + some_function()

  • 括弧が必要ですWHERE x = (a || b)

  • 言語宣言がありません。最後に追加language plpgsqlします。


あなたが尋ねているかもしれないこと(推測): はい、FORループ内で複数の変数を割り当てることができます。ここでマニュアルを引用します:

ターゲットは、レコード変数、行変数、またはスカラー変数のコンマ区切りリストです。

ただし、しようとしているように、レコード変数とスカラー変数を混在させることはできません。あなたはしなければならないでしょう...

a) 複合型v_dataをスカラー変数に分割し、それらを順番にリストしてv_another_varから、FOR ターゲット リストに追加します。

または b)v_another_var複合型に ( の代わりに)テキスト列を追加しますmy_type。ただし、RETURN NEXTこの場合、ステートメントを再編成する必要があります。ご質問の内容を推測しているだけなので、詳しくは説明しません。

正確な回答が必要な場合は、質問を整理して正確な質問をしてください。

于 2012-04-20T16:15:30.907 に答える