2017-12-21 12 views
0

以下の関数が正常にコンパイルされました。私はselect schema.funtion_name();を行うと、関数が実行されますが、テーブルschema.table_insertに挿入された行がないます:plpgsql関数が意図したとおりにデータを挿入していません

CREATE OR REPLACE FUNCTION schema.function_name() 
RETURNS void AS 
$BODY$ 
DECLARE cur_1 CURSOR FOR 
    Select col1 from schema.table1 
    union 
    select col1 from schema.table2 
    union 
    select col1 from schema.table3 
    union 
    select col1 from schema.table4; 

BEGIN 
    FOR rec_i in cur_1 LOOP 
     insert into schema.table_insert (col1,col2,col3) 
     select col1,col2,col3 
     from schema.view 
     where col1=rec_i.col1 

     commit; 
    END LOOP;  
END; 
$BODY$ 
LANGUAGE plpgsql STABLE 

900件の以上の000のレコードを返しますcur_1カーソルで選択します。 1つのレコードに対してinsertステートメントを個別に使用すると、そのレコードがテーブルに挿入されます。

+0

[回答はありますか?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

答えて

1

以下の機能が正常にコンパイルされています。

いいえ、あなたはありません。

まず、plpgsql関数はコンパイルされません。作成時には、表面的な構文チェックだけが行われ、関数本体はそのまま保存されます。編集なし。遅延バインディング。ネストされたSQL文は、プリペアド文として扱われます。

これ以外に表示する機能はまったく作成できません。それは構文的なナンセンスです。の後にセミコロンがありません。 COMMITは意味をなさないので、plpgsqlでは使用できません。このためにカーソルは必要ありません。ループもありません。簡単なSQL文を使用します。

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM schema.view v 
JOIN (
    SELECT col1 FROM schema.table1 
    UNION 
    SELECT col1 FROM schema.table2 
    UNION 
    SELECT col1 FROM schema.table3 
    UNION 
    SELECT col1 FROM schema.table4; 
    ) sub USING (col1); 

相当、速くなることがあります。

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM schema.view v 
WHERE EXISTS (SELECT 1 schema.table1 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table2 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table3 WHERE col1 = v.col1) 
OR  EXISTS (SELECT 1 schema.table4 WHERE col1 = v.col1); 

機能に包まれたが、やり過ぎplpgsqlがあることができます。 は、INSERTを含む関数では間違っています。私は平易なSQL関数を提案し、VOLATILEがデフォルトであり、これを修正しています。

CREATE OR REPLACE FUNCTION schema.function_name() 
    RETURNS void AS 
$func$ 
INSERT ... 
$func$ LANGUAGE sql; 
関連する問題