2017-09-15 13 views
0

temp_tableにデータを挿入し、その結果を解析してテーブルを切り捨てようとしています。ここでPERFORMを使用してSELECT文の文字列をテンポラリテーブルに挿入する

は私のコードです:私はこの機能 SELECT * FROM validation(); を実行するたびに

CREATE OR REPLACE FUNCTION validation() 
    RETURNS text AS $$ 
DECLARE counter INTEGER; 
DECLARE minsid INTEGER; 
DECLARE maxsid INTEGER; 
DECLARE rec RECORD; 
DECLARE stmt varchar; 
BEGIN 
    SELECT MIN(sid) INTO minsid FROM staging.validation; 
    SELECT MAX(sid) INTO maxsid FROM staging.validation; 

    CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP; 

    FOR counter IN minsid..maxsid LOOP 
    RAISE NOTICE 'Counter: %', counter; 
    SELECT sql INTO stmt FROM staging.validation WHERE sid = counter; 

    RAISE NOTICE 'sql: %', stmt; 

    PERFORM 'INSERT INTO temp_table (col1, col2, col3) ' || stmt; 

    IF temp_table.col3 = false THEN 
     RAISE NOTICE 'there is a false value'; 
    END IF; 

    END LOOP; 
END; $$ 
LANGUAGE plpgsql; 

私はエラーを取得する:ここで

ERROR: missing FROM-clause entry for table "temp_table" Where: PL/pgSQL function validation() line 21 at IF

は私のstaging.validationテーブルがどのように見えるかである -

https://docs.google.com/spreadsheets/d/1bXO9gqFS-GtcC1qJtgNbFkR6ygOuPtR_RZoU7VNhgrI/edit?usp=sharing

+0

'stmt'の値は何ですか?そしてエラーはどこですか? '実行 'について? –

+0

'stmt'はSQLステートメントで、' staging.validation'テーブルからその値を取得します。問題はIF条件だと思う。 – hky404

+0

「何かを実行する」ことは、「何かを選択する」とほぼ同じことを知っていますか?おそらく代わりに 'EXECUTE'文が必要でしょうか? – Abelisto

答えて

3

まず、すべての変数にDECLAREを使用する必要はありません.1つであれば十分です。

DECLARE 
    counter INTEGER; 
    minsid INTEGER; 
    maxsid INTEGER; 
    rec RECORD; 
    stmt varchar; 

第2に、temp_table.col3をそのまま使用することはできません。テーブルであるため、クエリする必要があります。テーブルに変数とクエリを作成したり、直接クエリを作成したりすることができます。

変数:

直接
-- First you declare de varialbe: 
DECLARE 
    temp BOOLEAN; 

... -- rest of your code 

temp := temp_table.col3 FROM temp_table WHERE temp_table.col2=counter; 
-- you need something to make the query, here as a test I put col2=counter 
IF temp=false THEN 
... -- rest of your code 

... -- rest of your code 
IF (SELECT temp_table.col3 FROM temp_table WHERE temp_table.col2=counter)=false THEN 
-- Again, you need something to make the query 
... -- rest of your code 

そして第三に、あなたの関数を使用すると、PLリターンが欠落している中で、RETURNSテキストを持っています。

+1

良い答えですが、 'IF temp = false THEN'はあいまいで、' IF temp THEN'なら十分です。第3の方法: 'insert into ... rec *へのreturn; rec.col3の場合は、 '。 – Abelisto

+1

私はレコードに気付かなかった。しかし、クエリはPERFORMにあるため、3番目の方法はEXECUTE INTO形式にする必要があります。 – Dan

+0

@Abelistoあなたは第3の方法で詳細を教えていただけますか? – hky404