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,
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
Post a Comment