{"id":28351,"date":"2023-09-27T21:02:41","date_gmt":"2023-09-27T19:02:41","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=28351"},"modified":"2023-09-27T21:08:22","modified_gmt":"2023-09-27T19:08:22","slug":"automatic-pl-sql-to-sql-transpiler","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/","title":{"rendered":"Automatic PL\/SQL to SQL Transpiler"},"content":{"rendered":"\n<p>SQL is a wonderful language and very easy to use.<\/p>\n\n\n\n<p>For example you can call a PL\/SQL function into a SELECT or WHERE clause and the result of the PL\/SQL function is returned into the SQL expression.<\/p>\n\n\n\n<p>But when we call a PL\/SQL function inside a SQL statement there is a context switch between the SQL Engine and the PL\/SQL Engine impacting the SQL performance mostly for SQL statements returning a high number of rows because for each row returned by the SQL, a roundtrip is done between the SQL engine and the PL\/SQL engine.<\/p>\n\n\n\n<p>Let&#8217;s do a demo :<\/p>\n\n\n\n<p>We create a simple PL\/SQL function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; create or replace function price_with_tax(p1 in number, p2 in number)\nreturn number as\nbegin\n      return p1*(1+p2\/100);\nend;\n\/\nFunction created.<\/code><\/pre>\n\n\n\n<p>We have a table with more than 100001 rows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; select count(*) from big_table;\n\n  COUNT(*)\n----------\n    100001<\/code><\/pre>\n\n\n\n<p>We enable the PL\/SQL profiling via the DBMS_HPROF package which allows to monitore the number of calls between the PL\/SQL engine and the SQL engine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; BEGIN\n  2    DBMS_HPROF.start_profiling (\n  3  \t location =&gt; 'PROFILER_DIR',\n  4  \t filename =&gt; 'profiler.txt');\n  5   end;\n  6   \/\n\nPL\/SQL procedure successfully completed.<\/code><\/pre>\n\n\n\n<p>We execute a SQL statement on the  table &#8220;big_table&#8221; calling the PL\/SQL function &#8220;price_with_tax&#8221;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; set autotrace on\nselect id,owner,object_name from big_table where price_with_tax(object_id,19.6) &gt; 1;\n. . .\nID OWNER OBJECT_NAME\n---------- ------------------------------------------------------------------\n99903 SYS org\/w3c\/dom\/css\/CSSStyleRule\n99904 SYS org\/w3c\/dom\/css\/CSSUnknownRule\n. . .\n100000 SYS sun\/awt\/AWTIcon32_java_icon16_png\n100001 SYS sun\/awt\/AWTIcon32_java_icon24_png\n\n100001 rows selected.\nExecution Plan\n----------------------------------------------------------\nPlan hash value: 3993303771\n\n-------------------------------------------------------------------------------\n| Id  | Operation\t  | Name      | Rows  | Bytes | Cost (%CPU)| Time     |\n-------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT  |\t      |  5000 |   263K|   503\t(2)| 00:00:01 |\n|*  1 |  TABLE ACCESS FULL| BIG_TABLE |  5000 |   263K|   503\t(2)| 00:00:01 |\n-------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   1 - filter(\"PRICE_WITH_TAX\"(\"OBJECT_ID\",19.6)&gt;1)\n<\/code><\/pre>\n\n\n\n<p>We see in the Explain Plan that the PL\/SQL function is called and there are 100001 rows returned.<\/p>\n\n\n\n<p>Now let&#8217;s check the number of roundtrips (calls) between the SQL Engine and the PL\/SQL Engine for the function &#8220;price_with_tax&#8221; by using the package DBMS_HPROF.ANALYZE:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>QL&gt; Begin\n  2    DBMS_HPROF.stop_profiling;\n  3  END;\n  4  \/\n\nPL\/SQL procedure successfully completed.\n\nSQL&gt; prompt ANALYZE THE RESULTS OF PROFILING --&gt;  \"DMMS_HPROF.ANALYZE\"\nANALYZE THE RESULTS OF PROFILING --&gt;  \"DMMS_HPROF.ANALYZE\"\nSQL&gt; pause\n\nSQL&gt; SET SERVEROUTPUT ON\nSQL&gt; DECLARE\n  2    l_runid\tNUMBER;\n  3  BEGIN\n  4    l_runid := DBMS_HPROF.analyze (\n  5  \t\t    location\t=&gt; 'PROFILER_DIR',\n  6  \t\t    filename\t=&gt; 'profiler.txt',\n  7  \t\t    run_comment =&gt; 'Test run.');\n  8\n  9    DBMS_OUTPUT.put_line('l_runid=' || l_runid);\n 10  END;\n 11  \/\nl_runid=36\n\nPL\/SQL procedure successfully completed.\n\nSQL&gt; prompt GET RUNID of DBMS_HPROF.ANALYZE\nGET RUNID of DBMS_HPROF.ANALYZE\nSQL&gt; accept runid number prompt 'Enter the RUNID of DBMS_HPROF.ANALYZE:'\nEnter the RUNID of DBMS_HPROF.ANALYZE:36\nSQL&gt; SET LINESIZE 500 PAGESIZE 1000\nSQL&gt; COLUMN name FORMAT A100\nSQL&gt; SELECT RPAD(' ', (level-1)*2, ' ') || a.name AS name,\n    \t    a.subtree_elapsed_time,\n    \t    a.function_elapsed_time,\n    \t    a.calls\n    FROM   (SELECT fi.symbolid,\n    \t\t    pci.parentsymid,\n    \t\t    RTRIM(fi.owner || '.' || fi.module || '.' || NULLIF(fi.function,fi.module), '.') AS name,\n    \t\t    NVL(pci.subtree_elapsed_time, fi.subtree_elapsed_time) AS subtree_elapsed_time,\n    \t\t    NVL(pci.function_elapsed_time, fi.function_elapsed_time) AS function_elapsed_time,\n   \t\t    NVL(pci.calls, fi.calls) AS calls\n   \t     FROM   dbmshp_function_info fi\n   \t\t    LEFT JOIN dbmshp_parent_child_info pci ON fi.runid = pci.runid AND fi.symbolid = pci.childsymid\n   \t     WHERE    fi.runid = &amp;runid) a\n   CONNECT BY a.parentsymid = PRIOR a.symbolid\n   START WITH a.parentsymid IS NULL;\nold  13:\t WHERE\t  fi.runid = &amp;runid) a\nnew  13:\t WHERE\t  fi.runid =\t     36) a\n\nNAME                  SUBTREE_ELAPSED_TIME FUNCTION_ELAPSED_TIME      CALLS\n-----------------------------------------------------------------------------\n..__plsql_vm \t      352444\t\t   46117                      100006\n..__anonymous_block   253320\t\t   1589                       5\n. . .\nSYS.DBMS_XPLAN.__pkg_init 1\t\t  1 \t                      1\nLFE.PRICE_WITH_TAX\t 53007\t\t  53007                       100001<\/code><\/pre>\n\n\n\n<p>There are 100001 roundtrips between the SQL Engine and the PL\/SQL Engine which of course is very bad from a performance point of view.<\/p>\n\n\n\n<p>The solution is to rewrite the SQL expression by moving the PL\/SQL code into the SQL statement but it has a cost in term of development mostly if you have huge sql statement which contains several lines of code.<\/p>\n\n\n\n<p>WIth the new parameter SQL_TRANSPILER in 23c, oracle does this conversion automatically for you.<\/p>\n\n\n\n<p>We just have to enable the parameter:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; alter system set sql_transpiler=ON scope = both;\n\nSystem altered.<\/code><\/pre>\n\n\n\n<p>We execute the same sql statement:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select id,owner,object_name from big_table where price_with_tax(object_id,19.6) &gt; 1;\n\nID OWNER OBJECT_NAME\n---------- ------------------------------------------------------------------   \n100000 SYS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    sun\/awt\/AWTIcon32_java_icon16_png\n    100001 SYS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    sun\/awt\/AWTIcon32_java_icon24_png\n\n100001 rows selected.\n\n\nExecution Plan\n----------------------------------------------------------\nPlan hash value: 3993303771\n\n-------------------------------------------------------------------------------\n| Id  | Operation\t  | Name      | Rows  | Bytes | Cost (%CPU)| Time     |\n-------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT  |\t      |  5000 |   263K|   494\t(1)| 00:00:01 |\n|*  1 |  TABLE ACCESS FULL| BIG_TABLE |  5000 |   263K|   494\t(1)| 00:00:01 |\n-------------------------------------------------------------------------------\n\nPredicate Information (identified by operation id):\n---------------------------------------------------\n\n   1 - filter(\"OBJECT_ID\"*1.196&gt;1)<\/code><\/pre>\n\n\n\n<p>We can see in the Explain Plan that the PL\/SQL function is no more called and oracle has moved automatically the PL\/SQL code inside the SQL Expression.<\/p>\n\n\n\n<p>Now let&#8217;s check the number of roundtrips between the SQL Engine and the PL\/SQL Engine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; SET LINESIZE 500 PAGESIZE 1000\nSQL&gt; COLUMN name FORMAT A100\nSQL&gt; SELECT RPAD(' ', (level-1)*2, ' ') || a.name AS name,\n    \t    a.subtree_elapsed_time,\n    \t    a.function_elapsed_time,\n    \t    a.calls\n    FROM   (SELECT fi.symbolid,\n    \t\t    pci.parentsymid,\n    \t\t    RTRIM(fi.owner || '.' || fi.module || '.' || NULLIF(fi.function,fi.module), '.') AS name,\n    \t\t    NVL(pci.subtree_elapsed_time, fi.subtree_elapsed_time) AS subtree_elapsed_time,\n    \t\t    NVL(pci.function_elapsed_time, fi.function_elapsed_time) AS function_elapsed_time,\n   \t\t    NVL(pci.calls, fi.calls) AS calls\n   \t     FROM   dbmshp_function_info fi\n   \t\t    LEFT JOIN dbmshp_parent_child_info pci ON fi.runid = pci.runid AND fi.symbolid = pci.childsymid\n   \t     WHERE    fi.runid = &amp;runid) a\n   CONNECT BY a.parentsymid = PRIOR a.symbolid\n   START WITH a.parentsymid IS NULL\nold  13:\t WHERE\t  fi.runid = &amp;runid) a\nnew  13:\t WHERE\t  fi.runid =\t     37) a\n\nNAME                   SUBTREE_ELAPSED_TIME FUNCTION_ELAPSED_TIME      CALLS\n-----------------------------------------------------------------------------\n..__plsql_vm\t       154522\t\t      7 \t 5\nSYS.XMLTYPE.GETCLOBVAL 25\t\t     25 \t 1\n\n43 rows selected.\n<\/code><\/pre>\n\n\n\n<p>No more roundtrip occurs between the SQL Engine and the PL\/SQL Engine which is very good from a performance point of view.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQL is a wonderful language and very easy to use. For example you can call a PL\/SQL function into a SELECT or WHERE clause and the result of the PL\/SQL function is returned into the SQL expression. But when we call a PL\/SQL function inside a SQL statement there is a context switch between the [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198,368,59],"tags":[],"type_dbi":[],"class_list":["post-28351","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","category-development-performance","category-oracle"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Automatic PL\/SQL to SQL Transpiler - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatic PL\/SQL to SQL Transpiler\" \/>\n<meta property=\"og:description\" content=\"SQL is a wonderful language and very easy to use. For example you can call a PL\/SQL function into a SELECT or WHERE clause and the result of the PL\/SQL function is returned into the SQL expression. But when we call a PL\/SQL function inside a SQL statement there is a context switch between the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-27T19:02:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-27T19:08:22+00:00\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Automatic PL\/SQL to SQL Transpiler\",\"datePublished\":\"2023-09-27T19:02:41+00:00\",\"dateModified\":\"2023-09-27T19:08:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\"},\"wordCount\":382,\"commentCount\":1,\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\",\"Development &amp; Performance\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\",\"name\":\"Automatic PL\/SQL to SQL Transpiler - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2023-09-27T19:02:41+00:00\",\"dateModified\":\"2023-09-27T19:08:22+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatic PL\/SQL to SQL Transpiler\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Automatic PL\/SQL to SQL Transpiler - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/","og_locale":"en_US","og_type":"article","og_title":"Automatic PL\/SQL to SQL Transpiler","og_description":"SQL is a wonderful language and very easy to use. For example you can call a PL\/SQL function into a SELECT or WHERE clause and the result of the PL\/SQL function is returned into the SQL expression. But when we call a PL\/SQL function inside a SQL statement there is a context switch between the [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/","og_site_name":"dbi Blog","article_published_time":"2023-09-27T19:02:41+00:00","article_modified_time":"2023-09-27T19:08:22+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Automatic PL\/SQL to SQL Transpiler","datePublished":"2023-09-27T19:02:41+00:00","dateModified":"2023-09-27T19:08:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/"},"wordCount":382,"commentCount":1,"articleSection":["Database Administration &amp; Monitoring","Database management","Development &amp; Performance","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/","url":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/","name":"Automatic PL\/SQL to SQL Transpiler - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2023-09-27T19:02:41+00:00","dateModified":"2023-09-27T19:08:22+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/automatic-pl-sql-to-sql-transpiler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Automatic PL\/SQL to SQL Transpiler"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/28351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=28351"}],"version-history":[{"count":13,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/28351\/revisions"}],"predecessor-version":[{"id":28369,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/28351\/revisions\/28369"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=28351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=28351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=28351"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=28351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}