{"id":11312,"date":"2018-06-02T10:38:34","date_gmt":"2018-06-02T08:38:34","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/"},"modified":"2023-06-09T16:57:23","modified_gmt":"2023-06-09T14:57:23","slug":"postgresql-11-procedures-are-coming","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/","title":{"rendered":"PostgreSQL 11 :  Procedures are coming"},"content":{"rendered":"<p><strong>By Mouhamadou Diaw<\/strong><\/p>\n<p>Reading about new features about future version PostgreSQL 11. I see that procedures will be implemented. Why is it so important? Until now only functions are available in PostgtreSQL. Of course a function is a procedure that returns a value, we can say, yes it\u2019s true but you cannot manage transactions in a function. To better understand let\u2019s do a quick demonstration.<br \/>\nNote that I am using the snapshot developer version of PostgreSQL 11 .<\/p>\n<div>\n<div id=\"highlighter_799765\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">[postgres@pg_essentials_p1 bin]$ .\/psql<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql color1\">Null<\/code> <code class=\"sql plain\">display <\/code><code class=\"sql keyword\">is<\/code> <code class=\"sql string\">\"NULL\"<\/code><code class=\"sql plain\">.<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql plain\">psql (11devel)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql plain\">Type <\/code><code class=\"sql string\">\"help\"<\/code> <code class=\"sql keyword\">for<\/code> <code class=\"sql plain\">help.<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [postgres] &gt; <\/code><code class=\"sql keyword\">select<\/code> <code class=\"sql plain\">version();<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"sql plain\">version<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql comments\">--------------------------------------------------------------------------------<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql comments\">---------------------------<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">PostgreSQL 11devel <\/code><code class=\"sql keyword\">on<\/code> <code class=\"sql plain\">x86_64-pc-linux-gnu, compiled <\/code><code class=\"sql keyword\">by<\/code> <code class=\"sql plain\">gcc (GCC) 4.8.5 20150623<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">(Red Hat 4.8.5-4), 64-<\/code><code class=\"sql keyword\">bit<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"sql plain\">(1 row)<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [postgres] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For the demonstration I have a table emp<\/p>\n<div>\n<div id=\"highlighter_541551\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">table<\/code> <code class=\"sql plain\">emp;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">id | <\/code><code class=\"sql keyword\">name<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql comments\">----+------<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">1 | toto<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">2 | Edge<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql plain\">(2 <\/code><code class=\"sql keyword\">rows<\/code><code class=\"sql plain\">)<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And let\u2019s say I want to insert data in my table using following function<\/p>\n<div>\n<div id=\"highlighter_512583\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql keyword\">CREATE<\/code> <code class=\"sql color1\">or<\/code> <code class=\"sql color2\">replace<\/code> <code class=\"sql keyword\">FUNCTION<\/code> <code class=\"sql plain\">fun_insert_emp(id_emp <\/code><code class=\"sql keyword\">int<\/code><code class=\"sql plain\">,\u00a0 emp_name <\/code><code class=\"sql keyword\">varchar<\/code><code class=\"sql plain\">(20))<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">RETURNS<\/code>\u00a0 <code class=\"sql plain\">void <\/code><code class=\"sql keyword\">AS<\/code> <code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql keyword\">BEGIN<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">insert<\/code> <code class=\"sql keyword\">into<\/code> <code class=\"sql plain\">emp (id,<\/code><code class=\"sql keyword\">name<\/code><code class=\"sql plain\">) <\/code><code class=\"sql keyword\">values<\/code> <code class=\"sql plain\">(id_emp,emp_name);<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql keyword\">commit<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql keyword\">END<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql plain\">LANGUAGE PLPGSQL;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>We can describe the function like this<\/p>\n<div>\n<div id=\"highlighter_528498\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;\u00a0 sf\u00a0 fun_insert_emp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql keyword\">CREATE<\/code> <code class=\"sql color1\">OR<\/code> <code class=\"sql color2\">REPLACE<\/code> <code class=\"sql keyword\">FUNCTION<\/code> <code class=\"sql keyword\">public<\/code><code class=\"sql plain\">.fun_insert_emp(id_emp <\/code><code class=\"sql keyword\">integer<\/code><code class=\"sql plain\">, emp_name <\/code><code class=\"sql keyword\">character<\/code> <code class=\"sql keyword\">varying<\/code><code class=\"sql plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">RETURNS<\/code> <code class=\"sql plain\">void<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">LANGUAGE plpgsql<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql keyword\">AS<\/code> <code class=\"sql plain\">$<\/code><code class=\"sql keyword\">function<\/code><code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql keyword\">BEGIN<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">insert<\/code> <code class=\"sql keyword\">into<\/code> <code class=\"sql plain\">emp (id,<\/code><code class=\"sql keyword\">name<\/code><code class=\"sql plain\">) <\/code><code class=\"sql keyword\">values<\/code> <code class=\"sql plain\">(id_emp,emp_name);<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql keyword\">commit<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql keyword\">END<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql plain\">$<\/code><code class=\"sql keyword\">function<\/code><code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To call a function we use a select like any built-in function. So let\u2019s try to insert a new employee with the function<\/p>\n<div>\n<div id=\"highlighter_549556\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">select<\/code> <code class=\"sql plain\">fun_insert_emp(3,<\/code><code class=\"sql string\">'New Emp'<\/code><code class=\"sql plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql plain\">ERROR:\u00a0 invalid <\/code><code class=\"sql keyword\">transaction<\/code> <code class=\"sql plain\">termination<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql plain\">CONTEXT:\u00a0 PL\/pgSQL <\/code><code class=\"sql keyword\">function<\/code> <code class=\"sql plain\">fun_insert_emp(<\/code><code class=\"sql keyword\">integer<\/code><code class=\"sql plain\">,<\/code><code class=\"sql keyword\">character<\/code> <code class=\"sql keyword\">varying<\/code><code class=\"sql plain\">) line 4 <\/code><code class=\"sql keyword\">at<\/code> <code class=\"sql keyword\">COMMIT<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Seems that the word COMMIT is causing trouble. OK let\u2019s recreate the function without the COMMIT<\/p>\n<div>\n<div id=\"highlighter_586494\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;\u00a0 sf\u00a0 fun_insert_emp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql keyword\">CREATE<\/code> <code class=\"sql color1\">OR<\/code> <code class=\"sql color2\">REPLACE<\/code> <code class=\"sql keyword\">FUNCTION<\/code> <code class=\"sql keyword\">public<\/code><code class=\"sql plain\">.fun_insert_emp(id_emp <\/code><code class=\"sql keyword\">integer<\/code><code class=\"sql plain\">, emp_name <\/code><code class=\"sql keyword\">character<\/code> <code class=\"sql keyword\">varying<\/code><code class=\"sql plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">RETURNS<\/code> <code class=\"sql plain\">void<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">LANGUAGE plpgsql<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql keyword\">AS<\/code> <code class=\"sql plain\">$<\/code><code class=\"sql keyword\">function<\/code><code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql keyword\">BEGIN<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql keyword\">insert<\/code> <code class=\"sql keyword\">into<\/code> <code class=\"sql plain\">emp (id,<\/code><code class=\"sql keyword\">name<\/code><code class=\"sql plain\">) <\/code><code class=\"sql keyword\">values<\/code> <code class=\"sql plain\">(id_emp,emp_name);<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql keyword\">END<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql plain\">$<\/code><code class=\"sql keyword\">function<\/code><code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And let\u2019s call again the function. We can see that the row was inserted<\/p>\n<div>\n<div id=\"highlighter_477139\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">select<\/code> <code class=\"sql plain\">fun_insert_emp(3,<\/code><code class=\"sql string\">'New Emp'<\/code><code class=\"sql plain\">);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql plain\">fun_insert_emp<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql comments\">----------------<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql plain\">(1 row)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">table<\/code> <code class=\"sql plain\">emp;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">id |\u00a0 <\/code><code class=\"sql keyword\">name<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql comments\">----+---------<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">1 | toto<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">2 | Edge<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">3 | New Emp<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"sql plain\">(3 <\/code><code class=\"sql keyword\">rows<\/code><code class=\"sql plain\">)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>But the main problem we saw is that a function in PostgreSQL does not support any transaction instruction (BEGIN\u2026COMMIT, BEGIN\u2026ROLLBACK). This means that in a function I cannot use instructions that allow to rollback or commit based on some conditions.<br \/>\nBut PostgreSQL 11 will support procedure. Let\u2019s do again the demonstration with a procedure.<br \/>\nLet\u2019s first create the procedure<\/p>\n<div>\n<div id=\"highlighter_822695\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">create<\/code> <code class=\"sql color1\">or<\/code> <code class=\"sql color2\">replace<\/code> <code class=\"sql keyword\">procedure<\/code> <code class=\"sql plain\">proc_insert_emp (id_emp <\/code><code class=\"sql keyword\">int<\/code><code class=\"sql plain\">,\u00a0 emp_name <\/code><code class=\"sql keyword\">varchar<\/code><code class=\"sql plain\">(20))<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql plain\">test-# <\/code><code class=\"sql keyword\">as<\/code> <code class=\"sql plain\">$<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"sql plain\">test$# <\/code><code class=\"sql keyword\">Begin<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql plain\">test$# <\/code><code class=\"sql keyword\">insert<\/code> <code class=\"sql keyword\">into<\/code> <code class=\"sql plain\">emp (id,<\/code><code class=\"sql keyword\">name<\/code><code class=\"sql plain\">) <\/code><code class=\"sql keyword\">values<\/code> <code class=\"sql plain\">(id_emp,emp_name);<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql plain\">test$# <\/code><code class=\"sql keyword\">commit<\/code><code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql plain\">test$# <\/code><code class=\"sql keyword\">end<\/code> <code class=\"sql plain\">;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql plain\">test$# $<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql plain\">test-# LANGUAGE PLPGSQL;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql keyword\">CREATE<\/code> <code class=\"sql keyword\">PROCEDURE<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And let\u2019s insert a new row in table emp using proc_insert_emp<\/p>\n<div>\n<div id=\"highlighter_310828\" class=\"syntaxhighlighter  sql\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; call\u00a0 proc_insert_emp(4,<\/code><code class=\"sql string\">'Brice'<\/code><code class=\"sql plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"sql plain\">CALL<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt; <\/code><code class=\"sql keyword\">table<\/code> <code class=\"sql plain\">emp;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"sql spaces\">\u00a0<\/code><code class=\"sql plain\">id |\u00a0 <\/code><code class=\"sql keyword\">name<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"sql comments\">----+---------<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">1 | toto<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">2 | Edge<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">3 | New Emp<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"sql spaces\">\u00a0\u00a0<\/code><code class=\"sql plain\">4 | Brice<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"sql plain\">(4 <\/code><code class=\"sql keyword\">rows<\/code><code class=\"sql plain\">)<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"sql plain\">(postgres@[<\/code><code class=\"sql keyword\">local<\/code><code class=\"sql plain\">]:5432) [test] &gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>We can see that the row was inserted. But the main difference is the support of autonomous transaction and this will be definitively change life for developers.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Mouhamadou Diaw Reading about new features about future version PostgreSQL 11. I see that procedures will be implemented. Why is it so important? Until now only functions are available in PostgtreSQL. Of course a function is a procedure that returns a value, we can say, yes it\u2019s true but you cannot manage transactions in [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[1369],"type_dbi":[],"class_list":["post-11312","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-procedures-postgresql-11"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL 11 : Procedures are coming - dbi Blog<\/title>\n<meta name=\"description\" content=\"postgresql 11, procedures\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 11 : Procedures are coming\" \/>\n<meta property=\"og:description\" content=\"postgresql 11, procedures\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-02T08:38:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-09T14:57:23+00:00\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"PostgreSQL 11 : Procedures are coming\",\"datePublished\":\"2018-06-02T08:38:34+00:00\",\"dateModified\":\"2023-06-09T14:57:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\"},\"wordCount\":270,\"commentCount\":0,\"keywords\":[\"Procedures postgresql 11\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\",\"name\":\"PostgreSQL 11 : Procedures are coming - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2018-06-02T08:38:34+00:00\",\"dateModified\":\"2023-06-09T14:57:23+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"description\":\"postgresql 11, procedures\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 11 : Procedures are coming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL 11 : Procedures are coming - dbi Blog","description":"postgresql 11, procedures","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 11 : Procedures are coming","og_description":"postgresql 11, procedures","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/","og_site_name":"dbi Blog","article_published_time":"2018-06-02T08:38:34+00:00","article_modified_time":"2023-06-09T14:57:23+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"PostgreSQL 11 : Procedures are coming","datePublished":"2018-06-02T08:38:34+00:00","dateModified":"2023-06-09T14:57:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/"},"wordCount":270,"commentCount":0,"keywords":["Procedures postgresql 11"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/","name":"PostgreSQL 11 : Procedures are coming - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2018-06-02T08:38:34+00:00","dateModified":"2023-06-09T14:57:23+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"description":"postgresql 11, procedures","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-11-procedures-are-coming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 11 : Procedures are coming"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=11312"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11312\/revisions"}],"predecessor-version":[{"id":25769,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11312\/revisions\/25769"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=11312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=11312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=11312"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=11312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}