Skip to main content

PostgreSQL11 Yenilikleri 4 - Stored Procedure

Merhaba,

PostgreSQL 10 ve öncesine kadar Stored Procedure'e en yakın veritabanı objesi olarak fonksiyon bulunuyordu. İkisi arasındaki en büyük fark fonksiyon bir sonuç döndürürken, Stored Procedure'ün buna ihtiyaç duymaması.

PostgreSQL 11 ile gelen özelliklerden biri de yeni eklenen veritabanı objesi olan Stored Procedure'ler oldu.

Stored Procedure CREATE OR REPLACE PROCEDURE ...  ile oluşturulur.  Fonksiyonlar SELECT ile çağırılırken, Stored Procedure'ler PostgreSQL 11 ile gelen yeni bir ifade olan CALL komutu ile çalıştırılır.

Stored Procedure, fonksiyondaki gibi input parametrelerinde IN, OUT ve INOUT kullanılabilir aynı fonksiyonlardaki gibi. 

Bir Stored Procedure'ü aşağıdaki gibi oluşturabilirsiniz.

[pg11] # CREATE OR REPLACE PROCEDURE public.test_procedure(a integer, INOUT b integer)
 LANGUAGE plpgsql
AS $procedure$ 

BEGIN
        SELECT a*b INTO b;
END;
$procedure$;
CREATE PROCEDURE


Stored procedure'ü CALL komutuyle çalıştırabilrsiniz.

[pg11] # CALL test_procedure (2,3);
 b
---
 6
(1 row)


Oluşturulan Stored Procedure listesini psql komutu olan \df veya bir procedure hakkında ayrıntılı bilgiye ulaşmak için \df+ <procedure_name> komutlarını kullanabilirsiniz.

[pg11] # \df
                                List of functions
 Schema |      Name       | Result data type |    Argument data types     | Type
--------+-----------------+------------------+----------------------------+------
 public | test_procedure  |                  | a integer, INOUT b integer | proc
 public | test_procedure2 |                  | a integer, INOUT b integer | proc
 

Psql komutu ile procedure içeriğini düzenlemek isterseniz \ef komutunu kullanabilirsiniz. Bu komutu fonksyionları düzenlemek için kullanıyorduk. Şimdi procedure'leri de bu komutla düzenleyebiliriz. Düzenlemeyi tamamladıktan sonra dosyayı kaydedip çıkın ve \g veya ; ile düzenlediğiniz procedure dosyasını kaydedin.

[pg11] # \ef test_procedure2
... # \g
CREATE PROCEDURE


Bir stored procedure'ü PostgreSQL veritabanından silmek için DROP PROCEDURE komutunu kullanabilirsiniz.

[pg11] # DROP PROCEDURE test_procedure;
DROP PROCEDURE


ALTER komutunu kullanarak Stored Procedure'ün ismi, sahibi, şeması, bağlı olduğu eklenti(extension) gibi bilgilerini değiştirebilirsiniz. 

[pg11] # ALTER PROCEDURE test_procedure(int,int) RENAME TO test_procedure2;
ALTER PROCEDURE


Stored Procedure'ün en önemli özelliği, tek bir transaction içinde COMMIT ve ROLLBACK komutlarının kullanılması.

[pg11] # CREATE OR REPLACE PROCEDURE public.test_procedure(a integer, INOUT b integer)
 LANGUAGE plpgsql
AS $procedure$ BEGIN
   for i IN 0..2 LOOP
      case when a=b then
           update procedure_exp set f_col=0 where f_col=a;
           commit;
           raise notice 'f_col: % 0 olarak güncellendi', a;
      else
           rollback;
           raise notice 'f_col: % sütunu güncellenmedi', a;
      end case;
   end loop;
END;
$procedure$
;
CREATE PROCEDURE


Fonsiyonu çalıştırdığımızda sonuç aşağıdaki gibi olacaktır.

[pg11] # CALL test_procedure(1,1);
NOTICE:  00000: f_col: 1 0 olarak güncellendi

LOCATION:  exec_stmt_raise, pl_exec.c:3747
NOTICE:  00000: f_col: 1 0 olarak güncellendi
LOCATION:  exec_stmt_raise, pl_exec.c:3747

 b
---
 1
(1 row)


[pg11] # CALL test_procedure(1,2);
NOTICE:  00000: f_col: 1 sütunu güncellenmedi
LOCATION:  exec_stmt_raise, pl_exec.c:3747

NOTICE:  00000: f_col: 1 sütunu güncellenmedi
LOCATION:  exec_stmt_raise, pl_exec.c:3747
 


 b
---
 2
(1 row)


Sevgiler,

Comments

Popular posts from this blog

PGConf Europe 2018 Güncesi 1

Merhaba, Diğer tüm veritabanları arasında en popüler açık kaynak kodlu veritabanı olan PostgreSQL, tüm yıl boyunca farklı ülkelerde bir çok konferansa sahiplik yapmaktadır. En bilinenleri PGDay ve PGConf'dur. Ayrıca her yıl 2 Şubatta Brüksel’de yapılan FOSDEM etkinliğinde de PostgreSQL konuşmalarının yapıldığı bir oturum mutlaka olmaktadır. PostgreSQL etkinlik detaylarına bu linkten ulaşabilirsiniz. Bu yıl ki PGConf Europe konferansı Lizbon'da yapıldı. Konferansla ilgili izlenimlerimi, yaptığım neredeyse 6 günlük yolculuğun en başından tüm detaylarıyla birlikte paylaşmak istiyorum. Yolculuğumuz sevgili Seda ile birlikte Atatürk Havalimanı’ndan sabah 07:30’da Lizbon’a direk uçuşla başladı.  Hava şahaneydi ve uçuşumuz konforlu geçti. Koltuğumuz cam kenarı ve uçağın kanadının hemen yanındaydı (benim favori koltuklarım 24, 25, 26, 27 ve 28. sıradakiler) ve biz 27. sıradaydık. Bol bol resim çektik bulutların üstündeyken ve uçak kanatlı olanlardan.  Lizbon’a vardığımı...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...

PostgreSQL High Availability - Patroni 1

Patroni, PostgreSQL HA (High Availability) Cluster yapısının kurulması ve yönetimi için kullanılan open source bir araçtır. Patroni, PostgreSQL Cluster’inin kurulumu (bootstrap), replikasyonunun kurulumu, PostgreSQL otomatik failover yapılması amacıyla kullanılır. Python ile yazılmıştır. Bir önceki yazıda PostgreSQL'de Autofailover araçlarının ne olduğu ve neden Autofailover'a gereksinim duyulduğu konusunda yazı paylaşmıştım. Yazıya buradan ulaşabilirsiniz. Patroni Kurulumu İçin Gereksinimler nedir? Patroni’nin tek başına kurulumu autofailover yapısını yapılandırmak için yeterli değildir. Patroni ile Autofailover yapısının kurulması için DCS (Distributed Configuration Store) araçlarından birine ihtiyaç vardır. Bunlardan bazıları; ETCD, Consul, ZooKeeper, Kubernetes. PostgreSQL üzerinde Autofailover araçlarından Patroni entegre edecekseniz DCS araçlarından birini kullanmanız gerekecek. DCS dediğimiz şey aslında Service Discovery araçlarından biri olduğundan bu iki tan...