{"id":7456,"date":"2017-02-19T10:44:12","date_gmt":"2017-02-19T09:44:12","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?page_id=7456"},"modified":"2025-04-04T12:52:40","modified_gmt":"2025-04-04T10:52:40","slug":"home-2","status":"publish","type":"page","link":"https:\/\/www.salvis.com\/blog\/","title":{"rendered":"Philipp Salvisberg&#8217;s Blog"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Philipp Salvisberg&#8217;s Blog<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database-centric development<\/p>\n\n\n<div class=\"column_filters\"><div class=\"blog_wrapper isotope_wrapper clearfix\"><div class=\"posts_group lm_wrapper element_classes col-2 classic\"><article class=\"post post-item isotope-item clearfix category-5 post-23948 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-oracle-26ai tag-sql\" style=\"\"><div class=\"date_label\">2026-08-29<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/29\/implicit-outer-joins-in-join-to-one-feature-or-flaw\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/08\/join-to-one-fork-labelled-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/08\/join-to-one-fork-labelled-1024x576.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/29\/implicit-outer-joins-in-join-to-one-feature-or-flaw\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-08-29<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/29\/implicit-outer-joins-in-join-to-one-feature-or-flaw\/\">Implicit Outer Joins in Join-to-One: Feature or Flaw?<\/a><\/h2><\/div><div class=\"post-excerpt\">Background As you probably know, I&#8217;m maintaining a parser for grammars used in SQL files for Oracle AI Database and PostgreSQL. As a result, I check for new statements and clauses in every version of those DBMSs. PostgreSQL typically adds new features only in major versions; this means yearly. Oracle, on the<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"icon-comment-empty-fa\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/29\/implicit-outer-joins-in-join-to-one-feature-or-flaw\/#respond\" class=\"post-comments\">0<\/a><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/29\/implicit-outer-joins-in-join-to-one-feature-or-flaw\/\" class=\"post-more\" title=\"Implicit Outer Joins in Join-to-One: Feature or Flaw?\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-23591 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-apexlang tag-code-analysis tag-dblinter tag-plsql tag-sql\" style=\"\"><div class=\"date_label\">2026-08-23<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/23\/the-checkbox-that-disables-tls\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/08\/the-checkbox-that-disables-tls-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/08\/the-checkbox-that-disables-tls-1024x576.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/23\/the-checkbox-that-disables-tls\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-08-23<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/23\/the-checkbox-that-disables-tls\/\">The Checkbox That Disables TLS<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction The dbLinter clients include a new setting named Allow Insecure TLS. It is disabled by default. As a result, all REST API calls verify the TLS certificate and hostname. The setting allows dbLinter to work in organisations that inspect TLS traffic using tools such as Zscaler. In larger organisations, arranging an<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"icon-comment-empty-fa\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/23\/the-checkbox-that-disables-tls\/#respond\" class=\"post-comments\">0<\/a><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/08\/23\/the-checkbox-that-disables-tls\/\" class=\"post-more\" title=\"The Checkbox That Disables TLS\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-21049 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-javascript tag-sql-developer tag-sqlcl\" style=\"\"><div class=\"date_label\">2026-07-25<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/07\/25\/the-return-of-sqlcls-script-command\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/07\/sqlcl-script-command-featured-concept-3-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/07\/sqlcl-script-command-featured-concept-3-1024x538.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/07\/25\/the-return-of-sqlcls-script-command\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-07-25<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/07\/25\/the-return-of-sqlcls-script-command\/\">The Return of SQLcl&#8217;s SCRIPT Command<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction The script command was introduced with SQLcl 4.2. It is based on JSR 223, the Java Scripting API, and makes it possible to run JavaScript from SQLcl. This adds client-side control flow, file access, better control of host commands and access to Java classes and JavaScript libraries. JDK 8 was the<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"icon-comment-empty-fa\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/07\/25\/the-return-of-sqlcls-script-command\/#comments\" class=\"post-comments\">2<\/a><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/07\/25\/the-return-of-sqlcls-script-command\/\" class=\"post-more\" title=\"The Return of SQLcl&#8217;s SCRIPT Command\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-19914 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-antlr tag-apexlang tag-code-analysis tag-dblinter\" style=\"\"><div class=\"date_label\">2026-06-29<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/29\/detecting-security-vulnerabilities-with-the-apexlang-parser\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/06\/APEXlang-Parser-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/06\/APEXlang-Parser-1024x538.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/29\/detecting-security-vulnerabilities-with-the-apexlang-parser\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-06-29<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/29\/detecting-security-vulnerabilities-with-the-apexlang-parser\/\">Detecting Security Vulnerabilities With the APEXlang Parser<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction A parser for the APEXlang grammar enables the development of tools beyond the scope of the APEXlang compiler included in SQLcl, SQL Developer for VS Code, and ORDS. These tools can perform static code analysis, convert code, generate documentation, and visualise different aspects of an APEX application. A linter, for example,<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"icon-comment-empty-fa\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/29\/detecting-security-vulnerabilities-with-the-apexlang-parser\/#respond\" class=\"post-comments\">0<\/a><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/29\/detecting-security-vulnerabilities-with-the-apexlang-parser\/\" class=\"post-more\" title=\"Detecting Security Vulnerabilities With the APEXlang Parser\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-19515 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-apexlang tag-dblinter\" style=\"\"><div class=\"date_label\">2026-06-19<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/19\/syntax-diagrams-for-apexlang\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/06\/apexlang-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/06\/apexlang-1024x538.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/19\/syntax-diagrams-for-apexlang\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-06-19<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/19\/syntax-diagrams-for-apexlang\/\">Syntax Diagrams for APEXlang<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction The APEXlang API Reference documentation went live a few days ago. You can also download the APEXlang EBNF grammar. In this post, Kris Rice explains the value of having an EBNF. Since the APEXlang grammar is available as EBNF, it can be used to generate syntax diagrams. These diagrams (also known<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"icon-comment-empty-fa\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/19\/syntax-diagrams-for-apexlang\/#comments\" class=\"post-comments\">3<\/a><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/06\/19\/syntax-diagrams-for-apexlang\/\" class=\"post-more\" title=\"Syntax Diagrams for APEXlang\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-16264 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-oracle-26ai tag-sql tag-sql-assertions tag-temporal-database tag-valid-time\" style=\"\"><div class=\"date_label\">2026-03-09<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/03\/09\/using-sql-assertions-to-enforce-temporal-data-integrity\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/03\/using-sql-assertions-to-enforce-temporal-data-integrity-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/03\/using-sql-assertions-to-enforce-temporal-data-integrity-1024x683.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/03\/09\/using-sql-assertions-to-enforce-temporal-data-integrity\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-03-09<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/03\/09\/using-sql-assertions-to-enforce-temporal-data-integrity\/\">Using SQL Assertions to Enforce Temporal Data Integrity<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction More than twelve years ago, I described the multi-temporal features of Oracle Database in this blog post. In the conclusion, I wrote that I missed a temporal DML API, temporal integrity constraints, temporal joins, and temporal aggregations. These features are still missing today. However, in the latest version of Oracle AI<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/03\/09\/using-sql-assertions-to-enforce-temporal-data-integrity\/\" class=\"post-more\" title=\"Using SQL Assertions to Enforce Temporal Data Integrity\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-15957 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-oracle-26ai tag-sql tag-sql-assertions\" style=\"\"><div class=\"date_label\">2026-02-23<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/02\/23\/enforcing-acyclic-hierarchies-with-sql-assertions\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/02\/sql-assertions-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/02\/sql-assertions-1024x683.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/02\/23\/enforcing-acyclic-hierarchies-with-sql-assertions\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-02-23<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/02\/23\/enforcing-acyclic-hierarchies-with-sql-assertions\/\">Enforcing Acyclic Hierarchies With SQL Assertions<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction Referential integrity constraints have been available since version 7 of the Oracle Database. While these constraints ensure that referenced rows exist, they cannot express more complex integrity rules that span multiple rows or tables. Check constraints are similarly limited, as they can only validate conditions on the columns of a single<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/02\/23\/enforcing-acyclic-hierarchies-with-sql-assertions\/\" class=\"post-more\" title=\"Enforcing Acyclic Hierarchies With SQL Assertions\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-14289 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-code-analysis tag-dblinter tag-plsql tag-sql tag-vscode\" style=\"\"><div class=\"date_label\">2026-01-02<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/01\/02\/fighting-bad-pl-sql-sql-with-vs-code\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/01\/fighting-bad-plsql-and-sql-with-vscode-knight-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2026\/01\/fighting-bad-plsql-and-sql-with-vscode-knight-1024x683.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2026\/01\/02\/fighting-bad-pl-sql-sql-with-vs-code\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2026-01-02<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2026\/01\/02\/fighting-bad-pl-sql-sql-with-vs-code\/\">Fighting Bad PL\/SQL &amp; SQL with VS Code<\/a><\/h2><\/div><div class=\"post-excerpt\">The success of a project or product depends largely on the quality of the code. But how can I improve security, maintainability or performance? More importantly, how can I prevent code with quality defects from entering production? In addition to testing, code analysis plays a central role. These days, code can be<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2026\/01\/02\/fighting-bad-pl-sql-sql-with-vs-code\/\" class=\"post-more\" title=\"Fighting Bad PL\/SQL &amp; SQL with VS Code\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-14035 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-plsql tag-sql\" style=\"\"><div class=\"date_label\">2025-10-15<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2025\/10\/15\/is-sysdate-deterministic-joelkallmanday\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2025\/09\/sysdate-deterministic-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"Is SYSDATE deterministic?\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2025\/09\/sysdate-deterministic-1024x683.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2025\/10\/15\/is-sysdate-deterministic-joelkallmanday\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2025-10-15<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2025\/10\/15\/is-sysdate-deterministic-joelkallmanday\/\">Is SYSDATE Deterministic? #JoelKallmanDay<\/a><\/h2><\/div><div class=\"post-excerpt\">TL;DR No, SYSDATE is not deterministic. However, it behaves very similarly to a deterministic function within an Oracle Database SQL statement. Background On a customer site, we used faketime on the OS to change the date and time for testing purposes. As long as you only travel forward in time, the Oracle<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2025\/10\/15\/is-sysdate-deterministic-joelkallmanday\/\" class=\"post-more\" title=\"Is SYSDATE Deterministic? #JoelKallmanDay\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><article class=\"post post-item isotope-item clearfix category-5 post-13988 type-post status-publish format-standard has-post-thumbnail hentry category-oracle tag-code-analysis tag-dblinter tag-sql\" style=\"\"><div class=\"date_label\">2025-07-12<\/div><div class=\"image_frame post-photo-wrapper scale-with-grid image\"><div class=\"image_wrapper\"><a href=\"https:\/\/www.salvis.com\/blog\/2025\/07\/12\/outer-joining-with-ansi-sql-89-and-sql-92\/\"><div class=\"mask\"><\/div><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2025\/07\/outer-joining-with-ansi-sql-89-and-sql-92-300x225.png\" class=\"scale-with-grid wp-post-image\" alt=\"Outer Joining With ANSI SQL-89 and SQL-92\" wpfc-lazyload-disable=\"true\" \/><\/a><div class=\"image_links double\"><a class=\"zoom \"  rel=\"prettyphoto\" href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2025\/07\/outer-joining-with-ansi-sql-89-and-sql-92-1024x683.png\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><circle cx=\"11.35\" cy=\"11.35\" r=\"6\" class=\"path\"><\/circle><line x1=\"15.59\" y1=\"15.59\" x2=\"20.65\" y2=\"20.65\" class=\"path\"><\/line><\/svg><\/a><a class=\"link \"  href=\"https:\/\/www.salvis.com\/blog\/2025\/07\/12\/outer-joining-with-ansi-sql-89-and-sql-92\/\"><svg viewBox=\"0 0 26 26\"><defs><style>.path{fill:none;stroke:#333;stroke-miterlimit:10;stroke-width:1.5px;}<\/style><\/defs><g><path d=\"M10.17,8.76l2.12-2.12a5,5,0,0,1,7.07,0h0a5,5,0,0,1,0,7.07l-2.12,2.12\" class=\"path\"><\/path><path d=\"M15.83,17.24l-2.12,2.12a5,5,0,0,1-7.07,0h0a5,5,0,0,1,0-7.07l2.12-2.12\" class=\"path\"><\/path><line x1=\"10.17\" y1=\"15.83\" x2=\"15.83\" y2=\"10.17\" class=\"path\"><\/line><\/g><\/svg><\/a><\/div><\/div><\/div><div class=\"post-desc-wrapper bg- has-custom-bg\" style=\"\"><div class=\"post-desc\"><div class=\"post-head\"><div class=\"post-meta clearfix\"><div class=\"author-date\"><span class=\"date\"><i class=\"icon-clock\"><\/i> <span class=\"post-date updated\">2025-07-12<\/span><\/span><\/div><div class=\"category\"><span class=\"cat-btn\">Categories <i class=\"icon-down-dir\" aria-hidden=\"true\"><\/i><\/span><div class=\"cat-wrapper\"><ul class=\"post-categories\">\n\t<li><a href=\"https:\/\/www.salvis.com\/blog\/category\/oracle\/\" rel=\"category tag\">Oracle<\/a><\/li><\/ul><\/div><\/div><\/div><\/div><div class=\"post-title\"><h2 class=\"entry-title \" itemprop=\"headline\"><a href=\"https:\/\/www.salvis.com\/blog\/2025\/07\/12\/outer-joining-with-ansi-sql-89-and-sql-92\/\">Outer Joining With ANSI SQL-89 and SQL-92<\/a><\/h2><\/div><div class=\"post-excerpt\">Introduction I recently implemented a quick fix for the rule G-3130 to transform queries to ANSI SQL-92 syntax. One of the challenges was to handle Oracle&#8217;s outer-join syntax (+). In ANSI SQL-89, join and filter criteria are part of the WHERE clause. It&#8217;s not easy to distinguish them. In this blog post,<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/div><div class=\"post-footer\"><div class=\"button-love\"><span class=\"love-text\">Do you like it?<\/span><\/div><div class=\"post-links\"><i class=\"read-more-icon icon-doc-text\" aria-hidden=\"true\"><\/i> <a href=\"https:\/\/www.salvis.com\/blog\/2025\/07\/12\/outer-joining-with-ansi-sql-89-and-sql-92\/\" class=\"post-more\" title=\"Outer Joining With ANSI SQL-89 and SQL-92\">Read more<\/a><\/div><\/div><\/div><\/div><\/article><\/div><div class=\"column one pager_wrapper\"><div class=\"pager\"><div class=\"pages\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/\" class=\"page active\">1<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/2\/\" class=\"page\">2<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/3\/\" class=\"page\">3<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/4\/\" class=\"page\">4<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/5\/\" class=\"page\">5<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/6\/\" class=\"page\">6<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/7\/\" class=\"page\">7<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/8\/\" class=\"page\">8<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/9\/\" class=\"page\">9<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/10\/\" class=\"page\">10<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/11\/\" class=\"page\">11<\/a><\/div><a rel=\"next\" class=\"next_page\" href=\"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/page\/2\/\">Next page<i class=\"icon-right-open\" aria-hidden=\"true\"><\/i><\/a><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Philipp Salvisberg&#8217;s Blog Database-centric development<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7456","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Philipp Salvisberg&#039;s Blog - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.\" \/>\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.salvis.com\/blog\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Philipp Salvisberg&#039;s Blog - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-04T10:52:40+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg's Blog - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"datePublished\":\"2017-02-19T09:44:12+00:00\",\"dateModified\":\"2025-04-04T10:52:40+00:00\",\"description\":\"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Philipp Salvisberg&#8217;s Blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Philipp Salvisberg's Blog - Philipp Salvisberg&#039;s Blog","description":"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.","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.salvis.com\/blog\/","og_locale":"en_US","og_type":"article","og_title":"Philipp Salvisberg's Blog - Philipp Salvisberg&#039;s Blog","og_description":"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.","og_url":"https:\/\/www.salvis.com\/blog\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_modified_time":"2025-04-04T10:52:40+00:00","twitter_card":"summary_large_image","twitter_site":"@phsalvisberg","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg's Blog - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"datePublished":"2017-02-19T09:44:12+00:00","dateModified":"2025-04-04T10:52:40+00:00","description":"Software development with JVM languages and the efficient use of relational databases. Focus on Oracle database related technologies and tools.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Philipp Salvisberg&#8217;s Blog"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=7456"}],"version-history":[{"count":36,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/revisions"}],"predecessor-version":[{"id":13907,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/pages\/7456\/revisions\/13907"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=7456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}