2016-12-18 10 views
0

私は関数を持っており、その関数の中に変数を作成します。作成した変数をフィルタリングのしきい値として使用したいと思います。PL/pgSQL関数の参照変数

ERROR: column "problematicVariable" does not exist 

がどのように私はこれは列が、私は、関数本体内で作成された変数ではないことはpostgresを言うだろう:

CREATE OR REPLACE FUNCTION someF(a integer, b integer, c integer) 
RETURNS void AS 
$$ 
DECLARE 
    problematicVariable float := $1/$2; 

BEGIN 
    FOR i in 1 .. $3: 
    CREATE TABLE IF NOT EXISTS someTable AS 
     SELECT someFunction( 
      'SELECT id, 
      FROM yetAnotherTable st 
      WHERE st.agg <= problematicVariable') 
    END LOOP; 
END 
$$ 
language 'plpgsql'; 

はしかし、私はというエラーを取得しますか?

+1

WHERE st.agg <= '|| problematicVariable) ' –

+0

変数を参照することは、あなたの問題の中では最少です。ゼロによる除算、整数除算、 'SELECT * 'ではなく' SELECT'、同じテーブル名での 'CREATE TABLE'の繰り返し...あなたのアプローチは大きな混乱です。 –

答えて

1

問題が名前problematicVariableは、それが明らかに定義されていないsomeFunction()、で解釈されていることです。これは安定した呼び出しです(関数のパラメータは常に同じですから、揮発性の値に依存しないと仮定すると、すべての呼び出しで関数から同じデータが返されます)。ループから取り除き、someF()をその最初の関数呼び出しの結果。

CREATE OR REPLACE FUNCTION someF(a integer, b integer, c integer) RETURNS someType AS $$ 
DECLARE 
    problematicVariable float := $1/$2; 
    idVar someType; 
BEGIN 
    SELECT id INTO idVar 
    FROM yetAnotherTable st 
    WHERE st.agg <= problematicVariable; 

    FOR i IN 1 .. $3 LOOP 
     CREATE TABLE IF NOT EXISTS someTable AS 
      SELECT someFunction(idVar); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 
+0

オリジナルから複数のバグをコピーしています... –

+0

@ErwinBrandstetter私を啓発してください。問題のコード内のロジックは意味をなさない。コーディングスタイルは「緩やか」であり、いくつかの潜在的な病理があるが、そのようなバグはない。 'b!= 0'と仮定し、最初のselectが単一の行を生成すると、コードは正常に動作します。私には、OPがすぐに、彼が直面していた問題(「someF()」と「someFunction()」が実際のコードのようには見えない)を示すいくつかのコードを一緒にパッチしているようです。 *実際のバグを取り除いて、その特定の問題に取り組んだ。 – Patrick

+0

私は質問の下でコメントしました。 –