{"id":40513,"date":"2025-10-02T06:51:14","date_gmt":"2025-10-02T04:51:14","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=40513"},"modified":"2025-10-02T06:51:16","modified_gmt":"2025-10-02T04:51:16","slug":"from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/","title":{"rendered":"From Oracle&#8217;s PL\/SQL to PostgreSQL&#8217;s PL\/pgSQL &#8211; 1 &#8211; Basics"},"content":{"rendered":"\n<p>Migrating from one database system to another is not an easy task. It might be easy if you only need to migrate the data, but as soon as you have business logic in the database this can become a lot work quite fast. When you want to migrate from Oracle to PostgreSQL this means rewriting all your <a href=\"https:\/\/en.wikipedia.org\/wiki\/PL\/SQL\" target=\"_blank\" rel=\"noreferrer noopener\">PL\/SQL<\/a> code into something which PostgreSQL understands, and this usually is <a href=\"https:\/\/en.wikipedia.org\/wiki\/PL\/pgSQL\" target=\"_blank\" rel=\"noreferrer noopener\">PL\/pgSQL<\/a> as it is very close to PL\/SQL. Some might say that you mustn&#8217;t put any business logic into the database at all, but this is another discussion and will not be handled here or in any of the follow posts.<\/p>\n\n\n\n<p>There are some tools, such as <a href=\"https:\/\/ora2pg.darold.net\" target=\"_blank\" rel=\"noreferrer noopener\">ora2pg<\/a>, which give you some automatic translation from PL\/SQL to PL\/pgSQL, but you carefully have to check the result and go through all the code anyway. ora2pg gives you a great starting point, but the works begins after the automatic translation.<\/p>\n\n\n\n<p>In this first post, we&#8217;ll look into the very basics of both languages. The starting point in Oracle is this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nsqlplus sys@ora.it.dbi-services.com\/XEPDB1 as sysdba\ncreate user u\n    identified by u\n    default tablespace users\n    quota 10M on users\n    temporary tablespace temp;\ngrant create session to u;\ngrant create table to u;\ngrant create procedure to u;\nexit;\n\nsqlplus u@ora.it.dbi-services.com\/XEPDB1\ndrop table t2;\ndrop table t;\ncreate table t ( a number primary key , b number check ( b&gt; 10 ));\ncreate table t2 ( a number primary key, b number references t(a) );\ninsert into t (a,b) values (1,11);\ninsert into t (a,b) values (2,12);\ninsert into t2 (a,b) values (1,1);\ninsert into t2 (a,b) values (2,1);\ninsert into t2 (a,b) values (3,1);\ninsert into t2 (a,b) values (4,1);\ninsert into t2 (a,b) values (5,1);\ninsert into t2 (a,b) values (6,2);\ncommit;\n<\/pre><\/div>\n\n\n<p>This gives you a dedicated user which enough permissions to connect, create tables and procedures. This user is then used to create two simple tables connected by a foreign key constraint. While this is really simple, the following (and all follow up) examples are redacted and simplified real customer use cases.<\/p>\n\n\n\n<p>The procedure to be migrated is this one:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate or replace procedure p as\n  ln_count number;\nbegin\n  for i in ( select table_name\n                  , constraint_name\n               from user_constraints\n              where constraint_type =&#039;R&#039;\n                and status = &#039;ENABLED&#039; )\n  loop\n    execute immediate &#039;alter table &#039; || i.table_name || &#039; disable constraint &#039; || i.constraint_name;\n  end loop;\n  dbms_output.put_line ( &#039;Disabled foreign keys constraints&#039;);\n\n  select count(*)\n    into ln_count\n    from t2\n   where b = 2;\n\n  -- some more logic around counting\n  --\n\n  delete\n    from t\n   where a = 2;\n\n  delete\n    from t2\n   where b = 2;\n\n  commit;\n  dbms_output.put_line ( &#039;Commit done&#039;);\n\n  for i in ( select table_name\n                  , constraint_name\n               from user_constraints\n              where constraint_type =&#039;R&#039;\n                and status = &#039;ENABLED&#039; )\n  loop\n    execute immediate &#039;alter table &#039; || i.table_name || &#039; disable constraint &#039; || i.constraint_name;\n  end loop;\n  dbms_output.put_line ( &#039;Enabling foreign keys constraints&#039;);\n\n\n  exception\n    when others then\n      for i in ( select table_name\n                      , constraint_name\n                   from user_constraints\n                  where constraint_type =&#039;R&#039;\n                    and status = &#039;ENABLED&#039; )\n      loop\n        execute immediate &#039;alter table &#039; || i.table_name || &#039; disable constraint &#039; || i.constraint_name;\n      end loop;\n      dbms_output.put_line ( &#039;Enabling foreign key constraints&#039;);\n      raise_application_error(-50001, &#039;runtime_exception&#039;, true );\nend;\n\/\n<\/pre><\/div>\n\n\n<p>Again, this is very simplified and there was more code in the real procedure, but this is enough to talk about the topic of this post.<\/p>\n\n\n\n<p>When this procedure is executed we get the following result in Oracle:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&amp;gt; select * from t;\n\n         A          B\n---------- ----------\n         1         11\n\nSQL&amp;gt; select * from t2;\n\n         A          B\n---------- ----------\n         1          1\n         2          1\n         3          1\n         4          1\n         5          1\n<\/pre><\/div>\n\n\n<p>The starting point in PostgreSQL is this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n$ psql\ncreate user u with login password &#039;u&#039;;\ncreate schema u;\nalter schema u owner to u;\n\\c postgres u\nset search_path=u;\ncreate table t ( a int primary key, b int check ( b &gt; 10 ));\ncreate table t2 ( a int primary key, b int references t(a));\ninsert into t (a,b) values (1,11);\ninsert into t (a,b) values (2,12);\ninsert into t2 (a,b) values (1,1);\ninsert into t2 (a,b) values (2,1);\ninsert into t2 (a,b) values (3,1);\ninsert into t2 (a,b) values (4,1);\ninsert into t2 (a,b) values (5,1);\ninsert into t2 (a,b) values (6,2);\n<\/pre><\/div>\n\n\n<p>&#8230; which gives you pretty much the same as in Oracle (except for the schema and integer data types).<\/p>\n\n\n\n<p>Let&#8217;s start with migrating that procedure, step by step. The &#8220;create procedure&#8221; command in PostgreSQL works like this (there is a bit more, but it is the simplest form to start with):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncreate procedure p() as \n$$\ndeclare\nbegin\n  null;\nend; $$ language plpgsql;\n<\/pre><\/div>\n\n\n<p>PostgreSQL uses dollar quoting which saves you from constantly escaping special characters in strings, e.g.:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=&gt; select $$&quot;&quot;&quot;&quot;&#039;&#039;&#039;&#039;&#039;%%%&amp;&amp;&amp;&amp;&amp;$$;\n     ?column?      \n-------------------\n &quot;&quot;&quot;&quot;&#039;&#039;&#039;&#039;&#039;%%%&amp;&amp;&amp;&amp;&amp;\n(1 row)\n<\/pre><\/div>\n\n\n<p>If you have the &#8220;$&#8221; sign itself in the string you can use tags ($xx$ in the example below):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=&gt; select $xx$&quot;&quot;&quot;&quot;$$&#039;&#039;&#039;&#039;&#039;%%%&amp;&amp;&amp;&amp;&amp;$xx$;\n      ?column?       \n---------------------\n &quot;&quot;&quot;&quot;$$&#039;&#039;&#039;&#039;&#039;%%%&amp;&amp;&amp;&amp;&amp;\n(1 row)\n<\/pre><\/div>\n\n\n<p>The same concept is used for the body (code) of user defined functions and procedures.<\/p>\n\n\n\n<p>&#8220;language&#8221; tells PostgreSQL which language you&#8217;re writing the code in, here we use <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\" target=\"_blank\" rel=\"noreferrer noopener\">PL\/pgSQL<\/a> but this could also be <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plpython.html\">Python<\/a>, <a href=\"https:\/\/www.postgresql.org\/docs\/current\/plperl.html\">Perl<\/a> or <a href=\"https:\/\/www.postgresql.org\/docs\/current\/pltcl.html\">Tcl<\/a> in a typical PostgreSQL installation (<a href=\"https:\/\/wiki.postgresql.org\/wiki\/PL_Matrix\">more languages<\/a> are available as external extensions).<\/p>\n\n\n\n<p>The &#8220;declare&#8221; block is used to declare variables you want to use in the code (more on that in a later post) and &#8220;begin&#8221; and &#8220;end&#8221; wraps the actual code.<\/p>\n\n\n\n<p>Now, that we know the basic building blocks we can go further and start to code the procedure so that it is doing the same as the procedure in PL\/SQL. This is the topic for the next post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Migrating from one database system to another is not an easy task. It might be easy if you only need to migrate the data, but as soon as you have business logic in the database this can become a lot work quite fast. When you want to migrate from Oracle to PostgreSQL this means rewriting [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198],"tags":[77],"type_dbi":[],"class_list":["post-40513","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","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>From Oracle&#039;s PL\/SQL to PostgreSQL&#039;s PL\/pgSQL - 1 - Basics - 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\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From Oracle&#039;s PL\/SQL to PostgreSQL&#039;s PL\/pgSQL - 1 - Basics\" \/>\n<meta property=\"og:description\" content=\"Migrating from one database system to another is not an easy task. It might be easy if you only need to migrate the data, but as soon as you have business logic in the database this can become a lot work quite fast. When you want to migrate from Oracle to PostgreSQL this means rewriting [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-02T04:51:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-02T04:51:16+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=\"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\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"From Oracle&#8217;s PL\/SQL to PostgreSQL&#8217;s PL\/pgSQL &#8211; 1 &#8211; Basics\",\"datePublished\":\"2025-10-02T04:51:14+00:00\",\"dateModified\":\"2025-10-02T04:51:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\"},\"wordCount\":508,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\",\"name\":\"From Oracle's PL\/SQL to PostgreSQL's PL\/pgSQL - 1 - Basics - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2025-10-02T04:51:14+00:00\",\"dateModified\":\"2025-10-02T04:51:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From Oracle&#8217;s PL\/SQL to PostgreSQL&#8217;s PL\/pgSQL &#8211; 1 &#8211; Basics\"}]},{\"@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":"From Oracle's PL\/SQL to PostgreSQL's PL\/pgSQL - 1 - Basics - 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\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/","og_locale":"en_US","og_type":"article","og_title":"From Oracle's PL\/SQL to PostgreSQL's PL\/pgSQL - 1 - Basics","og_description":"Migrating from one database system to another is not an easy task. It might be easy if you only need to migrate the data, but as soon as you have business logic in the database this can become a lot work quite fast. When you want to migrate from Oracle to PostgreSQL this means rewriting [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/","og_site_name":"dbi Blog","article_published_time":"2025-10-02T04:51:14+00:00","article_modified_time":"2025-10-02T04:51:16+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"From Oracle&#8217;s PL\/SQL to PostgreSQL&#8217;s PL\/pgSQL &#8211; 1 &#8211; Basics","datePublished":"2025-10-02T04:51:14+00:00","dateModified":"2025-10-02T04:51:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/"},"wordCount":508,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/","url":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/","name":"From Oracle's PL\/SQL to PostgreSQL's PL\/pgSQL - 1 - Basics - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2025-10-02T04:51:14+00:00","dateModified":"2025-10-02T04:51:16+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/from-oracles-pl-sql-to-postgresqls-pl-pgsql-1-basics\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"From Oracle&#8217;s PL\/SQL to PostgreSQL&#8217;s PL\/pgSQL &#8211; 1 &#8211; Basics"}]},{"@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\/40513","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=40513"}],"version-history":[{"count":13,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/40513\/revisions"}],"predecessor-version":[{"id":40638,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/40513\/revisions\/40638"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=40513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=40513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=40513"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=40513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}