{"id":15607,"date":"2021-02-10T12:30:14","date_gmt":"2021-02-10T11:30:14","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/"},"modified":"2021-02-10T12:30:14","modified_gmt":"2021-02-10T11:30:14","slug":"an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/","title":{"rendered":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures"},"content":{"rendered":"<p>In the first to posts in this series (<a href=\"https:\/\/www.dbi-services.com\/blog\/an-introduction-to-server-side-programming-in-postgresql-1-sql-functions-basics\/\" target=\"_blank\" rel=\"noopener\">An introduction into server side programming in PostgreSQL \u2013 1 \u2013 SQL functions, basics <\/a>, <a href=\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-2-sql-functions-sets-udts-and-polymorphic-types\/\" target=\"_blank\" rel=\"noopener\">An introduction into server side programming in PostgreSQL \u2013 2 \u2013 SQL functions, sets, udts and polymorphic types <\/a>) we had a look at SQL functions and how you can use them to return data for everything that is a SQL statement. If you can do it in SQL, you should do it in SQL. If you can&#8217;t, well, then there is <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\" target=\"_blank\" rel=\"noopener\">PL\/pgSQL<\/a>. For those of you who know Oracle, PL\/pgSQL is very similar to <a href=\"https:\/\/www.oracle.com\/database\/technologies\/application-development-pl\/sql.html\" target=\"_blank\" rel=\"noopener\">PL\/SQL<\/a>. There are differences, of course. One of the differences is, that PL\/pgSQL does not know the concept of a <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/lnpls\/plsql-packages.html\" target=\"_blank\" rel=\"noopener\">package<\/a>. Let&#8217;s have a look, what you can do with PL\/pgSQL at a very basic level in this post. The next post will go a step further and dig into more advanced use cases for PL\/pgSQL.<br \/>\n<!--more--><\/p>\n<p>When it comes to procedural languages in PostgreSQL you have two choices (since PostgreSQL 11) to implement logic in the database:<\/p>\n<ul>\n<li>Functions: Can have in and out parameters and must have a return type declared. There is no transaction control inside functions. Functions can be called in SQL statements.<\/li>\n<li>Procedures: Can have in and inout parameters but do not return any value. There can be transaction control inside procedures. Procedure are executed with the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-call.html\" target=\"_blank\" rel=\"noopener\">&#8220;call&#8221;<\/a> statement and can not be used in SQL.<\/li>\n<\/ul>\n<p>Because we already created many functions in the last two posts, we&#8217;ll start with procedures in this post. One one of the most simple procedure you can have is something like this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create or replace procedure p1()\n           as \n           $$\n           declare\n           begin\n             raise notice 'My first procedure';\n           end; \n           $$ language plpgsql;\n<\/pre>\n<p>All this procedure does, is printing a simple text to the screen by using <a href=\"https:\/\/www.postgresql.org\/docs\/13\/plpgsql-errors-and-messages.html\" target=\"_blank\" rel=\"noopener\">&#8220;raise&#8221;<\/a>. Once you execute the procedure, you&#8217;ll see the message on the screen:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# call p1();\nNOTICE:  My first procedure\nCALL\n<\/pre>\n<p>Parameters with procedures can be either IN or INOUT (out is currently not supported). <\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create or replace procedure p2(pv_text in text, pv_dummy inout text)\n           as \n           $$\n           declare\n           begin\n             raise notice 'My first procedure %', pv_text;\n           end; \n           $$ language plpgsql;\nCREATE PROCEDURE\n<\/pre>\n<p>Because you cannot just call a procedure with a SELECT statement, you need to wrap the call statement e.g. into an anonymous code block:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# do $$\n           declare\n             lv_dummy text := 'bbb';\n           begin\n             call p2(pv_text=&gt;'aaa', pv_dummy=&gt;lv_dummy);\n             raise notice 'the second parameter is %', lv_dummy;\n           end; $$;\nNOTICE:  My first procedure aaa\nNOTICE:  the second parameter is bbb\nDO\n<\/pre>\n<p>I&#8217;ve said initially that you can have transaction control within procedures. Something like this is possible:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create table t1 ( a int );\nCREATE TABLE\npostgres=# create or replace procedure p3()\n           as \n           $$\n           declare\n             ln int := 1;\n           begin\n             insert into t1 values (ln);\n             ln := ln + 1;\n             commit;\n             insert into t1 values (ln);\n             rollback; \n           end;\n           $$ language plpgsql;\nCREATE PROCEDURE\n<\/pre>\n<p>Executing this procedure leads to only one row in the t1 table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# call p3();\nCALL\npostgres=# select * from t1;\n a \n---\n 1\n(1 row)\n<\/pre>\n<p>If you are already in a transaction when you call the procedure, it will not work:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# begin;\nBEGIN\npostgres=*# call p3();\nERROR:  invalid transaction termination\nCONTEXT:  PL\/pgSQL function p3() line 7 at COMMIT\npostgres=!# \n<\/pre>\n<p><a href=\"\" target=\"_blank\" rel=\"noopener\">Savepoints<\/a> can also not be used within a procedure:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create or replace procedure p3()\n           as \n           $$\n           declare\n             ln int := 1;\n           begin\n             insert into t1 values (ln);\n             ln := ln + 1;\n             savepoint sp1;\n             insert into t1 values (ln);\n             rollback to sp1; \n           end;\n           $$ language plpgsql;\nERROR:  syntax error at or near \"to\"\nLINE 11:              rollback to sp1; \n<\/pre>\n<p>It seems a bit strange that &#8220;savepoint&#8221; is actually fine, but &#8220;rollback to&#8221; is not accepted as valid syntax. The documentation is not very clear about this, but in fact you can find it documented <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql-porting.html\" target=\"_blank\" rel=\"noopener\">here<\/a>. That means you can get this behavior if you do it like this (when others is of course not the right thing to do here, as you cannot be sure what actually happened):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# truncate t1;\nTRUNCATE TABLE\npostgres=# create or replace procedure p4()\n           as \n           $$\n           declare\n             ln int := 1;\n           begin\n             insert into t1 values (ln);\n             ln := ln + 1;\n             begin\n               insert into t1 values ('aaa');\n             exception when others then null;\n             end;\n             commit;\n           end;\n           $$ language plpgsql;\nCREATE PROCEDURE\npostgres=# call p4();\nCALL\npostgres=# select * from t1;\n a \n---\n 1\n(1 row)\n<\/pre>\n<p>Calling one procedure from another procedure (or function) of course works and is supported:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create or replace procedure p5()\n           as $$\n           begin\n               call p4();\n           end; $$ language plpgsql;\nCREATE PROCEDURE\npostgres=# call p5();\nCALL\n<\/pre>\n<p>As with SQL functions you can use all the data types PostgreSQL is supporting, including data types you created on your own. Key point now: If you need transaction control, go for procedures as this is not supported with functions. In the next post we&#8217;ll look into PL\/pgSQL functions and the control structures that come with PL\/pgSQL.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the first to posts in this series (An introduction into server side programming in PostgreSQL \u2013 1 \u2013 SQL functions, basics , An introduction into server side programming in PostgreSQL \u2013 2 \u2013 SQL functions, sets, udts and polymorphic types ) we had a look at SQL functions and how you can use them [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-15607","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"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>An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures - dbi Blog<\/title>\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\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures\" \/>\n<meta property=\"og:description\" content=\"In the first to posts in this series (An introduction into server side programming in PostgreSQL \u2013 1 \u2013 SQL functions, basics , An introduction into server side programming in PostgreSQL \u2013 2 \u2013 SQL functions, sets, udts and polymorphic types ) we had a look at SQL functions and how you can use them [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-10T11:30:14+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 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\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures\",\"datePublished\":\"2021-02-10T11:30:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\"},\"wordCount\":544,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\",\"name\":\"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2021-02-10T11:30:14+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures\"}]},{\"@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\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures - dbi Blog","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\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/","og_locale":"en_US","og_type":"article","og_title":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures","og_description":"In the first to posts in this series (An introduction into server side programming in PostgreSQL \u2013 1 \u2013 SQL functions, basics , An introduction into server side programming in PostgreSQL \u2013 2 \u2013 SQL functions, sets, udts and polymorphic types ) we had a look at SQL functions and how you can use them [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/","og_site_name":"dbi Blog","article_published_time":"2021-02-10T11:30:14+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures","datePublished":"2021-02-10T11:30:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/"},"wordCount":544,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/","url":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/","name":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2021-02-10T11:30:14+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/an-introduction-into-server-side-programming-in-postgresql-3-pl-pgsql-procedures\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"An introduction into server side programming in PostgreSQL \u2013 3 \u2013 PL\/pgSQL, procedures"}]},{"@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\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/15607","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\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=15607"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/15607\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=15607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=15607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=15607"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=15607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}