2016-12-19 3 views
1

私の問題はselectから得たすべての行をテーブルに挿入しています。ここに私の関数である。PostgreSQLで選択したすべての行をループします。

CREATE OR REPLACE FUNCTION imp_br_id_telefon_hlr_for_one_bank(id_bank bigint) 
    RETURNS void AS 
$BODY$ 
DECLARE 
    v_record       record; 
    v_query     text; 

BEGIN 
    FOR v_record IN 
    SELECT DISTINCT(bk_telefon.id) as id, 
     coalesce(bk_telefon.nr_kierunkowy || nr_telefonu, nr_telefonu) as nr_telefon FROM bk_telefon 
    INNER JOIN bp_dluznik2produkt ON bk_telefon.id_dluznik = bp_dluznik2produkt.id_dluznik 
    INNER JOIN bp_produkt ON bp_produkt.id = bp_dluznik2produkt.id_produkt 
    INNER JOIN d_bk_typ_telefon ON d_bk_typ_telefon.id = bk_telefon.id_typ_telefon 
    WHERE bp_produkt.id_bank IN(id_bank) 
    AND d_bk_typ_telefon.id NOT IN (5, 11, 20, 21, 22) 
    AND bk_telefon.active=true 
    AND bk_telefon.nr_telefonu NOT IN ('000000', '111111', '222222', '333333', '444444', '555555', '666666', '777777', '888888','999999') 
    AND bp_produkt.id_status_produkt NOT IN (10, 32, 33, 2) 
    AND bk_telefon.data_ins::date <= '2016-12-08' 
    LOOP 
     INSERT INTO br_raport_telefonow(id_telefon, nr_telefonu, data_generacji) VALUES (v_record.id, v_record.nr_telefon, CURRENT_DATE); 
     raise notice 'insertuje do weryfikacji'; 
    END LOOP; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION imp_br_id_telefon_hlr_for_one_bank(bigint) 
    OWNER TO mwalko; 

私はテーブル内の4453行(br_raport_telefonow)を得た。この機能を実行した後、私はちょうど(機能の一部である)クエリを実行すると:

SELECT DISTINCT(bk_telefon.id) as id, 
     coalesce(bk_telefon.nr_kierunkowy || nr_telefonu, nr_telefonu) as nr_telefon FROM bk_telefon 
    INNER JOIN bp_dluznik2produkt ON bk_telefon.id_dluznik = bp_dluznik2produkt.id_dluznik 
    INNER JOIN bp_produkt ON bp_produkt.id = bp_dluznik2produkt.id_produkt 
    INNER JOIN d_bk_typ_telefon ON d_bk_typ_telefon.id = bk_telefon.id_typ_telefon 
    WHERE bp_produkt.id_bank IN(id_bank) 
    AND d_bk_typ_telefon.id NOT IN (5, 11, 20, 21, 22) 
    AND bk_telefon.active=true 
    AND bk_telefon.nr_telefonu NOT IN ('000000', '111111', '222222', '333333', '444444', '555555', '666666', '777777', '888888','999999') 
    AND bp_produkt.id_status_produkt NOT IN (10, 32, 33, 2) 
    AND bk_telefon.data_ins::date <= '2016-12-08' 

それは426163個の行を返します。 。 selectから各行をループしてはいけませんか? 42k行がどこに失われたのか分かりません。私は何が欠けていますか?

+1

してみてください。単純なSQLだけでも同じことができます。 'imp_br_id_telefon_hlr_for_one_bank'を実行すると引数が – joop

+0

になりますが、SQL文では' bp_produkt.id_bank IN(id_bank) 'を使用できません。 –

+0

1回の使用で機能します。 SELECT * FROM imp_br_id_telefon_hlr_for_one_bank(5)で実行しますが、もちろん引数を削除してid_bankとして5を追加することもできます。 – Michu93

答えて

1

ディッチループと私はあなたがループまたはカーソルを必要としないと思う

INSERT INTO br_raport_telefonow(id_telefon, nr_telefonu, data_generacji) 

    SELECT DISTINCT(bk_telefon.id) as id, 
     coalesce(bk_telefon.nr_kierunkowy || nr_telefonu, nr_telefonu) as nr_telefon, CURRENT_DATE 
FROM bk_telefon 
    INNER JOIN bp_dluznik2produkt ON bk_telefon.id_dluznik = bp_dluznik2produkt.id_dluznik 
    INNER JOIN bp_produkt ON bp_produkt.id = bp_dluznik2produkt.id_produkt 
    INNER JOIN d_bk_typ_telefon ON d_bk_typ_telefon.id = bk_telefon.id_typ_telefon 
    WHERE bp_produkt.id_bank IN(id_bank) 
    AND d_bk_typ_telefon.id NOT IN (5, 11, 20, 21, 22) 
    AND bk_telefon.active=true 
    AND bk_telefon.nr_telefonu NOT IN ('000000', '111111', '222222', '333333', '444444', '555555', '666666', '777777', '888888','999999') 
    AND bp_produkt.id_status_produkt NOT IN (10, 32, 33, 2) 
    AND bk_telefon.data_ins::date <= '2016-12-08' 
+0

それは動作します!ありがとうございますが、私の機能がなぜなかったのかまだ分かりません。 – Michu93

+1

どちらか分かりませんが、それについて心配しないでください! :) PostgreSQLは大きなクエリで非常に優れています。これは、各行をループして別々に挿入するよりもはるかに高速に動作します。とにかく助けてくれてうれしいです。あなたのプロジェクトでは最高のものです。 – e4c5

関連する問題