2010-04-02 7 views
41

SQL Server ile SQL Server Management Studio veya diğer herhangi bir istemci üzerinden tam prosedürel mantıkla kod ad hoc T-SQL kodu çalıştırabilirim. PostgreSQL ile çalışmaya başladım ve PGSQL'in bir fonksiyona gömülmesi gereken herhangi bir mantığa ihtiyaç duyduğunda biraz fark yarattım.Bir işlev oluşturmadan pl/pgsql kodunu nasıl çalıştırabilirim?

Bir işlevi yürütmeden PL/PGSQL kodunu yürütmenin bir yolu var mı?

cevap

51

Postgres

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

Bu cevabı bulan ve yalnızca "ERROR: sözdizimi" elde etmeye çalışanlar için "SELECT" veya yakınında hata, bir BEGIN ve END'e ihtiyacınız var. DO $$ BEGIN/* pl/pgsql burada */END $$ –

+2

Ancak bu kod bir sorgu sonucunu nasıl döndürür? Eğer pl/pgsql kısmına SELECT koyduysam 'HATA: sorgu sonuç verisi için bir hedefe sahip değil ' – isapir

+2

@Igal: Yapamaz. Bir "DO" ifadesinden bir şey geri dönemezsiniz. Bildirimleri artırabilir veya geçici bir tabloya yazabilir veya olası geçici çözümler olarak bir imleci açabilirsiniz. –

5

Hayır, henüz değil. Sürüm 9.0 (hala alfa) bu seçeneğe sahip olacak (do), serbest bırakılıncaya kadar beklemeniz gerekecek.

+0

+1, ama 8.5 için açıklandı düşünüyorum - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

Ben 8.5 9.0 haline geldiğini düşündü Uygulanan bazı önemli özellikler nedeniyle ... –

+0

Ah, bunu açıklar. –

1

9 Bunun tam doğru yerlere yarı iki nokta üst üste ekleme konusunda oldukça sıkı çünkü bu çalışma almak için mücadele etti. Ama buna alıştıktan sonra iyi çalışır. Tabii ki, kayıtların geri gönderilememesinin yanı sıra, & istisna bildirimlerini artırabilir ve yukarıdaki açıklamalarda @ErwinBrandstetter gibi temp tablolarını kullanmak gibi diğer geçici çözümleri de yapabilirsiniz.

örn:

DO 
$$ 
BEGIN 
    IF EXISTS(SELECT 'any rows?' 
       FROM {your_table} 
       WHERE {your_column} = 'blah') 
    THEN 
     RAISE NOTICE 'record exists'; 
    ELSE 
     RAISE EXCEPTION 'record does not exist'; 
    END IF; 

    DROP TABLE IF EXISTS foo; 

    CREATE TEMP TABLE foo AS 
    SELECT 'bar'::character varying(5) as baz; 
END 
$$; 

SELECT * FROM foo; 
+0

SQL Server/Oracle saklı yordamlarına benzer şekilde satır döndürme yeteneği, PostgreSQL'in sonraki sürümünde geliyor. Neden bu kadar uzun sürdü, benim dışımda. –

İlgili konular