Bir COMMIT PostgreSQL 9.5 anonim bir plgpsql işlevi içinde çalışır?


8

Anonim bir plpgsql kod bloğu içinde döngüler kullanılarak bölümlenecek tabloların bir dizi büyük sayıda çok sayıda dosya alıyorum $do$.

$do$
BEGIN
    FOR yyyy in 2012..2016 THEN 
        EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
    END LOOP;
END;
$do$ LANGUAGE plpgsql

Tüm bu işlem yaklaşık 15 saat sürmelidir ve bir noktada bir ithalat hatası varsa, tüm içe aktarma işlemlerinin geri alınmamasını umuyorum.

IIRC COMMITsaklanan fonksiyonlar içinde çalışmaz, çünkü tüm fonksiyon tek bir işlem olarak değerlendirilir.

İçin olan belgelerden$do$

Kod bloğu, parametresiz bir fonksiyonun gövdesiymiş gibi işlenir ve boşluk döner. Bir kez ayrıştırılır ve yürütülür.

Bunun tüm $do$işlemin tek bir işlem olduğu ve blok içindeki taahhütlerin işe yaramayacağı anlamına geldiğini varsayıyorum . Doğrumuyum?


1
BEGINVeya COMMITişlev gövdesinde deneyin . Bir istisna alacaksınız, çünkü buna izin verilmiyor (mümkün değil).
Erwin Brandstetter

Yanıtlar:


9

Hayır,

Bir plpgsqlişlevin (veya anonim bloğun) içindeki bir işlemi kontrol edemezsiniz .

Blok dışında bir işlem oluşturmaya sahip olduğunuz tek seçenek, örneğin:

BEGIN;

DO $$
  -- function stuff

  -- but if you use a exception, you will force a rollback
  RAISE EXCEPTION 'message';
$$ LANGUAGE 'plpgsql';

COMMIT; -- OR ROLLBACK

BTW, DO BLOCKSgeri dönen işlevlerle aynı etkiye sahiptir void.

Lütfen dokümanda daha fazlasını görün:


Bunun hala böyle olup olmadığını biliyor muyuz? Birkaç yüz kez döngü gereken bir işlevi var. İlk döngü, 7'inci saate yakın olduktan 2 saniye sonra 10. döngüden sonra hiçbir şey görmedim.
Dennis Bauszus

1

"DO" blokları (veya işlevleri) (11'den az Postgresql sürümü için) içinde işlemek için tek çözüm aynı sunucuya dblink bağlantısı kullanmak ve orada sorgularınızı yürütmektir. Değişkenleri ve geçici nesnelerin görünürlüğünü unutmayın.

dblink hakkında daha fazla bilgi Postgresql-11 işlem denetiminden "DO" bloğunun içinden başlayarak "DO-block" başka bir işlemde çalışmazken kullanılabilir.


postgresql.org/docs/11/sql-do.html 'İşlem kontrol bildirimlerine yalnızca DO kendi işleminde yürütüldüğünde izin verilir.' Bu elbette 9.5 ile doğru değildi. dblinkSizinle OTOH başka bir işlem açacaktır, bu nedenle COMMITorada yaptığınız çağrı, yanılmıyorsam arama işlemini etkilemez.
dezso

Benim hatam. "DO" içerisinde işlem kontrolü Postgresql-11'de tanıtıldı. Ben sadece 10.4 hala çalışmıyor kontrol.
Dzhureedzh

@dezso Beni buna işaret ettiğiniz için teşekkür ederim, PG11 sunucularında bile dblink yöntemini kullanıyordum.
Dzhureedzh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.