{"id":13386,"date":"2024-06-15T20:45:43","date_gmt":"2024-06-15T18:45:43","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=13386"},"modified":"2024-12-06T13:04:47","modified_gmt":"2024-12-06T12:04:47","slug":"islandsql-episode-8-whats-new-in-oracle-database-23-4","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/","title":{"rendered":"IslandSQL Episode 8: What&#8217;s New in Oracle Database 23.4?"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In the <a href=\"https:\/\/www.salvis.com\/blog\/2024\/03\/23\/islandsql-episode-7-dml-statements-in-postgresql-16-and-what-i-miss-in-oracle-database-23c\/\">last episode<\/a>, we looked at some features in PostgreSQL which I miss in the Oracle Database. The <a href=\"https:\/\/github.com\/IslandSQL\/IslandSQL\">IslandSQL<\/a> grammar now covers PL\/SQL and the related DDL statements. The implementation was more complex than expected, mainly because of the incompatibilities between PostgreSQL and the Oracle Database. I will probably deal with this topic in a future blog post.<\/p>\n\n\n\n<p>Now I&#8217;d like to talk about the new features in Oracle Database 23ai. Not about all features in the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/nfcoa\/introduction.html#GUID-feature_highlights142\">New Features Guide<\/a>, but only about some changes since the release of 23.3, which was known as 23c. It&#8217;s hard to find changes from 23.3 to 23.4 in the documentation. So, I guess it&#8217;s worth a blog post. I focus on the features that are relevant to the IslandSQL grammar. In other words, the interesting ones from a developer&#8217;s perspective.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Vector Data Type<\/h2>\n\n\n\n<p>A vector is a number array for which you can optionally define the number of dimensions (size) and the data type (int8, float32 or float64) of the dimension values. This data type is the basis for the vector search functionality.<\/p>\n\n\n\n<p>Here&#8217;s a slightly amended example from the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/vecse\/insert-vectors-database-table-using-insert-statement.html\">documentation<\/a> creating and populating a table with a vector data type.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">1) Table with vector column<\/span><span role=\"button\" tabindex=\"0\" data-code=\"drop table if exists galaxies purge;\ncreate table galaxies (\n   id        number             not null primary key,\n   name      varchar2(10 char)  not null unique,\n   embedding vector(5, int8)    not null, -- 5 dimensions, stored as int8\n   doc       varchar2(120 char) not null\n);\n\ninsert into galaxies \n   (id, name, embedding, doc)\nvalues \n   (1, 'M31',     '[0,2,2,0,0]', 'Messier 31 is a barred spiral galaxy in the Andromeda constellation which has a lot of barred spiral galaxies.'),\n   (2, 'M33',     '[0,0,1,0,0]', 'Messier 33 is a spiral galaxy in the Triangulum constellation.'),\n   (3, 'M58',     '[1,1,1,0,0]', 'Messier 58 is an intermediate barred spiral galaxy in the Virgo constellation.'),\n   (4, 'M63',     '[0,0,1,0,0]', 'Messier 63 is a spiral galaxy in the Canes Venatici constellation.'),\n   (5, 'M77',     '[0,1,1,0,0]', 'Messier 77 is a barred spiral galaxy in the Cetus constellation.'),\n   (6, 'M91',     '[0,1,1,0,0]', 'Messier 91 is a barred spiral galaxy in the Coma Berenices constellation.'),\n   (7, 'M49',     '[0,0,0,1,1]', 'Messier 49 is a giant elliptical galaxy in the Virgo constellation.'),\n   (8, 'M60',     '[0,0,0,0,1]', 'Messier 60 is an elliptical galaxy in the Virgo constellation.'),\n   (9, 'NGC1073', '[0,1,1,0,0]', 'NGC 1073 is a barred spiral galaxy in Cetus constellation.');\ncommit;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">drop<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">exists<\/span><span style=\"color: #D4D4D4\"> galaxies purge;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">create<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> galaxies (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   id        <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">primary key<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">)  <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">unique<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   embedding vector(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, int8)    <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #6A9955\">-- 5 dimensions, stored as int8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   doc       <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">120<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">into<\/span><span style=\"color: #D4D4D4\"> galaxies <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (id, <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, embedding, doc)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">values<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M31&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,2,2,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 31 is a barred spiral galaxy in the Andromeda constellation which has a lot of barred spiral galaxies.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M33&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,0,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 33 is a spiral galaxy in the Triangulum constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M58&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[1,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 58 is an intermediate barred spiral galaxy in the Virgo constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M63&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,0,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 63 is a spiral galaxy in the Canes Venatici constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M77&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 77 is a barred spiral galaxy in the Cetus constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M91&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 91 is a barred spiral galaxy in the Coma Berenices constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M49&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,0,0,1,1]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 49 is a giant elliptical galaxy in the Virgo constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;M60&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #CE9178\">&#39;[0,0,0,0,1]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;Messier 60 is an elliptical galaxy in the Virgo constellation.&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   (<\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;NGC1073&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;NGC 1073 is a barred spiral galaxy in Cetus constellation.&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The vector in this example has 5 dimensions with the following meaning:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Number of occurrences of <code>intermediate<\/code> in the <code>doc<\/code> column<\/li>\n\n\n\n<li>Number of occurrences of <code>barred<\/code> in the <code>doc<\/code> column<\/li>\n\n\n\n<li>Number of occurrences of <code>spiral<\/code> in the <code>doc<\/code> column<\/li>\n\n\n\n<li>Number of occurrences of <code>giant<\/code> in the <code>doc<\/code> column<\/li>\n\n\n\n<li>Number of occurrences of <code>elliptical<\/code> in the <code>doc<\/code> column<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">2. Vector Functions and PL\/SQL Packages<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_distance.html#GUID-BA4BCFB2-D905-43DC-87B0-E53522CF07B7\">vector_distance<\/a> function is a key functionality for similarity searches. Let&#8217;s say we want to see galaxies that are similar to <code>NGC1073<\/code> (<code>barred<\/code> and <code>spiral<\/code>). The following query shows how vector functions can help to get this result:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">2) Different vector_distance metrics in action<\/span><span role=\"button\" tabindex=\"0\" data-code=\"with ngc1073 as (select vector('[0,1,1,0,0]', 5, int8) as query_vector)\nselect name, \n       round(vector_distance(embedding, query_vector, cosine), 3) as cosine_distance,\n       round(vector_distance(embedding, query_vector, dot), 3) as inner_product,\n       round(vector_distance(embedding, query_vector, euclidean), 3) as l2_distance,\n       round(vector_distance(embedding, query_vector, euclidean_squared), 3) as l2_squared,\n       round(vector_distance(embedding, query_vector, hamming), 3) as hamming_distance,\n       round(vector_distance(embedding, query_vector, manhattan), 3) as l1_distance\n  from galaxies, ngc1073\n order by cosine_distance;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> ngc1073 <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> vector(<\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, int8) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> query_vector)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, cosine), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> cosine_distance,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, dot), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> inner_product,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, euclidean), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> l2_distance,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, euclidean_squared), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> l2_squared,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, hamming), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> hamming_distance,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(vector_distance(embedding, query_vector, manhattan), <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> l1_distance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> galaxies, ngc1073<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> cosine_distance;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"NAME       COSINE_DISTANCE INNER_PRODUCT L2_DISTANCE L2_SQUARED HAMMING_DISTANCE L1_DISTANCE\n---------- --------------- ------------- ----------- ---------- ---------------- -----------\nM31                      0            -4       1.414          2                2           2\nM77                      0            -2           0          0                0           0\nM91                      0            -2           0          0                0           0\nNGC1073                  0            -2           0          0                0           0\nM58                   .184            -2           1          1                1           1\nM63                   .293            -1           1          1                1           1\nM33                   .293            -1           1          1                1           1\nM60                      1             0       1.732          3                3           3\nM49                      1             0           2          4                4           4\n\n9 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">NAME       COSINE_DISTANCE INNER_PRODUCT L2_DISTANCE L2_SQUARED HAMMING_DISTANCE L1_DISTANCE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- --------------- ------------- ----------- ---------- ---------------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M31                      0            -4       1.414          2                2           2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M77                      0            -2           0          0                0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M91                      0            -2           0          0                0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">NGC1073                  0            -2           0          0                0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M58                   .184            -2           1          1                1           1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M63                   .293            -1           1          1                1           1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M33                   .293            -1           1          1                1           1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M60                      1             0       1.732          3                3           3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M49                      1             0           2          4                4           4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">9 rows selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><code>M77<\/code> and <code>M91<\/code> have identical vectors and they are expected to be very similar. However, <code>M31<\/code> is interesting. It has a similar shape to <code>NGC1073<\/code> but the words <code>barred<\/code> and <code>spiral<\/code> appear twice. This is a good match only for some distance metrics.<\/p>\n\n\n\n<p>A conventional query, e.g. based on Oracle Text might be good enough to find similar galaxies. However, if you have vectors with tons of dimensions then a vector similarity search might become appealing. Especially, since you can index vector columns to speed up your queries.<\/p>\n\n\n\n<p>The following SQL functions are provided for the vector data type in the Oracle Database:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_chunks.html#GUID-5927E2FA-6419-4744-A7CB-3E62DBB027AD\">vector_chunks<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector.html#GUID-8A63005B-5512-4D20-954C-7A9DA877FE4B\">vector<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/to_vector.html#GUID-2CCAB607-A28B-43F7-A71D-9800C0B9A380\">to_vector<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_dimension_count.html#GUID-C3D937E0-7F9F-4C21-A214-0CFA31472E67\">vector_dimension_count<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_dims.html#GUID-010349D7-190D-430B-A798-ACC486E1036A\">vector_dims<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_dimension_format.html#GUID-354ACE80-7120-4D45-B2B0-AB1D86E3D37D\">vector_dimension_format<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_distance.html#GUID-BA4BCFB2-D905-43DC-87B0-E53522CF07B7\">vector_distance<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/cosine_distance.html#GUID-2128DC1D-612A-444F-87D8-3D249CD8F12D\">cosine_distance<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/inner_product.html#GUID-6AE745CF-93E7-4192-8F80-7B9853DF5B72\">inner_product<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/l1_distance.html#GUID-604A5B68-10AF-48F3-A84F-ED0B90624059\">l1_distance<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/l2_distance.html#GUID-2FD8BC27-7614-471F-A4F5-3ED52130A05A\">l2_distance<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_embedding.html#GUID-5ED78260-6D21-4B6B-86E0-A1E70EFA11CA\">vector_embedding<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_norm.html#GUID-41554068-9EB8-49E8-A771-4E666674DDA8\">vector_norm<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/vector_serialize.html#GUID-9E3FFB34-F924-4C02-B35D-30B9FA1DA1A3\">vector_serialize<\/a> or <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/from_vector.html#GUID-AA60B3CB-FCB7-4944-9E06-976C272855B1\">from_vector<\/a><\/li>\n<\/ul>\n\n\n\n<p>Furthermore, the following supplied PL\/SQL packages provide additional functionality related to the vector data type:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/arpls\/dbms_vector1.html\">dbms_vector<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/arpls\/dbms_vector_chain1.html\">dbms_vector_chain<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Shorthand Operators for Distances<\/h2>\n\n\n\n<p>For some <code>vector_distance<\/code> metrics shorthand operators (<code>&lt;=&gt;<\/code>, <code>&lt;-&gt;<\/code>, <code>&lt;#&gt;<\/code>) are available. Here&#8217;s an example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3) Shorthand operators for vector_distance metrics<\/span><span role=\"button\" tabindex=\"0\" data-code=\"with ngc1073 as (select vector('[0,1,1,0,0]', 5, int8) as query_vector)\nselect name, \n       round(embedding &lt;=&gt; query_vector, 3) as cosine_distance,\n       round(embedding &lt;-&gt; query_vector, 3) as l2_distance,\n       round(embedding &lt;#&gt; query_vector, 3) as inner_product\n  from galaxies, ngc1073\n order by cosine_distance;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> ngc1073 <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> vector(<\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, int8) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> query_vector)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(embedding &lt;=&gt; query_vector, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> cosine_distance,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(embedding &lt;-&gt; query_vector, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> l2_distance,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">round<\/span><span style=\"color: #D4D4D4\">(embedding &lt;#&gt; query_vector, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> inner_product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> galaxies, ngc1073<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> cosine_distance;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"NAME       COSINE_DISTANCE L2_DISTANCE INNER_PRODUCT\n---------- --------------- ----------- -------------\nM31                      0       1.414            -4\nM77                      0           0            -2\nM91                      0           0            -2\nNGC1073                  0           0            -2\nM58                   .184           1            -2\nM63                   .293           1            -1\nM33                   .293           1            -1\nM60                      1       1.732             0\nM49                      1           2             0\n\n9 rows selected. \" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">NAME       COSINE_DISTANCE L2_DISTANCE INNER_PRODUCT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- --------------- ----------- -------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M31                      0       1.414            -4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M77                      0           0            -2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M91                      0           0            -2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">NGC1073                  0           0            -2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M58                   .184           1            -2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M63                   .293           1            -1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M33                   .293           1            -1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M60                      1       1.732             0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M49                      1           2             0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">9 rows selected. <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Approximate Similarity Searches<\/h2>\n\n\n\n<p>You can imagine producing a top-N result of the previous queries using the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__BABBADDD\">row_limiting_clause<\/a>. This clause was introduced in 12.1 to limit search results. Exactly to be precise. In 23.4 the clause was extended to support approximate similarity searches. The idea is to get a good enough result with a better performance when using vector indexes. Here&#8217;s an example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">4) Approximate Similarity Search<\/span><span role=\"button\" tabindex=\"0\" data-code=\"select name, embedding\n  from galaxies\n order by embedding &lt;=&gt; vector('[0,1,1,0,0]', 5, int8)\n fetch approx first 3 rows only\n  with target accuracy 80 percent;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, embedding<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> galaxies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> embedding &lt;=&gt; vector(<\/span><span style=\"color: #CE9178\">&#39;[0,1,1,0,0]&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, int8)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">fetch<\/span><span style=\"color: #D4D4D4\"> approx <\/span><span style=\"color: #DCDCAA\">first<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> rows only<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> target accuracy <\/span><span style=\"color: #B5CEA8\">80<\/span><span style=\"color: #D4D4D4\"> percent;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"NAME       EMBEDDING           \n---------- --------------------\nM31        [0,2,2,0,0]         \nM91        [0,1,1,0,0]         \nM77        [0,1,1,0,0]         \" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">NAME       EMBEDDING           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M31        [0,2,2,0,0]         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M91        [0,1,1,0,0]         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">M77        [0,1,1,0,0]         <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">5. Source and Destination Predicates in Graph Operator<\/h2>\n\n\n\n<p>The graph operator is a new 23ai feature. In 23.4 it got two additional predicates: <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/value-expressions-graph_table.html#GUID-3CA85A62-A083-4D12-9EFE-CF127BD8A3CD__GUID-ECB7861E-F863-4CB5-AA28-A1AF76E5952F\">source_predicate<\/a> and <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/value-expressions-graph_table.html#GUID-3CA85A62-A083-4D12-9EFE-CF127BD8A3CD__GUID-AB824BA8-ED46-41D3-A13E-A8A0C43ECB5C\">destination_predicate<\/a>. It allows us to test if a vertex is a source or a destination of an edge. The direction of the arrow so to speak. Here&#8217;s a formatted example from the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/value-expressions-graph_table.html#GUID-3CA85A62-A083-4D12-9EFE-CF127BD8A3CD__GUID-BBAA8483-B9AE-4889-B463-D21850A6931E\">documentation<\/a>, based on <a href=\"https:\/\/www.salvis.com\/blog\/2024\/01\/12\/islandsql-episode-5-select\/#graph-table-operator\">this model<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">5) Source and destination predicates<\/span><span role=\"button\" tabindex=\"0\" data-code=\"select *\n  from graph_table (students_graph\n          match (p1 is person) -[e is friends]- (p2 is person)\n          where p1.name = 'Mary'\n          columns (\n             e.friendship_id,\n             e.meeting_date,\n             case \n                when p1 is source of e then \n                   p1.name \n                else\n                   p2.name \n             end as from_person,\n             case \n                when p1 is destination of e then\n                   p1.name\n               else\n                   p2.name \n             end as to_person\n          )\n       )\n order by friendship_id;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> graph_table (students_graph<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          match (p1 <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> person) -[e <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> friends]- (p2 <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> person)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> p1.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#39;Mary&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          columns (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             e.friendship_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             e.meeting_date,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">when<\/span><span style=\"color: #D4D4D4\"> p1 <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> source <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> e <\/span><span style=\"color: #569CD6\">then<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   p1.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   p2.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">end<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> from_person,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">when<\/span><span style=\"color: #D4D4D4\"> p1 <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> destination <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> e <\/span><span style=\"color: #569CD6\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   p1.<\/span><span style=\"color: #569CD6\">name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   p2.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">end<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> to_person<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> friendship_id;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"FRIENDSHIP_ID MEETING_DATE        FROM_PERSON TO_PERSON \n------------- ------------------- ----------- ----------\n            1 19.09.2000 00:00:00 Mary        Alice     \n            5 19.09.2000 00:00:00 Mary        John      \n            7 10.07.2001 00:00:00 Bob         Mary \" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">FRIENDSHIP_ID MEETING_DATE        FROM_PERSON TO_PERSON <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------- ------------------- ----------- ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            1 19.09.2000 00:00:00 Mary        Alice     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            5 19.09.2000 00:00:00 Mary        John      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            7 10.07.2001 00:00:00 Bob         Mary <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">6. Breaking Change for Inlined MLE Call Specification<\/h2>\n\n\n\n<p>In 23.3 the following code works.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">6) MLE Call Specification in 23.3<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace function get42 return number is \n   mle language javascript q'[return 42;]';\n\/\nselect get42();\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> function get42 <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   mle <\/span><span style=\"color: #569CD6\">language<\/span><span style=\"color: #D4D4D4\"> javascript q<\/span><span style=\"color: #CE9178\">&#39;[return 42;]&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> get42();<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Function GET42 compiled\n\n\n   GET42()\n----------\n        42\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Function GET42 compiled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   GET42()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        42<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>In 24.4 the same code produces this error:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Function GET42 compiled\n\nLINE\/COL  ERROR\n--------- -------------------------------------------------------------\n2\/28      PLS-00881: missing closing delimiter 'q'[return' for MLE language code\nErrors: check compiler log\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Function GET42 compiled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">LINE\/COL  ERROR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--------- -------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">2\/28      PLS-00881: missing closing delimiter &#39;q&#39;[return&#39; for MLE language code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Errors: check compiler log<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The reason is a change in the syntax of the inlined MLE call specification. The JavaScript code cannot be passed as a string anymore. Instead, a new type of delimiter must be used as documented <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/mlejs\/calling-mle-js-functions.html#MLEJS-GUID-B0BBB967-2C4E-43D0-8D38-F4962AD23FE2\">here<\/a>. You can use almost any sequence of characters as a delimiter for the JavaScript code. The same character sequence must be used for the start and the end delimiter. Exceptions are the pairs <code>()<\/code>, <code>[]<\/code>, <code>{}<\/code> and <code>&lt;&gt;<\/code>. <\/p>\n\n\n\n<p>PostgreSQL <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING\">dollar-quoted string constants<\/a> are also valid delimiters. This works in 23.4: <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">7) MLE Call Specification in 23.4<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace function get42 return number is \n   mle language javascript $code$ return 42;$code$;\n\/\n\nselect get42();\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> function get42 <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   mle <\/span><span style=\"color: #569CD6\">language<\/span><span style=\"color: #D4D4D4\"> javascript $code$ <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">42<\/span><span style=\"color: #D4D4D4\">;$code$;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> get42();<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Function GET42 compiled\n\n\n   GET42()\n----------\n        42\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Function GET42 compiled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   GET42()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        42<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Please note that the space after the first <code>$code$<\/code> is required for the Oracle Database to recognize the end of the delimiter. <\/p>\n\n\n\n<p>This change might simplify the implementation of additional MLE languages. Nevertheless, this is a breaking change that requires an amendment of the existing code base.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Outlook<\/h2>\n\n\n\n<p>In the next episode, the IslandSQL grammar will be extended to cover the missing statements with a query block. This means the<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>create view<\/code>, <\/li>\n\n\n\n<li><code>create materialized view<\/code> and <\/li>\n\n\n\n<li><code>create table<\/code> statement<\/li>\n<\/ul>\n\n\n\n<p>for PostgreSQL and the Oracle Database. Only two episodes are left until the end of the first IslandSQL season.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In the last episode, we looked at some features in PostgreSQL which I miss in the Oracle Database. The IslandSQL grammar now covers PL\/SQL and the related DDL statements. The implementation was more complex than expected, mainly because of the incompatibilities between PostgreSQL and the Oracle Database. I will probably deal<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":13390,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[139,86,137,140,111,85],"class_list":["post-13386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-antlr","tag-code-analysis","tag-islandsql","tag-oracle-26ai","tag-postgresql","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IslandSQL Episode 8: What&#039;s New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.\" \/>\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\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IslandSQL Episode 8: What&#039;s New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-15T18:45:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-06T12:04:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\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.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"IslandSQL Episode 8: What&#8217;s New in Oracle Database 23.4?\",\"datePublished\":\"2024-06-15T18:45:43+00:00\",\"dateModified\":\"2024-12-06T12:04:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/\"},\"wordCount\":819,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL8.png\",\"keywords\":[\"ANTLR\",\"Code Analysis\",\"IslandSQL\",\"Oracle 26ai\",\"PostgreSQL\",\"SQL\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/\",\"name\":\"IslandSQL Episode 8: What's New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL8.png\",\"datePublished\":\"2024-06-15T18:45:43+00:00\",\"dateModified\":\"2024-12-06T12:04:47+00:00\",\"description\":\"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL8.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL8.png\",\"width\":500,\"height\":500,\"caption\":\"IslandSQL Episode 8: What's New in Oracle Database 23.4?\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/15\\\/islandsql-episode-8-whats-new-in-oracle-database-23-4\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IslandSQL Episode 8: What&#8217;s New in Oracle Database 23.4?\"}]},{\"@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":"IslandSQL Episode 8: What's New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog","description":"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.","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\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/","og_locale":"en_US","og_type":"article","og_title":"IslandSQL Episode 8: What's New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog","og_description":"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.","og_url":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2024-06-15T18:45:43+00:00","article_modified_time":"2024-12-06T12:04:47+00:00","og_image":[{"width":500,"height":500,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"IslandSQL Episode 8: What&#8217;s New in Oracle Database 23.4?","datePublished":"2024-06-15T18:45:43+00:00","dateModified":"2024-12-06T12:04:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/"},"wordCount":819,"commentCount":1,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png","keywords":["ANTLR","Code Analysis","IslandSQL","Oracle 26ai","PostgreSQL","SQL"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/","url":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/","name":"IslandSQL Episode 8: What's New in Oracle Database 23.4? - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png","datePublished":"2024-06-15T18:45:43+00:00","dateModified":"2024-12-06T12:04:47+00:00","description":"In this episode, we focus on features introduced in Oracle Database 23.4. Vector data type, functions, operators and more.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL8.png","width":500,"height":500,"caption":"IslandSQL Episode 8: What's New in Oracle Database 23.4?"},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"IslandSQL Episode 8: What&#8217;s New in Oracle Database 23.4?"}]},{"@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\/posts\/13386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"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=13386"}],"version-history":[{"count":36,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/13386\/revisions"}],"predecessor-version":[{"id":13741,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/13386\/revisions\/13741"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/13390"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=13386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=13386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=13386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}