{"id":8722,"date":"2018-08-05T22:34:07","date_gmt":"2018-08-05T20:34:07","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=8722"},"modified":"2023-11-08T03:11:28","modified_gmt":"2023-11-08T02:11:28","slug":"view-api-jooq-application","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/","title":{"rendered":"View-API for JOOQ Application"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In this blog post, I show how to build a read-only view-API for Oracle&#8217;s\u00a0<a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/18\/comsc\/introduction-to-sample-schemas.html#GUID-4DE9844F-0B28-4713-9AFC-CCD8D6249D76\">HR sample schema<\/a>. And I will use this view-API in a <a href=\"https:\/\/www.jooq.org\/\">JOOQ<\/a> application.\u00a0This application will fully comply with the\u00a0<a href=\"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/the-pink-database-paradigm-pinkdb\/\">Pink Database Paradigm (PinkDB)<\/a>. This means the application executes set-based SQL and retrieves data with as few network roundtrips as possible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The following topics are covered:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#install_sample_schemas\">Install Sample Schemas<\/a><\/li>\n\n\n\n<li><a href=\"#build_view_api\">Build the View-API<\/a><\/li>\n\n\n\n<li><a href=\"#create_role\">Create the View-API Database Role<\/a><\/li>\n\n\n\n<li><a href=\"#create_connect_user\">Create the Connect User<\/a><\/li>\n\n\n\n<li><a href=\"#install_jooq\">Install JOOQ<\/a><\/li>\n\n\n\n<li><a href=\"#teach_jooq_view_api\">Teach JOOQ the View-API<\/a><\/li>\n\n\n\n<li><a href=\"#run_simple_query\">Run a Simple Query<\/a><\/li>\n\n\n\n<li><a href=\"#using_joins\">Using Joins &amp; Aggregations<\/a><\/li>\n\n\n\n<li><a href=\"#using_binds\">Using Bind Variables<\/a><\/li>\n\n\n\n<li><a href=\"#run_top_n_query\">Run a Top N Query<\/a><\/li>\n\n\n\n<li><a href=\"#using_row_pattern_matching\">Using Row Pattern Matching<\/a><\/li>\n\n\n\n<li><a href=\"#conclusion\">Conclusion<\/a><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This is not meant to be a tutorial. However, you should be able to build the application based on the information in this blog post and the referenced links.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s the first time I&#8217;ve done anything with JOOQ. I read about it and understood the high-level concepts, but I have never used JOOQ before. This is one reason why this blog post became a bit more verbose. I hope it is helpful.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"install_sample_schemas\"><\/a>1. Install Sample Schemas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">See the&nbsp;<a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/18\/comsc\/installing-sample-schemas.html#GUID-1E645D09-F91F-4BA6-A286-57C5EC66321D\">Oracle documentation<\/a>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Starting with Oracle Database 12c Release 2, the latest version of the sample schema scripts are available on GitHub at&nbsp;<a class=\"new-window\" href=\"https:\/\/github.com\/oracle\/db-sample-schemas\/releases\/latest\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/oracle\/db-sample-schemas\/releases\/latest<\/a>. (&#8230;)<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"build_view_api\"><\/a>2. Build the View-API<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1:1 Views<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When building a view API I start with a 1:1 mapping to the table. There are usually some discussions on different topics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Expose Surrogate Keys<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One topic is\u00a0to include surrogate keys or just business keys in the view API. Nowadays, I tend to expose surrogate keys. The main reason is to avoid joins when business key columns are stored in related (parent) tables. Forcing the application to join views via such business key columns is a bad idea from a performance point of view.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convenience Views &#8211; Not a Replacement for 1:1 Views<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Another topic is the simplification of the model. For example, provide data from various tables to simplify the usage. Simplification means here sparing the consuming application to use joins. This is sometimes a good idea, but it does not replace the 1:1 views, which are the key to the optimal path to the data. I know about join elimination, but in reality, they often do not work. One reason is that unnecessary columns are queried as well. Another problem is, to force the view to apply selective predicates as early as possible. Sometimes it is necessary to introduce an application context, just for that purpose, making the usage of the view not that simple anymore.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Value of a 1:1 View-API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The logical next question is this: Why do we need a view layer when it just provides data the same way as the underlying tables? That&#8217;s an excellent question. I strongly recommend introducing a layer only, when it provides more value than the additional effort. So, what is the value of a 1:1 view layer? Most products evolve during their life cycle. Hence, the data model will most probably change as well. When we have a view layer, we have the option to change the physical data model and keep the existing view layer the same for the consuming applications. From that point on, the views are not a 1:1 representation of tables, at least not in every case.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As long as we keep the interface to the application unchanged, we do not have to coordinate changes with the consuming applications. This gives us effective room for refactoring and simplifies going-live scenarios of new releases. Providing additional data and functionality is usually not a problem. However, adapting applications to new interfaces needs time. A view-API, especially if it implements some versioning concept, provides an excellent value in this area.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">View-API of HR Schema<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve generated the initial version of the 1:1 view layer with <a href=\"https:\/\/www.oddgen.org\/\">oddgen<\/a>&#8216;s 1:1 View generator.<\/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\">View-API<\/span><span role=\"button\" tabindex=\"0\" data-code=\"ALTER SESSION SET current_schema=hr;\n\nCREATE OR REPLACE VIEW COUNTRIES_V AS\n   SELECT COUNTRY_ID,\n          COUNTRY_NAME,\n          REGION_ID\n     FROM COUNTRIES;\n\nCREATE OR REPLACE VIEW DEPARTMENTS_V AS\n   SELECT DEPARTMENT_ID,\n          DEPARTMENT_NAME,\n          MANAGER_ID,\n          LOCATION_ID\n     FROM DEPARTMENTS;\n\nCREATE OR REPLACE VIEW EMPLOYEES_V AS\n   SELECT EMPLOYEE_ID,\n          FIRST_NAME,\n          LAST_NAME,\n          EMAIL,\n          PHONE_NUMBER,\n          HIRE_DATE,\n          JOB_ID,\n          SALARY,\n          COMMISSION_PCT,\n          MANAGER_ID,\n          DEPARTMENT_ID\n     FROM EMPLOYEES;\n\nCREATE OR REPLACE VIEW JOB_HISTORY_V AS\n   SELECT EMPLOYEE_ID,\n          START_DATE,\n          END_DATE,\n          JOB_ID,\n          DEPARTMENT_ID\n     FROM JOB_HISTORY;\n\nCREATE OR REPLACE VIEW JOBS_V AS\n   SELECT JOB_ID,\n          JOB_TITLE,\n          MIN_SALARY,\n          MAX_SALARY\n     FROM JOBS;\n\nCREATE OR REPLACE VIEW LOCATIONS_V AS\n   SELECT LOCATION_ID,\n          STREET_ADDRESS,\n          POSTAL_CODE,\n          CITY,\n          STATE_PROVINCE,\n          COUNTRY_ID\n     FROM LOCATIONS;\n\nCREATE OR REPLACE VIEW REGIONS_V AS\n   SELECT REGION_ID,\n          REGION_NAME\n     FROM REGIONS;\" 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\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SESSION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> current_schema=hr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">COUNTRIES_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> COUNTRY_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          COUNTRY_NAME,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          REGION_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> COUNTRIES;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">DEPARTMENTS_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> DEPARTMENT_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          DEPARTMENT_NAME,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MANAGER_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          LOCATION_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> DEPARTMENTS;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> EMPLOYEE_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          FIRST_NAME,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          LAST_NAME,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          EMAIL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          PHONE_NUMBER,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          HIRE_DATE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          JOB_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          SALARY,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          COMMISSION_PCT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MANAGER_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          DEPARTMENT_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMPLOYEES;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">JOB_HISTORY_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> EMPLOYEE_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">START_DATE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          END_DATE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          JOB_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          DEPARTMENT_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> JOB_HISTORY;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">JOBS_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> JOB_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          JOB_TITLE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MIN_SALARY,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MAX_SALARY<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> JOBS;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">LOCATIONS_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> LOCATION_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          STREET_ADDRESS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          POSTAL_CODE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          CITY,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          STATE_PROVINCE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          COUNTRY_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> LOCATIONS;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">REGIONS_V<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> REGION_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          REGION_NAME<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> REGIONS;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">View Constraints<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When building a view-API it is a good idea to also define primary key, foreign key and unique constraints for these views. They will not be enforced by the Oracle database, but they are an excellent documentation. Furthermore, they will be used by JOOQ as we see later.<\/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\">View Constraints<\/span><span role=\"button\" tabindex=\"0\" data-code=\"ALTER SESSION SET current_schema=hr;\n\n-- primary key and unique constraints\nALTER VIEW countries_v   ADD PRIMARY KEY (country_id)              DISABLE NOVALIDATE;\nALTER VIEW departments_v ADD PRIMARY KEY (department_id)           DISABLE NOVALIDATE;\nALTER VIEW employees_v   ADD PRIMARY KEY (employee_id)             DISABLE NOVALIDATE;\nALTER VIEW employees_v   ADD UNIQUE      (email)                   DISABLE NOVALIDATE;\nALTER VIEW job_history_v ADD PRIMARY KEY (employee_id, start_date) DISABLE NOVALIDATE;\nALTER VIEW jobs_v        ADD PRIMARY KEY (job_id)                  DISABLE NOVALIDATE;\nALTER VIEW locations_v   ADD PRIMARY KEY (location_id)             DISABLE NOVALIDATE;\nALTER VIEW regions_v     ADD PRIMARY KEY (region_id)               DISABLE NOVALIDATE;\n\n-- foreign key constraints\nALTER VIEW countries_v   ADD FOREIGN KEY (region_id)     REFERENCES hr.regions_v     DISABLE NOVALIDATE;\nALTER VIEW departments_v ADD FOREIGN KEY (location_id)   REFERENCES hr.locations_v   DISABLE NOVALIDATE;\nALTER VIEW departments_v ADD FOREIGN KEY (manager_id)    REFERENCES hr.employees_v   DISABLE NOVALIDATE;\nALTER VIEW employees_v   ADD FOREIGN KEY (department_id) REFERENCES hr.departments_v DISABLE NOVALIDATE;\nALTER VIEW employees_v   ADD FOREIGN KEY (job_id)        REFERENCES hr.jobs_v        DISABLE NOVALIDATE;\nALTER VIEW employees_v   ADD FOREIGN KEY (manager_id)    REFERENCES hr.employees_v   DISABLE NOVALIDATE;\nALTER VIEW job_history_v ADD FOREIGN KEY (department_id) REFERENCES hr.departments_v DISABLE NOVALIDATE;\nALTER VIEW job_history_v ADD FOREIGN KEY (employee_id)   REFERENCES hr.employees_v   DISABLE NOVALIDATE;\nALTER VIEW job_history_v ADD FOREIGN KEY (job_id)        REFERENCES hr.jobs_v        DISABLE NOVALIDATE;\nALTER VIEW locations_v   ADD FOREIGN KEY (country_id)    REFERENCES hr.countries_v   DISABLE NOVALIDATE;\" 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\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SESSION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> current_schema=hr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- primary key and unique constraints<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> countries_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (country_id)              <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> departments_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (department_id)           <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> employees_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (employee_id)             <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> employees_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">UNIQUE<\/span><span style=\"color: #D4D4D4\">      (email)                   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> job_history_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (employee_id, <\/span><span style=\"color: #569CD6\">start_date<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> jobs_v        <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (job_id)                  <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> locations_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (location_id)             <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> regions_v     <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (region_id)               <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- foreign key constraints<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> countries_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (region_id)     <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.regions_v     <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> departments_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (location_id)   <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.locations_v   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> departments_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (manager_id)    <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.employees_v   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> employees_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (department_id) <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.departments_v <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> employees_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (job_id)        <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.jobs_v        <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> employees_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (manager_id)    <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.employees_v   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> job_history_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (department_id) <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.departments_v <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> job_history_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (employee_id)   <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.employees_v   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> job_history_v <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (job_id)        <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.jobs_v        <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">ALTER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VIEW<\/span><span style=\"color: #D4D4D4\"> locations_v   <\/span><span style=\"color: #569CD6\">ADD<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FOREIGN KEY<\/span><span style=\"color: #D4D4D4\"> (country_id)    <\/span><span style=\"color: #569CD6\">REFERENCES<\/span><span style=\"color: #D4D4D4\"> hr.countries_v   <\/span><span style=\"color: #569CD6\">DISABLE<\/span><span style=\"color: #D4D4D4\"> NOVALIDATE;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">View-API Model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I created the following relational model with Oracle&#8217;s SQL Developer.&nbsp;SQL Developer automatically took into account all constraints defined on these 7 views. Most of the work was to rearrange the view boxes on the diagram,&nbsp;but with only 7 views it was no big deal.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png\"><img loading=\"lazy\" decoding=\"async\" width=\"949\" height=\"657\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png\" alt=\"HR View-API\" class=\"wp-image-8745\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png 949w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API-300x208.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API-768x532.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API-211x146.png 211w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API-50x35.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API-108x75.png 108w\" sizes=\"auto, (max-width:767px) 480px, (max-width:949px) 100vw, 949px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"create_role\"><\/a>3. Create the View-API Database Role<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We grant read access to all views as part of the API to the database role <code>HR_API_ROLE<\/code>. This is easier to maintain, especially when access to more than one connect user is granted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Please note that just <code>READ<\/code> access is granted on the views. We do not grant <code>SELECT<\/code> access to ensure that data can&#8217;t be locked by the connect users via <code>SELECT FOR UPDATE<\/code>.&nbsp; The <code>READ<\/code> privilege was introduced in Oracle Database 12c.<\/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\">HR_API_ROLE<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE ROLE hr_api_role;\n\nGRANT READ ON hr.countries_v   TO hr_api_role;\nGRANT READ ON hr.departments_v TO hr_api_role;\nGRANT READ ON hr.employees_v   TO hr_api_role;\nGRANT READ ON hr.job_history_v TO hr_api_role;\nGRANT READ ON hr.jobs_v        TO hr_api_role;\nGRANT READ ON hr.locations_v   TO hr_api_role;\nGRANT READ ON hr.regions_v     TO hr_api_role;\" 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<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ROLE<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.countries_v   <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.departments_v <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.employees_v   <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.job_history_v <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.jobs_v        <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.locations_v   <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> hr.regions_v     <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> hr_api_role;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this case, it does not make sense to define more than one role. But for larger projects, it might be helpful to create more roles. For example to distinguish between read and write roles or to manage access to sensitive data explicitly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"create_connect_user\"><\/a>4. Create the Connect User<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now we create a connect user named <code>JOOQ<\/code>. It will have the right to connect, access the view-API and execute the procedures in the <code>SYS.DBMS_MONITOR<\/code> package. The access to <code>DBMS_MONITOR<\/code> is given only to enable SQL Trace for some analysis on the database server.<\/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\">Create Connect User JOOQ<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE USER jooq IDENTIFIED BY jooq;\nGRANT connect, hr_api_role TO jooq;\nGRANT EXECUTE ON sys.dbms_monitor TO jooq;\" 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<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">USER<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">jooq<\/span><span style=\"color: #D4D4D4\"> IDENTIFIED <\/span><span style=\"color: #569CD6\">BY<\/span><span style=\"color: #D4D4D4\"> jooq;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">connect<\/span><span style=\"color: #D4D4D4\">, hr_api_role <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> jooq;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">GRANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">EXECUTE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> sys.dbms_monitor <\/span><span style=\"color: #569CD6\">TO<\/span><span style=\"color: #D4D4D4\"> jooq;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"install_jooq\"><\/a>5. Install JOOQ<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.jooq.org\/download\/\">Download<\/a> the trial version of JOOQ Professional for free. The trial period is 30 days. Registration is not required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JOOQ comes with an excellent documentation. In fact, I kept the PDF version open during all my tests and found everything I needed using the search function. After extracting the downloaded ZIP file, I run the following commands on my macOS system:<\/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\">Install JOOQ in Local Maven Repository<\/span><span role=\"button\" tabindex=\"0\" data-code=\"chmod +x maven-deploy.sh\n.\/maven-deploy.sh -u file:\/\/\/Users\/phs\/.m2\/repository\" 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: #DCDCAA\">chmod<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">+x<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">maven-deploy.sh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">.\/maven-deploy.sh<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">-u<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">file:\/\/\/Users\/phs\/.m2\/repository<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This deployed JOOQ in my local Maven repository. Run <code>.\/maven-deploy.sh -h<\/code> for command line options, e.g. when you want to deploy it on your Sonatype Nexus repository.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"teach_jooq_view_api\"><\/a>6. Teach JOOQ the View-API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JOOQ allows to build SQL and execute SQL statements in a typesafe manner. It&#8217;s similar to SQL within PL\/SQL. You avoid to build SQL using string concatenation. Instead, you use the JOOQ domain-specific language (DSL) that knows about SQL and can learn about your database model. For example, JOOQ must learn that\u00a0<code>JOBS_V<\/code> is a view and <code>JOB_ID<\/code>\u00a0is its primary key column.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Technically JOOQ reads the data dictionary and generates a set of Java classes for you. You may call the generator via command line using a XML configuration file or use the JOOQ Maven plugin to configure the generator directly in your <code>pom.xml<\/code>. You may also generate these classes via Ant or Gradle. I&#8217;ve used the Maven plugin to include the code generation process in my project build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 36-38, we define the JDBC driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 43-46, we configure the JDBC URL and the credentials of the connect user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Line 50 tells JOOQ to use the Oracle meta-model and line 51 is a regular expression to define the generation scope. In our case the visible objects in the <code>HR<\/code> schema and the PL\/SQL package <code>SYS.DBMS_MONITOR<\/code>. Using the default would generate Java code for all public objects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, on lines 54-55, we define the target directory for the\u00a0generated Java classes and their Java package name.<\/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\">XML<\/span><span role=\"button\" tabindex=\"0\" data-code=\"<project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\n   xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;\n   <modelVersion&gt;4.0.0<\/modelVersion&gt;\n   <groupId&gt;com.trivadis.pinkdb.jooq<\/groupId&gt;\n   <artifactId&gt;jooq-pinkdb<\/artifactId&gt;\n   <version&gt;0.0.1-SNAPSHOT<\/version&gt;\n   <properties&gt;\n      <project.build.sourceEncoding&gt;UTF-8<\/project.build.sourceEncoding&gt;\n      <jdk.version&gt;1.8<\/jdk.version&gt;\n      <xtend.version&gt;2.12.0<\/xtend.version&gt;\n   <\/properties&gt;\n   <build&gt;\n      <plugins&gt;\n         <plugin&gt;\n            <groupId&gt;org.apache.maven.plugins<\/groupId&gt;\n            <version&gt;3.8.0<\/version&gt;\n            <artifactId&gt;maven-compiler-plugin<\/artifactId&gt;\n            <configuration&gt;\n               <source&gt;${jdk.version}<\/source&gt;\n               <target&gt;${jdk.version}<\/target&gt;\n            <\/configuration&gt;\n         <\/plugin&gt;\n         <plugin&gt;\n            <groupId&gt;org.jooq.trial<\/groupId&gt;\n            <artifactId&gt;jooq-codegen-maven<\/artifactId&gt;\n            <version&gt;3.11.3<\/version&gt;\n            <executions&gt;\n               <execution&gt;\n                  <goals&gt;\n                     <goal&gt;generate<\/goal&gt;\n                  <\/goals&gt;\n               <\/execution&gt;\n            <\/executions&gt;\n            <dependencies&gt;\n               <dependency&gt;\n                  <groupId&gt;oracle<\/groupId&gt;\n                  <artifactId&gt;ojdbc8<\/artifactId&gt;\n                  <version&gt;12.2.0.1.0<\/version&gt;\n               <\/dependency&gt;\n            <\/dependencies&gt;\n            <configuration&gt;\n               <jdbc&gt;\n                  <driver&gt;oracle.jdbc.OracleDriver<\/driver&gt;\n                  <url&gt;jdbc:oracle:thin:@localhost:1521\/odb.docker<\/url&gt;\n                  <user&gt;jooq<\/user&gt;\n                  <password&gt;jooq<\/password&gt;\n               <\/jdbc&gt;\n               <generator&gt;\n                  <database&gt;\n                     <name&gt;org.jooq.meta.oracle.OracleDatabase<\/name&gt;\n                     <includes&gt;HR\\..*|SYS\\.DBMS_MONITOR<\/includes&gt;\n                  <\/database&gt;\n                  <target&gt;\n                     <packageName&gt;com.trivadis.jooq.pinkdb.model.generated<\/packageName&gt;\n                     <directory&gt;src\/main\/java<\/directory&gt;\n                  <\/target&gt;\n               <\/generator&gt;\n            <\/configuration&gt;\n         <\/plugin&gt;\n      <\/plugins&gt;\n   <\/build&gt;\n   <dependencies&gt;\n      <dependency&gt;\n         <groupId&gt;org.jooq.trial<\/groupId&gt;\n         <artifactId&gt;jooq<\/artifactId&gt;\n         <version&gt;3.11.3<\/version&gt;\n      <\/dependency&gt;\n      <dependency&gt;\n         <groupId&gt;oracle<\/groupId&gt;\n         <artifactId&gt;ojdbc8<\/artifactId&gt;\n         <version&gt;12.2.0.1.0<\/version&gt;\n      <\/dependency&gt;\n   <\/dependencies&gt;\n<\/project&gt;\" 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: #808080\">&lt;<\/span><span style=\"color: #569CD6\">project<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">xmlns<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">xmlns:xsi<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #9CDCFE\">xsi:schemaLocation<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">modelVersion<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">4.0.0<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">modelVersion<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">com.trivadis.pinkdb.jooq<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jooq-pinkdb<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">0.0.1-SNAPSHOT<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">properties<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">project.build.sourceEncoding<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">UTF-8<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">project.build.sourceEncoding<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">jdk.version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">1.8<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">jdk.version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">xtend.version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">2.12.0<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">xtend.version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">properties<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">build<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">plugins<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">plugin<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">org.apache.maven.plugins<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">3.8.0<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">maven-compiler-plugin<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">configuration<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">source<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">${jdk.version}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">source<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">target<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">${jdk.version}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">target<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">configuration<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">plugin<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">plugin<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">org.jooq.trial<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jooq-codegen-maven<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">3.11.3<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">executions<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">execution<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">goals<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">goal<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">generate<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">goal<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">goals<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">execution<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">executions<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">dependencies<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">oracle<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">ojdbc8<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">12.2.0.1.0<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">dependencies<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">configuration<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">jdbc<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">driver<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">oracle.jdbc.OracleDriver<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">driver<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">url<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jdbc:oracle:thin:@localhost:1521\/odb.docker<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">url<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">user<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jooq<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">user<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">password<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jooq<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">password<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">jdbc<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">generator<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">database<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">org.jooq.meta.oracle.OracleDatabase<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">includes<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">HR\\..*|SYS\\.DBMS_MONITOR<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">includes<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">database<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">target<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">packageName<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">com.trivadis.jooq.pinkdb.model.generated<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">packageName<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">directory<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">src\/main\/java<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">directory<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">target<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">generator<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">configuration<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">plugin<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">plugins<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">build<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">dependencies<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">org.jooq.trial<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">jooq<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">3.11.3<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">oracle<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">groupId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">ojdbc8<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">artifactId<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">12.2.0.1.0<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">version<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">dependency<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">dependencies<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">project<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s the excerpt of the console output (of <code>mvn package<\/code>) regarding the generation run:<\/p>\n\n\n<div class=\"accordion\"><div class=\"mfn-acc accordion_wrapper \"><br \/>\n<div class=\"question\"><div class=\"title\"><i class=\"icon-plus acc-icon-plus\" aria-hidden=\"true\"><\/i><i class=\"icon-minus acc-icon-minus\" aria-hidden=\"true\"><\/i>JOOQ generator output<\/div><div class=\"answer\"><\/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(3 * 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\">JOOQ Generator Output<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&#091;INFO&#093; --- jooq-codegen-maven:3.11.3:generate (default) @ jooq-pinkdb ---\n&#091;INFO&#093; No &lt;inputCatalog\/&gt; was provided. Generating ALL available catalogs instead.\n&#091;INFO&#093; No &lt;inputSchema\/&gt; was provided. Generating ALL available schemata instead.\n&#091;INFO&#093; License parameters       \n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;   Thank you for using jOOQ and jOOQ's code generator\n&#091;INFO&#093;                          \n&#091;INFO&#093; Database parameters      \n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;   dialect                : ORACLE\n&#091;INFO&#093;   URL                    : jdbc:oracle:thin:@localhost:1521\/odb.docker\n&#091;INFO&#093;   target dir             : \/Users\/phs\/git\/JooqPinkDB\/src\/main\/java\n&#091;INFO&#093;   target package         : com.trivadis.jooq.pinkdb.model.generated\n&#091;INFO&#093;   includes               : &#091;HR\\..*|SYS\\.DBMS_MONITOR&#093;\n&#091;INFO&#093;   excludes               : &#091;&#093;\n&#091;INFO&#093;   includeExcludeColumns  : false\n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;                          \n&#091;INFO&#093; JavaGenerator parameters \n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;   annotations (generated): true\n&#091;INFO&#093;   annotations (JPA: any) : false\n&#091;INFO&#093;   annotations (JPA: version): \n&#091;INFO&#093;   annotations (validation): false\n&#091;INFO&#093;   comments               : true\n&#091;INFO&#093;   comments on attributes : true\n&#091;INFO&#093;   comments on catalogs   : true\n&#091;INFO&#093;   comments on columns    : true\n&#091;INFO&#093;   comments on keys       : true\n&#091;INFO&#093;   comments on links      : true\n&#091;INFO&#093;   comments on packages   : true\n&#091;INFO&#093;   comments on parameters : true\n&#091;INFO&#093;   comments on queues     : true\n&#091;INFO&#093;   comments on routines   : true\n&#091;INFO&#093;   comments on schemas    : true\n&#091;INFO&#093;   comments on sequences  : true\n&#091;INFO&#093;   comments on tables     : true\n&#091;INFO&#093;   comments on udts       : true\n&#091;INFO&#093;   daos                   : false\n&#091;INFO&#093;   deprecated code        : true\n&#091;INFO&#093;   global references (any): true\n&#091;INFO&#093;   global references (catalogs): true\n&#091;INFO&#093;   global references (keys): true\n&#091;INFO&#093;   global references (links): true\n&#091;INFO&#093;   global references (queues): true\n&#091;INFO&#093;   global references (routines): true\n&#091;INFO&#093;   global references (schemas): true\n&#091;INFO&#093;   global references (sequences): true\n&#091;INFO&#093;   global references (tables): true\n&#091;INFO&#093;   global references (udts): true\n&#091;INFO&#093;   indexes                : true\n&#091;INFO&#093;   instance fields        : true\n&#091;INFO&#093;   interfaces             : false\n&#091;INFO&#093;   interfaces (immutable) : false\n&#091;INFO&#093;   javadoc                : true\n&#091;INFO&#093;   keys                   : true\n&#091;INFO&#093;   links                  : true\n&#091;INFO&#093;   pojos                  : false\n&#091;INFO&#093;   pojos (immutable)      : false\n&#091;INFO&#093;   queues                 : true\n&#091;INFO&#093;   records                : true\n&#091;INFO&#093;   routines               : true\n&#091;INFO&#093;   sequences              : true\n&#091;INFO&#093;   table-valued functions : false\n&#091;INFO&#093;   tables                 : true\n&#091;INFO&#093;   udts                   : true\n&#091;INFO&#093;   relations              : true\n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;                          \n&#091;INFO&#093; Generation remarks       \n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093;                          \n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093; Generating catalogs      : Total: 1\n&#091;INFO&#093; \n                                      \n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@@@@@@@@@@@@@@@@  @@        @@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@\n@@@@@@@@@@@@@@@@  @@  @@    @@@@@@@@@@\n@@@@@@@@@@  @@@@  @@  @@    @@@@@@@@@@\n@@@@@@@@@@        @@        @@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@@@@@@@@@@        @@        @@@@@@@@@@\n@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@\n@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@\n@@@@@@@@@@        @@  @  @  @@@@@@@@@@\n@@@@@@@@@@        @@        @@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Thank you for using the 30 day free jOOQ 3.11.3 trial edition\n                                      \n&#091;INFO&#093; Packages fetched         : 517 (1 included, 516 excluded)\n&#091;INFO&#093; Applying synonym         : &quot;PUBLIC&quot;.&quot;KU$_LOGENTRY&quot; is synonym for &quot;SYS&quot;.&quot;KU$_LOGENTRY1010&quot;\n&#091;INFO&#093; Applying synonym         : &quot;PUBLIC&quot;.&quot;XMLTYPE&quot; is synonym for &quot;SYS&quot;.&quot;XMLTYPE&quot;\n&#091;INFO&#093; ARRAYs fetched           : 641 (0 included, 641 excluded)\n&#091;INFO&#093; Enums fetched            : 0 (0 included, 0 excluded)\n&#091;INFO&#093; No schema version is applied for catalog . Regenerating.\n&#091;INFO&#093;                          \n&#091;INFO&#093; Generating catalog       : DefaultCatalog.java\n&#091;INFO&#093; ==========================================================\n&#091;INFO&#093; Routines fetched         : 312 (0 included, 312 excluded)\n&#091;INFO&#093; Tables fetched           : 2347 (7 included, 2340 excluded)\n&#091;INFO&#093; UDTs fetched             : 1287 (0 included, 1287 excluded)\n&#091;INFO&#093; Generating schemata      : Total: 63\n&#091;INFO&#093; No schema version is applied for schema SYS. Regenerating.\n&#091;INFO&#093; Generating schema        : Sys.java\n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093; Sequences fetched        : 12 (0 included, 12 excluded)\n&#091;INFO&#093; Domains fetched          : 0 (0 included, 0 excluded)\n&#091;INFO&#093; Generating packages      \n&#091;INFO&#093; Generating package       : SYS.DBMS_MONITOR\n&#091;INFO&#093; Generating routine       : ClientIdStatDisable.java\n&#091;INFO&#093; Generating routine       : ClientIdStatEnable.java\n&#091;INFO&#093; Generating routine       : ClientIdTraceDisable.java\n&#091;INFO&#093; Generating routine       : ClientIdTraceEnable.java\n&#091;INFO&#093; Generating routine       : DatabaseTraceDisable.java\n&#091;INFO&#093; Generating routine       : DatabaseTraceEnable.java\n&#091;INFO&#093; Generating routine       : ServModActStatDisable.java\n&#091;INFO&#093; Generating routine       : ServModActStatEnable.java\n&#091;INFO&#093; Generating routine       : ServModActTraceDisable.java\n&#091;INFO&#093; Generating routine       : ServModActTraceEnable.java\n&#091;INFO&#093; Generating routine       : SessionTraceDisable.java\n&#091;INFO&#093; Generating routine       : SessionTraceEnable.java\n&#091;INFO&#093; Packages generated       : Total: 7.009s\n&#091;INFO&#093; UDT not supported or not in input schemata: SYS.SCHEDULER$_EVENT_INFO\n&#091;INFO&#093; UDT not supported or not in input schemata: SYS.SCHEDULER_FILEWATCHER_RESULT\n&#091;INFO&#093; Queues fetched           : 0 (0 included, 0 excluded)\n&#091;INFO&#093; Links fetched            : 0 (0 included, 0 excluded)\n&#091;INFO&#093; Generation finished: SYS : Total: 7.482s, +473.374ms\n&#091;INFO&#093;                          \n&#091;INFO&#093; Excluding empty schema   : AUDSYS\n&#091;INFO&#093; Excluding empty schema   : SYSTEM\n&#091;INFO&#093; Excluding empty schema   : SYSBACKUP\n&#091;INFO&#093; Excluding empty schema   : SYSDG\n&#091;INFO&#093; Excluding empty schema   : SYSKM\n&#091;INFO&#093; Excluding empty schema   : SYSRAC\n&#091;INFO&#093; Excluding empty schema   : OUTLN\n&#091;INFO&#093; Excluding empty schema   : XS$NULL\n&#091;INFO&#093; Excluding empty schema   : GSMADMIN_INTERNAL\n&#091;INFO&#093; Excluding empty schema   : GSMUSER\n&#091;INFO&#093; Excluding empty schema   : DIP\n&#091;INFO&#093; Excluding empty schema   : REMOTE_SCHEDULER_AGENT\n&#091;INFO&#093; Excluding empty schema   : DBSFWUSER\n&#091;INFO&#093; Excluding empty schema   : ORACLE_OCM\n&#091;INFO&#093; Excluding empty schema   : SYS$UMF\n&#091;INFO&#093; Excluding empty schema   : DBSNMP\n&#091;INFO&#093; Excluding empty schema   : APPQOSSYS\n&#091;INFO&#093; Excluding empty schema   : GSMCATUSER\n&#091;INFO&#093; Excluding empty schema   : GGSYS\n&#091;INFO&#093; Excluding empty schema   : XDB\n&#091;INFO&#093; Excluding empty schema   : ANONYMOUS\n&#091;INFO&#093; Excluding empty schema   : WMSYS\n&#091;INFO&#093; Excluding empty schema   : DVF\n&#091;INFO&#093; Excluding empty schema   : OJVMSYS\n&#091;INFO&#093; Excluding empty schema   : CTXSYS\n&#091;INFO&#093; Excluding empty schema   : ORDSYS\n&#091;INFO&#093; Excluding empty schema   : ORDDATA\n&#091;INFO&#093; Excluding empty schema   : ORDPLUGINS\n&#091;INFO&#093; Excluding empty schema   : SI_INFORMTN_SCHEMA\n&#091;INFO&#093; Excluding empty schema   : MDSYS\n&#091;INFO&#093; Excluding empty schema   : OLAPSYS\n&#091;INFO&#093; Excluding empty schema   : MDDATA\n&#091;INFO&#093; Excluding empty schema   : LBACSYS\n&#091;INFO&#093; Excluding empty schema   : DVSYS\n&#091;INFO&#093; Excluding empty schema   : FLOWS_FILES\n&#091;INFO&#093; Excluding empty schema   : APEX_PUBLIC_USER\n&#091;INFO&#093; Excluding empty schema   : APEX_180100\n&#091;INFO&#093; Excluding empty schema   : APEX_INSTANCE_ADMIN_USER\n&#091;INFO&#093; Excluding empty schema   : APEX_LISTENER\n&#091;INFO&#093; Excluding empty schema   : APEX_REST_PUBLIC_USER\n&#091;INFO&#093; Excluding empty schema   : ORDS_METADATA\n&#091;INFO&#093; Excluding empty schema   : ORDS_PUBLIC_USER\n&#091;INFO&#093; Excluding empty schema   : SCOTT\n&#091;INFO&#093; No schema version is applied for schema HR. Regenerating.\n&#091;INFO&#093; Generating schema        : Hr.java\n&#091;INFO&#093; ----------------------------------------------------------\n&#091;INFO&#093; Generating tables        \n&#091;INFO&#093; Adding foreign key       : SYS_C0012240 (HR.COUNTRIES_V.REGION_ID) referencing SYS_C0012239\n&#091;INFO&#093; Adding foreign key       : SYS_C0012241 (HR.DEPARTMENTS_V.LOCATION_ID) referencing SYS_C0012238\n&#091;INFO&#093; Adding foreign key       : SYS_C0012242 (HR.DEPARTMENTS_V.MANAGER_ID) referencing SYS_C0012235\n&#091;INFO&#093; Adding foreign key       : SYS_C0012244 (HR.EMPLOYEES_V.DEPARTMENT_ID) referencing SYS_C0012234\n&#091;INFO&#093; Adding foreign key       : SYS_C0012245 (HR.EMPLOYEES_V.JOB_ID) referencing SYS_C0012237\n&#091;INFO&#093; Adding foreign key       : SYS_C0012246 (HR.EMPLOYEES_V.MANAGER_ID) referencing SYS_C0012235\n&#091;INFO&#093; Adding foreign key       : SYS_C0012247 (HR.JOB_HISTORY_V.DEPARTMENT_ID) referencing SYS_C0012234\n&#091;INFO&#093; Adding foreign key       : SYS_C0012248 (HR.JOB_HISTORY_V.EMPLOYEE_ID) referencing SYS_C0012235\n&#091;INFO&#093; Adding foreign key       : SYS_C0012249 (HR.JOB_HISTORY_V.JOB_ID) referencing SYS_C0012237\n&#091;INFO&#093; Adding foreign key       : SYS_C0012250 (HR.LOCATIONS_V.COUNTRY_ID) referencing SYS_C0012233\n&#091;INFO&#093; Synthetic primary keys   : 0 (0 included, 0 excluded)\n&#091;INFO&#093; Overriding primary keys  : 8 (0 included, 8 excluded)\n&#091;INFO&#093; Generating table         : CountriesV.java &#091;input=COUNTRIES_V, output=COUNTRIES_V, pk=SYS_C0012233&#093;\n&#091;INFO&#093; Indexes fetched          : 0 (0 included, 0 excluded)\n&#091;INFO&#093; Generating table         : DepartmentsV.java &#091;input=DEPARTMENTS_V, output=DEPARTMENTS_V, pk=SYS_C0012234&#093;\n&#091;INFO&#093; Generating table         : EmployeesV.java &#091;input=EMPLOYEES_V, output=EMPLOYEES_V, pk=SYS_C0012235&#093;\n&#091;INFO&#093; Generating table         : JobsV.java &#091;input=JOBS_V, output=JOBS_V, pk=SYS_C0012237&#093;\n&#091;INFO&#093; Generating table         : JobHistoryV.java &#091;input=JOB_HISTORY_V, output=JOB_HISTORY_V, pk=SYS_C0012236&#093;\n&#091;INFO&#093; Generating table         : LocationsV.java &#091;input=LOCATIONS_V, output=LOCATIONS_V, pk=SYS_C0012238&#093;\n&#091;INFO&#093; Generating table         : RegionsV.java &#091;input=REGIONS_V, output=REGIONS_V, pk=SYS_C0012239&#093;\n&#091;INFO&#093; Tables generated         : Total: 13.888s, +6.405s\n&#091;INFO&#093; Generating table references\n&#091;INFO&#093; Table refs generated     : Total: 13.889s, +1.9ms\n&#091;INFO&#093; Generating Keys          \n&#091;INFO&#093; Keys generated           : Total: 13.9s, +10.228ms\n&#091;INFO&#093; Generating Indexes       \n&#091;INFO&#093; Skipping empty indexes   \n&#091;INFO&#093; Generating table records \n&#091;INFO&#093; Generating record        : CountriesVRecord.java\n&#091;INFO&#093; Generating record        : DepartmentsVRecord.java\n&#091;INFO&#093; Generating record        : EmployeesVRecord.java\n&#091;INFO&#093; Generating record        : JobsVRecord.java\n&#091;INFO&#093; Generating record        : JobHistoryVRecord.java\n&#091;INFO&#093; Generating record        : LocationsVRecord.java\n&#091;INFO&#093; Generating record        : RegionsVRecord.java\n&#091;INFO&#093; Table records generated  : Total: 13.939s, +39.368ms\n&#091;INFO&#093; Generation finished: HR  : Total: 13.939s, +0.14ms\n&#091;INFO&#093;                          \n&#091;INFO&#093; Excluding empty schema   : OE\n&#091;INFO&#093; Excluding empty schema   : PM\n&#091;INFO&#093; Excluding empty schema   : IX\n&#091;INFO&#093; Excluding empty schema   : SH\n&#091;INFO&#093; Excluding empty schema   : BI\n&#091;INFO&#093; Excluding empty schema   : FTLDB\n&#091;INFO&#093; Excluding empty schema   : TEPLSQL\n&#091;INFO&#093; Excluding empty schema   : ODDGEN\n&#091;INFO&#093; Excluding empty schema   : OGDEMO\n&#091;INFO&#093; Excluding empty schema   : AQDEMO\n&#091;INFO&#093; Excluding empty schema   : AX\n&#091;INFO&#093; Excluding empty schema   : EMPTRACKER\n&#091;INFO&#093; Excluding empty schema   : UT3\n&#091;INFO&#093; Excluding empty schema   : PLSCOPE\n&#091;INFO&#093; Excluding empty schema   : SONAR\n&#091;INFO&#093; Excluding empty schema   : TVDCA\n&#091;INFO&#093; Excluding empty schema   : DEMO\n&#091;INFO&#093; Excluding empty schema   : JOOQ\n&#091;INFO&#093; Removing excess files\" 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\">[INFO] --- jooq-codegen-maven:3.11.3:generate (default) @ jooq-pinkdb ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] No &lt;inputCatalog\/&gt; was provided. Generating ALL available catalogs instead.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] No &lt;inputSchema\/&gt; was provided. Generating ALL available schemata instead.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] License parameters       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   Thank you for using jOOQ and jOOQ&#39;s code generator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Database parameters      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   dialect                : ORACLE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   URL                    : jdbc:oracle:thin:@localhost:1521\/odb.docker<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   target dir             : \/Users\/phs\/git\/JooqPinkDB\/src\/main\/java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   target package         : com.trivadis.jooq.pinkdb.model.generated<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   includes               : [HR\\..*|SYS\\.DBMS_MONITOR]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   excludes               : []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   includeExcludeColumns  : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] JavaGenerator parameters <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   annotations (generated): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   annotations (JPA: any) : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   annotations (JPA: version): <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   annotations (validation): false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments               : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on attributes : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on catalogs   : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on columns    : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on keys       : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on links      : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on packages   : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on parameters : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on queues     : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on routines   : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on schemas    : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on sequences  : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on tables     : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   comments on udts       : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   daos                   : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   deprecated code        : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (any): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (catalogs): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (keys): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (links): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (queues): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (routines): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (schemas): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (sequences): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (tables): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   global references (udts): true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   indexes                : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   instance fields        : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   interfaces             : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   interfaces (immutable) : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   javadoc                : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   keys                   : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   links                  : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   pojos                  : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   pojos (immutable)      : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   queues                 : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   records                : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   routines               : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   sequences              : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   table-valued functions : false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   tables                 : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   udts                   : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]   relations              : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generation remarks       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating catalogs      : Total: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] <\/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>\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>\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>\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>\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>\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\">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Thank you for using the 30 day free jOOQ 3.11.3 trial edition<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Packages fetched         : 517 (1 included, 516 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Applying synonym         : &quot;PUBLIC&quot;.&quot;KU$_LOGENTRY&quot; is synonym for &quot;SYS&quot;.&quot;KU$_LOGENTRY1010&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Applying synonym         : &quot;PUBLIC&quot;.&quot;XMLTYPE&quot; is synonym for &quot;SYS&quot;.&quot;XMLTYPE&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ARRAYs fetched           : 641 (0 included, 641 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Enums fetched            : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] No schema version is applied for catalog . Regenerating.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating catalog       : DefaultCatalog.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ==========================================================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Routines fetched         : 312 (0 included, 312 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Tables fetched           : 2347 (7 included, 2340 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] UDTs fetched             : 1287 (0 included, 1287 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating schemata      : Total: 63<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] No schema version is applied for schema SYS. Regenerating.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating schema        : Sys.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Sequences fetched        : 12 (0 included, 12 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Domains fetched          : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating packages      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating package       : SYS.DBMS_MONITOR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ClientIdStatDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ClientIdStatEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ClientIdTraceDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ClientIdTraceEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : DatabaseTraceDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : DatabaseTraceEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ServModActStatDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ServModActStatEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ServModActTraceDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : ServModActTraceEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : SessionTraceDisable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating routine       : SessionTraceEnable.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Packages generated       : Total: 7.009s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] UDT not supported or not in input schemata: SYS.SCHEDULER$_EVENT_INFO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] UDT not supported or not in input schemata: SYS.SCHEDULER_FILEWATCHER_RESULT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Queues fetched           : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Links fetched            : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generation finished: SYS : Total: 7.482s, +473.374ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : AUDSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYSTEM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYSBACKUP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYSDG<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYSKM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYSRAC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : OUTLN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : XS$NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : GSMADMIN_INTERNAL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : GSMUSER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DIP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : REMOTE_SCHEDULER_AGENT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DBSFWUSER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORACLE_OCM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SYS$UMF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DBSNMP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APPQOSSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : GSMCATUSER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : GGSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : XDB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ANONYMOUS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : WMSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DVF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : OJVMSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : CTXSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORDSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORDDATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORDPLUGINS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SI_INFORMTN_SCHEMA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : MDSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : OLAPSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : MDDATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : LBACSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DVSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : FLOWS_FILES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APEX_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APEX_180100<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APEX_INSTANCE_ADMIN_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APEX_LISTENER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : APEX_REST_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORDS_METADATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ORDS_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SCOTT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] No schema version is applied for schema HR. Regenerating.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating schema        : Hr.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] ----------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating tables        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012240 (HR.COUNTRIES_V.REGION_ID) referencing SYS_C0012239<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012241 (HR.DEPARTMENTS_V.LOCATION_ID) referencing SYS_C0012238<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012242 (HR.DEPARTMENTS_V.MANAGER_ID) referencing SYS_C0012235<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012244 (HR.EMPLOYEES_V.DEPARTMENT_ID) referencing SYS_C0012234<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012245 (HR.EMPLOYEES_V.JOB_ID) referencing SYS_C0012237<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012246 (HR.EMPLOYEES_V.MANAGER_ID) referencing SYS_C0012235<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012247 (HR.JOB_HISTORY_V.DEPARTMENT_ID) referencing SYS_C0012234<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012248 (HR.JOB_HISTORY_V.EMPLOYEE_ID) referencing SYS_C0012235<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012249 (HR.JOB_HISTORY_V.JOB_ID) referencing SYS_C0012237<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Adding foreign key       : SYS_C0012250 (HR.LOCATIONS_V.COUNTRY_ID) referencing SYS_C0012233<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Synthetic primary keys   : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Overriding primary keys  : 8 (0 included, 8 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : CountriesV.java [input=COUNTRIES_V, output=COUNTRIES_V, pk=SYS_C0012233]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Indexes fetched          : 0 (0 included, 0 excluded)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : DepartmentsV.java [input=DEPARTMENTS_V, output=DEPARTMENTS_V, pk=SYS_C0012234]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : EmployeesV.java [input=EMPLOYEES_V, output=EMPLOYEES_V, pk=SYS_C0012235]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : JobsV.java [input=JOBS_V, output=JOBS_V, pk=SYS_C0012237]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : JobHistoryV.java [input=JOB_HISTORY_V, output=JOB_HISTORY_V, pk=SYS_C0012236]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : LocationsV.java [input=LOCATIONS_V, output=LOCATIONS_V, pk=SYS_C0012238]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table         : RegionsV.java [input=REGIONS_V, output=REGIONS_V, pk=SYS_C0012239]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Tables generated         : Total: 13.888s, +6.405s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table references<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Table refs generated     : Total: 13.889s, +1.9ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating Keys          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Keys generated           : Total: 13.9s, +10.228ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating Indexes       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Skipping empty indexes   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating table records <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : CountriesVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : DepartmentsVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : EmployeesVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : JobsVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : JobHistoryVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : LocationsVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generating record        : RegionsVRecord.java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Table records generated  : Total: 13.939s, +39.368ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Generation finished: HR  : Total: 13.939s, +0.14ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO]                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : OE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : PM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : IX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : BI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : FTLDB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : TEPLSQL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : ODDGEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : OGDEMO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : AQDEMO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : AX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : EMPTRACKER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : UT3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : PLSCOPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : SONAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : TVDCA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : DEMO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Excluding empty schema   : JOOQ<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">[INFO] Removing excess files<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n<br \/>\n<\/div><\/div>\n\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"run_simple_query\"><\/a>7. Run a Simple Query<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following code is a complete Java program. It contains a bit more than the simple query because I will need these parts in the next chapters and would like to focus on the JOOQ query only.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Java Program (JOOQ Query)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On line 3 the view-API is imported statically. This allows to reference the view <code>JOBS_V<\/code> instead of&nbsp; <code>JobsV.JOBS_V<\/code> or <code>Hr.JOBS_V<\/code>. It&#8217;s just convenience, but it makes the code much more readable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The next static import on line 4 allows for example to use SQL functions such as <code>count()<\/code>, <code>sum()<\/code>, etc. without the <code>DSL.<\/code> prefix. Again, it&#8217;s just convenience, but makes to code shorter and improves readability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 27-28, the DSL context is initialized.\u00a0 The context holds the connection to the database and some configuration. In this case I&#8217;ve configured JOOQ to produce formatted SQL statements and fetch data with an array size of 30 from the database. The JDBC default is 10, which is not bad, but 30 is in our case better, since it reduces the network roundtrips to 1 for all SQL query results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 64-67, we build the SQL statement using the JOOQ DSL. The statement is equivalent to <code>SELECT * FROM hr.jobs_v ORDER BY job_id<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, on line 68 the function <code>fetchAndPrint<\/code> is called. This function prints the query produced by JOOQ, all used bind variables and the query result. See lines 51, 59 and 60.<\/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\">Simple Query &#8211; Java Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"package com.trivadis.jooq.pinkdb;\n\nimport static com.trivadis.jooq.pinkdb.model.generated.hr.Tables.*;\nimport static org.jooq.impl.DSL.*;\n\nimport com.trivadis.jooq.pinkdb.model.generated.sys.packages.DbmsMonitor;\n\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.SQLException;\nimport java.util.List;\n\nimport org.jooq.DSLContext;\nimport org.jooq.Result;\nimport org.jooq.ResultQuery;\nimport org.jooq.SQLDialect;\nimport org.jooq.conf.Settings;\nimport org.jooq.impl.DSL;\n\npublic class Main {\n   private static DSLContext ctx;\n   private static boolean sqlTrace = false;\n   \n   private static void initCtx(boolean withSqlTrace) throws SQLException {\n      final Connection conn = DriverManager.getConnection(\n            &quot;jdbc:oracle:thin:@localhost:1521\/odb.docker&quot;, &quot;jooq&quot;, &quot;jooq&quot;);\n      ctx = DSL.using(conn, SQLDialect.ORACLE12C, \n            new Settings().withRenderFormatted(true).withFetchSize(30));\n      sqlTrace = withSqlTrace;\n      enableSqlTrace();\n   }\n   \n   private static void closeCtx() throws SQLException {\n      disableSqlTrace();\n      ctx.close();\n   }\n   \n   private static void enableSqlTrace() throws SQLException {\n      if (sqlTrace) {\n         DbmsMonitor.sessionTraceEnable(ctx.configuration(), null, null, true, true, &quot;all_executions&quot;);\n      }\n   }\n\n   private static void disableSqlTrace() throws SQLException {\n      if (sqlTrace) {\n         DbmsMonitor.sessionTraceDisable(ctx.configuration(), null, null);\n      }\n   }\n   \n   private static void fetchAndPrint(String name, ResultQuery<?&gt; query) {\n      System.out.println(name + &quot;: \\n\\n&quot; + query.getSQL());\n      final List<Object&gt; binds = query.getBindValues();\n      if (binds.size() &gt; 0) {\n         System.out.println(&quot;\\n&quot; + name + &quot; binds:&quot;);\n         for (int i=0; i<binds.size(); i++) {\n            System.out.println(&quot;   &quot; + &quot;:&quot; + (i+1) + &quot; = &quot; + binds.get(i));\n         }\n      }\n      final Result<?&gt; result = query.fetch();\n      System.out.println(&quot;\\n&quot; + name + &quot; result (&quot; + result.size() + &quot; rows): \\n\\n&quot; + result.format());            \n   }\n   \n   private static void queryJobs() {\n      final ResultQuery<?&gt; query = ctx\n            .select()\n            .from(JOBS_V)\n            .orderBy(JOBS_V.JOB_ID);\n      fetchAndPrint(&quot;Jobs&quot;, query);\n   }\n   \n   public static void main(String[] args) throws SQLException {\n      initCtx(true);\n      queryJobs();\n      closeCtx();\n   }\n}\" 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\">package<\/span><span style=\"color: #D4D4D4\"> com.trivadis.jooq.pinkdb;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> com.trivadis.jooq.pinkdb.model.generated.hr.Tables.*;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> org.jooq.impl.DSL.*;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> com.trivadis.jooq.pinkdb.model.generated.sys.packages.DbmsMonitor;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> java.sql.Connection;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> java.sql.DriverManager;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> java.sql.SQLException;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> java.util.List;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.DSLContext;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.Result;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.ResultQuery;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.SQLDialect;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.conf.Settings;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">import<\/span><span style=\"color: #D4D4D4\"> org.jooq.impl.DSL;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Main<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">DSLContext<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">boolean<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sqlTrace<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><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\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">initCtx<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">boolean<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">withSqlTrace<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Connection<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">conn<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">DriverManager<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getConnection<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #CE9178\">&quot;jdbc:oracle:thin:@localhost:1521\/odb.docker&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;jooq&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;jooq&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      ctx = <\/span><span style=\"color: #9CDCFE\">DSL<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">using<\/span><span style=\"color: #D4D4D4\">(conn, <\/span><span style=\"color: #9CDCFE\">SQLDialect<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ORACLE12C<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Settings<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">withRenderFormatted<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">withFetchSize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      sqlTrace = withSqlTrace;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">enableSqlTrace<\/span><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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">closeCtx<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">disableSqlTrace<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">close<\/span><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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">enableSqlTrace<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (sqlTrace) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">DbmsMonitor<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">sessionTraceEnable<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">configuration<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;all_executions&quot;<\/span><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>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">disableSqlTrace<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (sqlTrace) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">DbmsMonitor<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">sessionTraceDisable<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">configuration<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">out<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(name + <\/span><span style=\"color: #CE9178\">&quot;: <\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getSQL<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">Object<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">binds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getBindValues<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">binds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">() &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">out<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\"> + name + <\/span><span style=\"color: #CE9178\">&quot; binds:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i&lt;<\/span><span style=\"color: #9CDCFE\">binds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">(); i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">out<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;   &quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #CE9178\">&quot;:&quot;<\/span><span style=\"color: #D4D4D4\"> + (i+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&quot; = &quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">binds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(i));<\/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 cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Result<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">fetch<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">out<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\"> + name + <\/span><span style=\"color: #CE9178\">&quot; result (&quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">() + <\/span><span style=\"color: #CE9178\">&quot; rows): <\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">format<\/span><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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">queryJobs<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\"> = ctx<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">select<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(JOBS_V)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">orderBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">JOB_ID<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Jobs&quot;<\/span><span style=\"color: #D4D4D4\">, query);<\/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\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">args<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">initCtx<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">queryJobs<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">closeCtx<\/span><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><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Java Program Output (SQL Query &amp; Result)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The program produces this output:<\/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\">Simple Query &#8211; SQL Query &amp; Result<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Jobs: \n\nselect \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;\nfrom &quot;HR&quot;.&quot;JOBS_V&quot;\norder by &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;\n\nJobs result (19 rows): \n\n+----------+-------------------------------+----------+----------+\n|JOB_ID    |JOB_TITLE                      |MIN_SALARY|MAX_SALARY|\n+----------+-------------------------------+----------+----------+\n|AC_ACCOUNT|Public Accountant              |      4200|      9000|\n|AC_MGR    |Accounting Manager             |      8200|     16000|\n|AD_ASST   |Administration Assistant       |      3000|      6000|\n|AD_PRES   |President                      |     20080|     40000|\n|AD_VP     |Administration Vice President  |     15000|     30000|\n|FI_ACCOUNT|Accountant                     |      4200|      9000|\n|FI_MGR    |Finance Manager                |      8200|     16000|\n|HR_REP    |Human Resources Representative |      4000|      9000|\n|IT_PROG   |Programmer                     |      4000|     10000|\n|MK_MAN    |Marketing Manager              |      9000|     15000|\n|MK_REP    |Marketing Representative       |      4000|      9000|\n|PR_REP    |Public Relations Representative|      4500|     10500|\n|PU_CLERK  |Purchasing Clerk               |      2500|      5500|\n|PU_MAN    |Purchasing Manager             |      8000|     15000|\n|SA_MAN    |Sales Manager                  |     10000|     20080|\n|SA_REP    |Sales Representative           |      6000|     12008|\n|SH_CLERK  |Shipping Clerk                 |      2500|      5500|\n|ST_CLERK  |Stock Clerk                    |      2008|      5000|\n|ST_MAN    |Stock Manager                  |      5500|      8500|\n+----------+-------------------------------+----------+----------+\" 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\">Jobs: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">select <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">from &quot;HR&quot;.&quot;JOBS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">order by &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Jobs result (19 rows): <\/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\">|JOB_ID    |JOB_TITLE                      |MIN_SALARY|MAX_SALARY|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+----------+-------------------------------+----------+----------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|AC_ACCOUNT|Public Accountant              |      4200|      9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|AC_MGR    |Accounting Manager             |      8200|     16000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|AD_ASST   |Administration Assistant       |      3000|      6000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|AD_PRES   |President                      |     20080|     40000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|AD_VP     |Administration Vice President  |     15000|     30000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|FI_ACCOUNT|Accountant                     |      4200|      9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|FI_MGR    |Finance Manager                |      8200|     16000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|HR_REP    |Human Resources Representative |      4000|      9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|IT_PROG   |Programmer                     |      4000|     10000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|MK_MAN    |Marketing Manager              |      9000|     15000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|MK_REP    |Marketing Representative       |      4000|      9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|PR_REP    |Public Relations Representative|      4500|     10500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|PU_CLERK  |Purchasing Clerk               |      2500|      5500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|PU_MAN    |Purchasing Manager             |      8000|     15000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|SA_MAN    |Sales Manager                  |     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|SA_REP    |Sales Representative           |      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|SH_CLERK  |Shipping Clerk                 |      2500|      5500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|ST_CLERK  |Stock Clerk                    |      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|ST_MAN    |Stock Manager                  |      5500|      8500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+----------+-------------------------------+----------+----------+<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Two things are interesting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, the generated <code>SELECT<\/code> statement lists all columns, even if no column was defined in the query on program line 65.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second, the output is formatted nicely. Where did this happen? On line 59 the query is executed and the result is saved in the local variable named\u00a0<code>result<\/code>. This is a result set and contains all rows. For example, you may get the number of rows via <code>result.size()<\/code>, as on line 60. I may also loop through the result set and do whatever I want. In this case, I just used a convenience function <code>format<\/code> to format the result set as text. There are other convenience functions such as <code>formatCSV<\/code>, <code>formatHTML<\/code>, <code>formatJSON<\/code> or <code>formatXML<\/code>.\u00a0 You may guess by the name what they are doing. Nice!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Trace Output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Java program produces a SQL Trace file by default. See program line 40. Here&#8217;s the relevant <code>tkprof<\/code> excerpt:<\/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\">Simple Query &#8211; TKPROF excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"call     count       cpu    elapsed       disk      query    current        rows\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\nParse        1      0.03       0.18          0          0          0           0\nExecute      1      0.00       0.00          0          0          0           0\nFetch        1      0.00       0.00          0          2          0          19\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\ntotal        3      0.03       0.18          0          2          0          19\n\nMisses in library cache during parse: 1\nOptimizer mode: ALL_ROWS\nParsing user id: 133  \nNumber of plan statistics captured: 1\n\nRows (1st) Rows (avg) Rows (max)  Row Source Operation\n---------- ---------- ----------  ---------------------------------------------------\n        19         19         19  TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=45 us starts=1 cost=2 size=627 card=19)\n        19         19         19   INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=18 us starts=1 cost=1 size=0 card=19)(object id 78619)\n\n\nElapsed times include waiting on following events:\n  Event waited on                             Times   Max. Wait  Total Waited\n  ----------------------------------------   Waited  ----------  ------------\n  SQL*Net message to client                       1        0.00          0.00\n  SQL*Net message from client                     1        0.10          0.10\" 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\">call     count       cpu    elapsed       disk      query    current        rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parse        1      0.03       0.18          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Execute      1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">Fetch        1      0.00       0.00          0          2          0          19<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">total        3      0.03       0.18          0          2          0          19<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during parse: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Optimizer mode: ALL_ROWS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parsing user id: 133  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Number of plan statistics captured: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Rows (1st) Rows (avg) Rows (max)  Row Source Operation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- ----------  ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19  TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=45 us starts=1 cost=2 size=627 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19   INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=18 us starts=1 cost=1 size=0 card=19)(object id 78619)<\/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\">Elapsed times include waiting on following events:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Event waited on                             Times   Max. Wait  Total Waited<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ----------------------------------------   Waited  ----------  ------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message to client                       1        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message from client                     1        0.10          0.10<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Interesting is line 5 of the output. There was just one fetch to retrieve 19 rows. A default configuration of the JDBC driver would have caused two fetches. Our configuration on program line 28 worked. All data fetched in a single network roundtrip.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"using_joins\"><\/a>8. Using Joins &amp; Aggregations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the next example we query the salaries per location. The idea is to look at a JOOQ query with joins and aggregations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JOOQ Query<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 6-8, you see how aggregate functions are used in JOOQ and how to define an alias for the resulting column.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Line 10 is interesting. It defines the join using the <code>onKey<\/code> function. This function requires a parameter when multiple join paths are possible. In this case <code>EMPLOYEE_V<\/code> and <code>DEPARTMENTS_V<\/code> may be joined either via <code>DEPARTMENTS_V.MANAGER_ID<\/code> or via <code>EMPLOYEES_V.DEPARTMENT_ID<\/code>. In this case we defined the latter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On line 11 the <code>onKey<\/code> function has no parameters, since only one join path exists to <code>LOCATIONS<\/code>. This clearly shows how JOOQ uses our referential integrity constraints on the view-API to build the query. The idea is similar to\u00a0a <code>NATURAL JOIN<\/code>, but the implementation is better since it relies on constraints and not naming conventions. I already miss this feature in SQL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The use of the functions <code>groupBy<\/code> and <code>orderBy<\/code> on line 14 and 15 should be self-explanatory.<\/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\">Joins &amp; Aggregations &#8211; JOOQ Query<\/span><span role=\"button\" tabindex=\"0\" data-code=\"   private static void querySalariesPerLocation() {\n      final ResultQuery<?&gt; query = ctx\n            .select(REGIONS_V.REGION_NAME,\n                  COUNTRIES_V.COUNTRY_NAME,\n                  LOCATIONS_V.CITY,\n                  count().as(&quot;employees&quot;),\n                  sum(EMPLOYEES_V.SALARY).as(&quot;sum_salaray&quot;),\n                  max(EMPLOYEES_V.SALARY).as(&quot;max_salary&quot;))\n            .from(EMPLOYEES_V)\n            .join(DEPARTMENTS_V).onKey(EMPLOYEES_V.DEPARTMENT_ID)\n            .join(LOCATIONS_V).onKey()\n            .join(COUNTRIES_V).onKey()\n            .join(REGIONS_V).onKey()\n            .groupBy(REGIONS_V.REGION_NAME, COUNTRIES_V.COUNTRY_NAME, LOCATIONS_V.CITY)\n            .orderBy(REGIONS_V.REGION_NAME, COUNTRIES_V.COUNTRY_NAME, LOCATIONS_V.CITY);\n      fetchAndPrint(&quot;Salaries Per Location&quot;, query);\n   }\" 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\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">querySalariesPerLocation<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\"> = ctx<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">select<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">REGIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">REGION_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">COUNTRIES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">COUNTRY_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">LOCATIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CITY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #DCDCAA\">count<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">as<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;employees&quot;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">as<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;sum_salaray&quot;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #DCDCAA\">max<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">as<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;max_salary&quot;<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(EMPLOYEES_V)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(DEPARTMENTS_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">DEPARTMENT_ID<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(LOCATIONS_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(COUNTRIES_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(REGIONS_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">groupBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">REGIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">REGION_NAME<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">COUNTRIES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">COUNTRY_NAME<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">LOCATIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CITY<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">orderBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">REGIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">REGION_NAME<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">COUNTRIES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">COUNTRY_NAME<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">LOCATIONS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CITY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Salaries Per Location&quot;<\/span><span style=\"color: #D4D4D4\">, query);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Query &amp; Result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No surprises. The query looks as expected.<\/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\">Joins &amp; Aggregations &#8211; SQL Query &amp; Result<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Salaries Per Location: \n\nselect \n  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, \n  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, \n  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;, \n  count(*) &quot;employees&quot;, \n  sum(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) &quot;sum_salaray&quot;, \n  max(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) &quot;max_salary&quot;\nfrom &quot;HR&quot;.&quot;EMPLOYEES_V&quot;\n  join &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;\n  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;DEPARTMENT_ID&quot; = &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;.&quot;DEPARTMENT_ID&quot;\n  join &quot;HR&quot;.&quot;LOCATIONS_V&quot;\n  on &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;.&quot;LOCATION_ID&quot; = &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;LOCATION_ID&quot;\n  join &quot;HR&quot;.&quot;COUNTRIES_V&quot;\n  on &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;COUNTRY_ID&quot; = &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_ID&quot;\n  join &quot;HR&quot;.&quot;REGIONS_V&quot;\n  on &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;REGION_ID&quot; = &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_ID&quot;\ngroup by \n  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, \n  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, \n  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;\norder by \n  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, \n  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, \n  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;\n\n\nSalaries Per Location result (7 rows): \n\n+-----------+------------------------+-------------------+---------+-----------+----------+\n|REGION_NAME|COUNTRY_NAME            |CITY               |employees|sum_salaray|max_salary|\n+-----------+------------------------+-------------------+---------+-----------+----------+\n|Americas   |Canada                  |Toronto            |        2|      19000|     13000|\n|Americas   |United States of America|Seattle            |       18|     159216|     24000|\n|Americas   |United States of America|South San Francisco|       45|     156400|      8200|\n|Americas   |United States of America|Southlake          |        5|      28800|      9000|\n|Europe     |Germany                 |Munich             |        1|      10000|     10000|\n|Europe     |United Kingdom          |London             |        1|       6500|      6500|\n|Europe     |United Kingdom          |Oxford             |       34|     304500|     14000|\n+-----------+------------------------+-------------------+---------+-----------+----------+\" 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\">Salaries Per Location: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">select <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  count(*) &quot;employees&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  sum(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) &quot;sum_salaray&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  max(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) &quot;max_salary&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">from &quot;HR&quot;.&quot;EMPLOYEES_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;DEPARTMENT_ID&quot; = &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;.&quot;DEPARTMENT_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;LOCATIONS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;DEPARTMENTS_V&quot;.&quot;LOCATION_ID&quot; = &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;LOCATION_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;COUNTRIES_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;COUNTRY_ID&quot; = &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;REGIONS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;REGION_ID&quot; = &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">group by <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">order by <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;REGIONS_V&quot;.&quot;REGION_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;COUNTRIES_V&quot;.&quot;COUNTRY_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;LOCATIONS_V&quot;.&quot;CITY&quot;<\/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\">Salaries Per Location result (7 rows): <\/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\">|REGION_NAME|COUNTRY_NAME            |CITY               |employees|sum_salaray|max_salary|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-----------+------------------------+-------------------+---------+-----------+----------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Americas   |Canada                  |Toronto            |        2|      19000|     13000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Americas   |United States of America|Seattle            |       18|     159216|     24000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Americas   |United States of America|South San Francisco|       45|     156400|      8200|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Americas   |United States of America|Southlake          |        5|      28800|      9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Europe     |Germany                 |Munich             |        1|      10000|     10000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Europe     |United Kingdom          |London             |        1|       6500|      6500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Europe     |United Kingdom          |Oxford             |       34|     304500|     14000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-----------+------------------------+-------------------+---------+-----------+----------+<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Trace Output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the <code>tkprof<\/code> output we see that parsing took more than a second. This is a bit too long for this kind of query. However, that is not a problem of JOOQ. Beside that, the output looks good. Single network roundtrip as expected.<\/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\">Joins &amp; Aggregations &#8211; TKPROF excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"call     count       cpu    elapsed       disk      query    current        rows\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\nParse        1      0.24       1.09          0          0          0           0\nExecute      1      0.00       0.00          0          0          0           0\nFetch        1      0.00       0.00          0         22          0           7\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\ntotal        3      0.25       1.09          0         22          0           7\n\nMisses in library cache during parse: 1\nOptimizer mode: ALL_ROWS\nParsing user id: 133  \nNumber of plan statistics captured: 1\n\nRows (1st) Rows (avg) Rows (max)  Row Source Operation\n---------- ---------- ----------  ---------------------------------------------------\n         7          7          7  SORT GROUP BY (cr=24 pr=0 pw=0 time=8817 us starts=1 cost=12 size=5512 card=106)\n       106        106        106   HASH JOIN  (cr=24 pr=0 pw=0 time=8745 us starts=1 cost=11 size=5512 card=106)\n        27         27         27    MERGE JOIN  (cr=16 pr=0 pw=0 time=294 us starts=1 cost=8 size=1215 card=27)\n         3          3          3     TABLE ACCESS BY INDEX ROWID REGIONS (cr=2 pr=0 pw=0 time=43 us starts=1 cost=2 size=56 card=4)\n         3          3          3      INDEX FULL SCAN REG_ID_PK (cr=1 pr=0 pw=0 time=11 us starts=1 cost=1 size=0 card=4)(object id 78609)\n        27         27         27     SORT JOIN (cr=14 pr=0 pw=0 time=251 us starts=3 cost=6 size=837 card=27)\n        27         27         27      VIEW  VW_GBF_23 (cr=14 pr=0 pw=0 time=328 us starts=1 cost=5 size=837 card=27)\n        27         27         27       NESTED LOOPS  (cr=14 pr=0 pw=0 time=325 us starts=1 cost=5 size=999 card=27)\n        27         27         27        MERGE JOIN  (cr=10 pr=0 pw=0 time=238 us starts=1 cost=5 size=594 card=27)\n        19         19         19         TABLE ACCESS BY INDEX ROWID LOCATIONS (cr=2 pr=0 pw=0 time=32 us starts=1 cost=2 size=345 card=23)\n        19         19         19          INDEX FULL SCAN LOC_ID_PK (cr=1 pr=0 pw=0 time=26 us starts=1 cost=1 size=0 card=23)(object id 78613)\n        27         27         27         SORT JOIN (cr=8 pr=0 pw=0 time=189 us starts=19 cost=3 size=189 card=27)\n        27         27         27          VIEW  index$_join$_013 (cr=8 pr=0 pw=0 time=163 us starts=1 cost=2 size=189 card=27)\n        27         27         27           HASH JOIN  (cr=8 pr=0 pw=0 time=162 us starts=1)\n        27         27         27            INDEX FAST FULL SCAN DEPT_ID_PK (cr=4 pr=0 pw=0 time=35 us starts=1 cost=1 size=189 card=27)(object id 78616)\n        27         27         27            INDEX FAST FULL SCAN DEPT_LOCATION_IX (cr=4 pr=0 pw=0 time=15 us starts=1 cost=1 size=189 card=27)(object id 78631)\n        27         27         27        INDEX UNIQUE SCAN COUNTRY_C_ID_PK (cr=4 pr=0 pw=0 time=20 us starts=27 cost=0 size=15 card=1)(object id 78611)\n       107        107        107    TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=35 us starts=1 cost=3 size=749 card=107)\n\n\nElapsed times include waiting on following events:\n  Event waited on                             Times   Max. Wait  Total Waited\n  ----------------------------------------   Waited  ----------  ------------\n  SQL*Net message to client                       1        0.00          0.00\n  PGA memory operation                            1        0.00          0.00\n  SQL*Net message from client                     1        0.01          0.01\" 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\">call     count       cpu    elapsed       disk      query    current        rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">Parse        1      0.24       1.09          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Execute      1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Fetch        1      0.00       0.00          0         22          0           7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">total        3      0.25       1.09          0         22          0           7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during parse: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Optimizer mode: ALL_ROWS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parsing user id: 133  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Number of plan statistics captured: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Rows (1st) Rows (avg) Rows (max)  Row Source Operation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- ----------  ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         7          7          7  SORT GROUP BY (cr=24 pr=0 pw=0 time=8817 us starts=1 cost=12 size=5512 card=106)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       106        106        106   HASH JOIN  (cr=24 pr=0 pw=0 time=8745 us starts=1 cost=11 size=5512 card=106)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27    MERGE JOIN  (cr=16 pr=0 pw=0 time=294 us starts=1 cost=8 size=1215 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         3          3          3     TABLE ACCESS BY INDEX ROWID REGIONS (cr=2 pr=0 pw=0 time=43 us starts=1 cost=2 size=56 card=4)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         3          3          3      INDEX FULL SCAN REG_ID_PK (cr=1 pr=0 pw=0 time=11 us starts=1 cost=1 size=0 card=4)(object id 78609)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27     SORT JOIN (cr=14 pr=0 pw=0 time=251 us starts=3 cost=6 size=837 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27      VIEW  VW_GBF_23 (cr=14 pr=0 pw=0 time=328 us starts=1 cost=5 size=837 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27       NESTED LOOPS  (cr=14 pr=0 pw=0 time=325 us starts=1 cost=5 size=999 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27        MERGE JOIN  (cr=10 pr=0 pw=0 time=238 us starts=1 cost=5 size=594 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19         TABLE ACCESS BY INDEX ROWID LOCATIONS (cr=2 pr=0 pw=0 time=32 us starts=1 cost=2 size=345 card=23)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19          INDEX FULL SCAN LOC_ID_PK (cr=1 pr=0 pw=0 time=26 us starts=1 cost=1 size=0 card=23)(object id 78613)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27         SORT JOIN (cr=8 pr=0 pw=0 time=189 us starts=19 cost=3 size=189 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27          VIEW  index$_join$_013 (cr=8 pr=0 pw=0 time=163 us starts=1 cost=2 size=189 card=27)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27           HASH JOIN  (cr=8 pr=0 pw=0 time=162 us starts=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27            INDEX FAST FULL SCAN DEPT_ID_PK (cr=4 pr=0 pw=0 time=35 us starts=1 cost=1 size=189 card=27)(object id 78616)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27            INDEX FAST FULL SCAN DEPT_LOCATION_IX (cr=4 pr=0 pw=0 time=15 us starts=1 cost=1 size=189 card=27)(object id 78631)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        27         27         27        INDEX UNIQUE SCAN COUNTRY_C_ID_PK (cr=4 pr=0 pw=0 time=20 us starts=27 cost=0 size=15 card=1)(object id 78611)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107    TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=35 us starts=1 cost=3 size=749 card=107)<\/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\">Elapsed times include waiting on following events:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Event waited on                             Times   Max. Wait  Total Waited<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ----------------------------------------   Waited  ----------  ------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message to client                       1        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PGA memory operation                            1        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message from client                     1        0.01          0.01<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"using_binds\"><\/a>9. Using Bind Variables<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Parsing can be costly, as we have seen in the previous example. Using bind variables can reduce parsing. In this case I&#8217;d like to see how I can avoid hard- and soft-parsing. See <a href=\"http:\/\/www.orafaq.com\/wiki\/Parsing\">Oracle FAQs<\/a> for good parsing definitions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JOOQ Query<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">JOOQ automatically creates bind variables for the usages of\u00a0<code>fromSalary<\/code> and <code>toSalary<\/code>\u00a0on line 23. This means that JOOQ eliminates unnecessary hard parses by design. To eliminate unnecessary soft-parses we have to ensure that the Java statement behind the scenes is not closed. JOOQ provides the <code>keepStatement<\/code> function for that purpose as used on line 25. When using this function we are responsible to close the statement. We do so on line 7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We call the query twice. See lines 36 and 37. On the first call, the bind variables are set automatically by JOOQ when building the <code>preparedQuery<\/code>. On subsequent calls the <code>preparedQuery<\/code>\u00a0is reused and its bind variable values are changed. See line 27 and 28. Fetching and printing works as for the other JOOQ queries. The only difference is, that the statement is not closed after the last row is fetched.<\/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\">Bind Variables &#8211; JOOQ Query<\/span><span role=\"button\" tabindex=\"0\" data-code=\"public class Main {\n   private static ResultQuery<?&gt; preparedQuery;\n   (...)\n   private static void closeCtx() throws SQLException {\n      disableSqlTrace();\n      if (preparedQuery != null) {\n         preparedQuery.close();\n      }\n      ctx.close();\n   }\n   (...)\n   private static void queryEmployeesInSalaryRange(BigDecimal fromSalary, BigDecimal toSalary) {\n      if (preparedQuery == null) {\n         preparedQuery = ctx\n               .select(JOBS_V.JOB_TITLE,\n                     EMPLOYEES_V.LAST_NAME,\n                     EMPLOYEES_V.FIRST_NAME,\n                     EMPLOYEES_V.SALARY,\n                     JOBS_V.MIN_SALARY,\n                     JOBS_V.MAX_SALARY)\n               .from(EMPLOYEES_V)\n               .join(JOBS_V).onKey()\n               .where(EMPLOYEES_V.SALARY.between(fromSalary, toSalary))\n               .orderBy(EMPLOYEES_V.SALARY.desc())\n               .keepStatement(true);\n      } else {\n         preparedQuery.bind(1, fromSalary);\n         preparedQuery.bind(2, toSalary);\n      }\n      fetchAndPrint(&quot;Employees in Salary Range&quot;, preparedQuery);\n   }\n   (...)\n   public static void main(String[] args) throws SQLException {\n      initCtx(true);\n      (...)\n      queryEmployeesInSalaryRange(BigDecimal.valueOf(13000), BigDecimal.valueOf(100000));\n      queryEmployeesInSalaryRange(BigDecimal.valueOf(10000), BigDecimal.valueOf(13000));\n      closeCtx();\n   }\n}\" 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\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Main<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">preparedQuery<\/span><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\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">closeCtx<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">disableSqlTrace<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (preparedQuery != <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">preparedQuery<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">close<\/span><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: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">close<\/span><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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">queryEmployeesInSalaryRange<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">BigDecimal<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">fromSalary<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">BigDecimal<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">toSalary<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (preparedQuery == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         preparedQuery = ctx<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">select<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">JOB_TITLE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">LAST_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">FIRST_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MIN_SALARY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MAX_SALARY<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(EMPLOYEES_V)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(JOBS_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">where<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">between<\/span><span style=\"color: #D4D4D4\">(fromSalary, toSalary))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">orderBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">desc<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">               .<\/span><span style=\"color: #DCDCAA\">keepStatement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">preparedQuery<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">bind<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, fromSalary);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #9CDCFE\">preparedQuery<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">bind<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, toSalary);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Employees in Salary Range&quot;<\/span><span style=\"color: #D4D4D4\">, preparedQuery);<\/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\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">args<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">throws<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SQLException<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">initCtx<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      (...)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">queryEmployeesInSalaryRange<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">BigDecimal<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">valueOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">13000<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #9CDCFE\">BigDecimal<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">valueOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">queryEmployeesInSalaryRange<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">BigDecimal<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">valueOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10000<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #9CDCFE\">BigDecimal<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">valueOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">13000<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">closeCtx<\/span><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><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Query &amp; Result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We are executing the query twice. Hence we see two output sets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 13\/45, you see the bind variable placeholders (?).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On lines 17-18\/49-50, you see the values of the bind variables.<\/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\">Plaintext<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Employees in Salary Range: \n\nselect \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;\nfrom &quot;HR&quot;.&quot;EMPLOYEES_V&quot;\n  join &quot;HR&quot;.&quot;JOBS_V&quot;\n  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;\nwhere &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; between ? and ?\norder by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; desc\n\nEmployees in Salary Range binds:\n   :1 = 13000\n   :2 = 100000\n\nEmployees in Salary Range result (6 rows): \n\n+-----------------------------+---------+----------+------+----------+----------+\n|JOB_TITLE                    |LAST_NAME|FIRST_NAME|SALARY|MIN_SALARY|MAX_SALARY|\n+-----------------------------+---------+----------+------+----------+----------+\n|President                    |King     |Steven    | 24000|     20080|     40000|\n|Administration Vice President|Kochhar  |Neena     | 17000|     15000|     30000|\n|Administration Vice President|De Haan  |Lex       | 17000|     15000|     30000|\n|Sales Manager                |Russell  |John      | 14000|     10000|     20080|\n|Sales Manager                |Partners |Karen     | 13500|     10000|     20080|\n|Marketing Manager            |Hartstein|Michael   | 13000|      9000|     15000|\n+-----------------------------+---------+----------+------+----------+----------+\n\nEmployees in Salary Range: \n\nselect \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;\nfrom &quot;HR&quot;.&quot;EMPLOYEES_V&quot;\n  join &quot;HR&quot;.&quot;JOBS_V&quot;\n  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;\nwhere &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; between ? and ?\norder by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; desc\n\nEmployees in Salary Range binds:\n   :1 = 10000\n   :2 = 13000\n\nEmployees in Salary Range result (14 rows): \n\n+-------------------------------+---------+----------+------+----------+----------+\n|JOB_TITLE                      |LAST_NAME|FIRST_NAME|SALARY|MIN_SALARY|MAX_SALARY|\n+-------------------------------+---------+----------+------+----------+----------+\n|Marketing Manager              |Hartstein|Michael   | 13000|      9000|     15000|\n|Finance Manager                |Greenberg|Nancy     | 12008|      8200|     16000|\n|Accounting Manager             |Higgins  |Shelley   | 12008|      8200|     16000|\n|Sales Manager                  |Errazuriz|Alberto   | 12000|     10000|     20080|\n|Sales Representative           |Ozer     |Lisa      | 11500|      6000|     12008|\n|Purchasing Manager             |Raphaely |Den       | 11000|      8000|     15000|\n|Sales Manager                  |Cambrault|Gerald    | 11000|     10000|     20080|\n|Sales Representative           |Abel     |Ellen     | 11000|      6000|     12008|\n|Sales Representative           |Vishney  |Clara     | 10500|      6000|     12008|\n|Sales Manager                  |Zlotkey  |Eleni     | 10500|     10000|     20080|\n|Sales Representative           |Tucker   |Peter     | 10000|      6000|     12008|\n|Sales Representative           |Bloom    |Harrison  | 10000|      6000|     12008|\n|Public Relations Representative|Baer     |Hermann   | 10000|      4500|     10500|\n|Sales Representative           |King     |Janette   | 10000|      6000|     12008|\n+-------------------------------+---------+----------+------+----------+----------+\" 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\">Employees in Salary Range: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">select <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">from &quot;HR&quot;.&quot;EMPLOYEES_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;JOBS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">where &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; between ? and ?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">order by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; desc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Employees in Salary Range binds:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   :1 = 13000<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   :2 = 100000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Employees in Salary Range result (6 rows): <\/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\">|JOB_TITLE                    |LAST_NAME|FIRST_NAME|SALARY|MIN_SALARY|MAX_SALARY|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-----------------------------+---------+----------+------+----------+----------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|President                    |King     |Steven    | 24000|     20080|     40000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Administration Vice President|Kochhar  |Neena     | 17000|     15000|     30000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Administration Vice President|De Haan  |Lex       | 17000|     15000|     30000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                |Russell  |John      | 14000|     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                |Partners |Karen     | 13500|     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Marketing Manager            |Hartstein|Michael   | 13000|      9000|     15000|<\/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\">Employees in Salary Range: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">select <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">from &quot;HR&quot;.&quot;EMPLOYEES_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;JOBS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">where &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; between ? and ?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">order by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot; desc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Employees in Salary Range binds:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   :1 = 10000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   :2 = 13000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Employees in Salary Range result (14 rows): <\/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\">|JOB_TITLE                      |LAST_NAME|FIRST_NAME|SALARY|MIN_SALARY|MAX_SALARY|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-------------------------------+---------+----------+------+----------+----------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Marketing Manager              |Hartstein|Michael   | 13000|      9000|     15000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Finance Manager                |Greenberg|Nancy     | 12008|      8200|     16000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Accounting Manager             |Higgins  |Shelley   | 12008|      8200|     16000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                  |Errazuriz|Alberto   | 12000|     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |Ozer     |Lisa      | 11500|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Purchasing Manager             |Raphaely |Den       | 11000|      8000|     15000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                  |Cambrault|Gerald    | 11000|     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |Abel     |Ellen     | 11000|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |Vishney  |Clara     | 10500|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                  |Zlotkey  |Eleni     | 10500|     10000|     20080|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |Tucker   |Peter     | 10000|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |Bloom    |Harrison  | 10000|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Public Relations Representative|Baer     |Hermann   | 10000|      4500|     10500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |King     |Janette   | 10000|      6000|     12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-------------------------------+---------+----------+------+----------+----------+<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Trace Output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>tkprof<\/code> excerpt on line 4 shows that the query is executed twice. Line 3 reveals that the query is parsed only once. The total of 20 rows are read in two network roundtrips. That&#8217;s perfect.<\/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\">Bind Variables &#8211; TKPROF excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"call     count       cpu    elapsed       disk      query    current        rows\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\nParse        1      0.00       0.00          0          0          0           0\nExecute      2      0.01       0.05          0          0          0           0\nFetch        2      0.00       0.00          0         16          0          20\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\ntotal        5      0.01       0.05          0         16          0          20\n\nMisses in library cache during parse: 1\nMisses in library cache during execute: 1\nOptimizer mode: ALL_ROWS\nParsing user id: 133  \nNumber of plan statistics captured: 2\n\nRows (1st) Rows (avg) Rows (max)  Row Source Operation\n---------- ---------- ----------  ---------------------------------------------------\n         6         10         14  SORT ORDER BY (cr=8 pr=0 pw=0 time=160 us starts=1 cost=7 size=366 card=6)\n         6         10         14   FILTER  (cr=8 pr=0 pw=0 time=156 us starts=1)\n         6         10         14    MERGE JOIN  (cr=8 pr=0 pw=0 time=153 us starts=1 cost=6 size=366 card=6)\n        16         16         17     TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=38 us starts=1 cost=2 size=627 card=19)\n        16         16         17      INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=20 us starts=1 cost=1 size=0 card=19)(object id 78619)\n         6         10         14     SORT JOIN (cr=6 pr=0 pw=0 time=94 us starts=16 cost=4 size=168 card=6)\n         6         10         14      TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=68 us starts=1 cost=3 size=168 card=6)\n\n\nElapsed times include waiting on following events:\n  Event waited on                             Times   Max. Wait  Total Waited\n  ----------------------------------------   Waited  ----------  ------------\n  SQL*Net message to client                       2        0.00          0.00\n  SQL*Net message from client                     2        0.00          0.00\" 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\">call     count       cpu    elapsed       disk      query    current        rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">Parse        1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">Execute      2      0.01       0.05          0          0          0           0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">Fetch        2      0.00       0.00          0         16          0          20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">total        5      0.01       0.05          0         16          0          20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during parse: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during execute: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Optimizer mode: ALL_ROWS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parsing user id: 133  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Number of plan statistics captured: 2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Rows (1st) Rows (avg) Rows (max)  Row Source Operation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- ----------  ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         6         10         14  SORT ORDER BY (cr=8 pr=0 pw=0 time=160 us starts=1 cost=7 size=366 card=6)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         6         10         14   FILTER  (cr=8 pr=0 pw=0 time=156 us starts=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         6         10         14    MERGE JOIN  (cr=8 pr=0 pw=0 time=153 us starts=1 cost=6 size=366 card=6)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        16         16         17     TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=38 us starts=1 cost=2 size=627 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        16         16         17      INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=20 us starts=1 cost=1 size=0 card=19)(object id 78619)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         6         10         14     SORT JOIN (cr=6 pr=0 pw=0 time=94 us starts=16 cost=4 size=168 card=6)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         6         10         14      TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=68 us starts=1 cost=3 size=168 card=6)<\/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\">Elapsed times include waiting on following events:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Event waited on                             Times   Max. Wait  Total Waited<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ----------------------------------------   Waited  ----------  ------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message to client                       2        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message from client                     2        0.00          0.00<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"run_top_n_query\"><\/a>10. Run a Top N Query<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the next example we query the 4 employees with the lowest salary along with some general salary information. It&#8217;ll be interesting to see if JOOQ uses Oracle&#8217;s native top-n query syntax.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JOOQ Query<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On line 8 we see that JOOQ has no problems dealing with analytic functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On line 14 the top n query is defined. Limit the result to 4 rows with ties, this means rows with the same order by values are considered as well.<\/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\">Top N Query &#8211; JOOQ Query<\/span><span role=\"button\" tabindex=\"0\" data-code=\"   private static void queryTopBadEarners() {\n       final ResultQuery<?&gt; query = ctx\n            .select(JOBS_V.JOB_TITLE,\n                  EMPLOYEES_V.LAST_NAME,\n                  EMPLOYEES_V.FIRST_NAME,\n                  EMPLOYEES_V.HIRE_DATE,\n                  EMPLOYEES_V.SALARY,\n                  avg(EMPLOYEES_V.SALARY).over().partitionBy(EMPLOYEES_V.JOB_ID).as(&quot;avg_salary&quot;),\n                  JOBS_V.MIN_SALARY,\n                  JOBS_V.MAX_SALARY)\n            .from(EMPLOYEES_V)\n            .join(JOBS_V).onKey()\n            .orderBy(EMPLOYEES_V.SALARY)\n            .limit(4).withTies();\n      fetchAndPrint(&quot;Top 4 Bad Earners&quot;, query);\n   }\" 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\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">queryTopBadEarners<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">?<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\"> = ctx<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">select<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">JOB_TITLE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">LAST_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">FIRST_NAME<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">HIRE_DATE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #DCDCAA\">avg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">over<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">partitionBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">JOB_ID<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">as<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;avg_salary&quot;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MIN_SALARY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #9CDCFE\">JOBS_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MAX_SALARY<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(EMPLOYEES_V)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(JOBS_V).<\/span><span style=\"color: #DCDCAA\">onKey<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">orderBy<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">EMPLOYEES_V<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">SALARY<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #DCDCAA\">limit<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">withTies<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Top 4 Bad Earners&quot;<\/span><span style=\"color: #D4D4D4\">, query);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Query &amp; Result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The query crafted by JOOQ is a native Oracle top n query. See line 16. Very good.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interesting is, that JOOQ also creates a bind variable for the literal 4. This could be good or bad. If you want to use a literal instead of a bind variable, you can simply use <code>inline(4)<\/code>&nbsp; instead of <code>4<\/code>. The default behaviour of JOOQ reminds a little of <code>CURSOR_SHARING=FORCE<\/code>. But since you may control the behaviour on statement level, I think it is a good and sensible default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We got a result of 5 rows, because Landry and Gee both have a salary of 2400. That&#8217;s the result of <code>WITH TIES<\/code>.<\/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\">Top N Query &#8211; SQL Query &amp; Result<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Top 4 Bad Earners: \n\nselect \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;HIRE_DATE&quot;, \n  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, \n  avg(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) over (partition by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot;) &quot;avg_salary&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, \n  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;\nfrom &quot;HR&quot;.&quot;EMPLOYEES_V&quot;\n  join &quot;HR&quot;.&quot;JOBS_V&quot;\n  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;\norder by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;\nfetch next ? rows with ties\n\nTop 4 Bad Earners binds:\n   :1 = 4\n\nTop 4 Bad Earners result (5 rows): \n\n+-----------+----------+----------+----------+------+----------+----------+----------+\n|JOB_TITLE  |LAST_NAME |FIRST_NAME|HIRE_DATE |SALARY|avg_salary|MIN_SALARY|MAX_SALARY|\n+-----------+----------+----------+----------+------+----------+----------+----------+\n|Stock Clerk|Olson     |TJ        |2007-04-10|  2100|      2785|      2008|      5000|\n|Stock Clerk|Markle    |Steven    |2008-03-08|  2200|      2785|      2008|      5000|\n|Stock Clerk|Philtanker|Hazel     |2008-02-06|  2200|      2785|      2008|      5000|\n|Stock Clerk|Landry    |James     |2007-01-14|  2400|      2785|      2008|      5000|\n|Stock Clerk|Gee       |Ki        |2007-12-12|  2400|      2785|      2008|      5000|\n+-----------+----------+----------+----------+------+----------+----------+----------+\" 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\">Top 4 Bad Earners: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">select <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_TITLE&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;LAST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;FIRST_NAME&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;HIRE_DATE&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  avg(&quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;) over (partition by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot;) &quot;avg_salary&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MIN_SALARY&quot;, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;MAX_SALARY&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">from &quot;HR&quot;.&quot;EMPLOYEES_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  join &quot;HR&quot;.&quot;JOBS_V&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  on &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;JOB_ID&quot; = &quot;HR&quot;.&quot;JOBS_V&quot;.&quot;JOB_ID&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">order by &quot;HR&quot;.&quot;EMPLOYEES_V&quot;.&quot;SALARY&quot;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">fetch next ? rows with ties<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Top 4 Bad Earners binds:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   :1 = 4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Top 4 Bad Earners result (5 rows): <\/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\">|JOB_TITLE  |LAST_NAME |FIRST_NAME|HIRE_DATE |SALARY|avg_salary|MIN_SALARY|MAX_SALARY|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-----------+----------+----------+----------+------+----------+----------+----------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk|Olson     |TJ        |2007-04-10|  2100|      2785|      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk|Markle    |Steven    |2008-03-08|  2200|      2785|      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk|Philtanker|Hazel     |2008-02-06|  2200|      2785|      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk|Landry    |James     |2007-01-14|  2400|      2785|      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk|Gee       |Ki        |2007-12-12|  2400|      2785|      2008|      5000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-----------+----------+----------+----------+------+----------+----------+----------+<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Trace Output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>tkprof<\/code> excerpt looks good. Good performance, single network roundtrip.<\/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\">Top N Query &#8211; TKPROF excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"call     count       cpu    elapsed       disk      query    current        rows\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\nParse        1      0.00       0.00          0          0          0           0\nExecute      1      0.00       0.00          0          0          0           0\nFetch        1      0.00       0.00          0          8          0           5\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\ntotal        3      0.00       0.01          0          8          0           5\n\nMisses in library cache during parse: 1\nOptimizer mode: ALL_ROWS\nParsing user id: 133  \nNumber of plan statistics captured: 1\n\nRows (1st) Rows (avg) Rows (max)  Row Source Operation\n---------- ---------- ----------  ---------------------------------------------------\n         5          5          5  VIEW  (cr=8 pr=0 pw=0 time=335 us starts=1 cost=7 size=14124 card=107)\n        11         11         11   WINDOW SORT PUSHED RANK (cr=8 pr=0 pw=0 time=326 us starts=1 cost=7 size=7383 card=107)\n       107        107        107    WINDOW BUFFER (cr=8 pr=0 pw=0 time=260 us starts=1 cost=7 size=7383 card=107)\n       107        107        107     MERGE JOIN  (cr=8 pr=0 pw=0 time=634 us starts=1 cost=6 size=7383 card=107)\n        19         19         19      TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=42 us starts=1 cost=2 size=627 card=19)\n        19         19         19       INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=30 us starts=1 cost=1 size=0 card=19)(object id 78619)\n       107        107        107      SORT JOIN (cr=6 pr=0 pw=0 time=97 us starts=19 cost=4 size=3852 card=107)\n       107        107        107       TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=28 us starts=1 cost=3 size=3852 card=107)\n\n\nElapsed times include waiting on following events:\n  Event waited on                             Times   Max. Wait  Total Waited\n  ----------------------------------------   Waited  ----------  ------------\n  SQL*Net message to client                       1        0.00          0.00\n  SQL*Net message from client                     1        0.01          0.01\" 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\">call     count       cpu    elapsed       disk      query    current        rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parse        1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Execute      1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Fetch        1      0.00       0.00          0          8          0           5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">total        3      0.00       0.01          0          8          0           5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during parse: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Optimizer mode: ALL_ROWS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parsing user id: 133  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Number of plan statistics captured: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Rows (1st) Rows (avg) Rows (max)  Row Source Operation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- ----------  ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         5          5          5  VIEW  (cr=8 pr=0 pw=0 time=335 us starts=1 cost=7 size=14124 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        11         11         11   WINDOW SORT PUSHED RANK (cr=8 pr=0 pw=0 time=326 us starts=1 cost=7 size=7383 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107    WINDOW BUFFER (cr=8 pr=0 pw=0 time=260 us starts=1 cost=7 size=7383 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107     MERGE JOIN  (cr=8 pr=0 pw=0 time=634 us starts=1 cost=6 size=7383 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19      TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=42 us starts=1 cost=2 size=627 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19       INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=30 us starts=1 cost=1 size=0 card=19)(object id 78619)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107      SORT JOIN (cr=6 pr=0 pw=0 time=97 us starts=19 cost=4 size=3852 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107       TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=28 us starts=1 cost=3 size=3852 card=107)<\/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\">Elapsed times include waiting on following events:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Event waited on                             Times   Max. Wait  Total Waited<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ----------------------------------------   Waited  ----------  ------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message to client                       1        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message from client                     1        0.01          0.01<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"using_row_pattern_matching\"><\/a>11. Using Row Pattern Matching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What about <code>match_recognize<\/code>, does JOOQ support that? No, not currently. JOOQ has some limitations regarding SQL support. <code>match_recognize<\/code> is one and the <code>model_clause<\/code> is another. This is something to be expected, since the SQL grammar is still evolving. However, the question is, how do we deal with queries that must apply some SQL which cannot be created by JOOQ&#8217;s query builder? The solution is simple. We simply pass the pure SQL to JOOQ.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">&nbsp;JOOQ Query<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There are other ways to produce the same result without using <code>match_recognize<\/code>. However, if you would like to use JOOQ and <code>match_recognize<\/code> then you have to build the SQL yourself and pass it to JOOQ as on line 58.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s sad that Java still does not support multiline strings. The code is much simpler in other JVM languages that support multiline strings, such as Scala, Groovy, Kotlin or Xtend.<\/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\">Row Pattern Matching &#8211; JOOQ Query<\/span><span role=\"button\" tabindex=\"0\" data-code=\"   private static void queryBestPayedNewEntries() {\n      \/\/ using {{\\\\??\\\\}} instead of &quot;??&quot; to ensure JDBC does not interpret questions marks as a bind variable placeholders\n      \/\/ see https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/18\/jjdbc\/JDBC-reference-information.html#GUID-3454411C-5F24-4D46-83A9-5DA0BA704F5D\n      \/\/ documentation is wrong, escaping is required.\n      StringBuffer sb = new StringBuffer();\n      sb.append(&quot;WITH\\n&quot;);\n      sb.append(&quot;   base AS (\\n&quot;);\n      sb.append(&quot;      SELECT emp.employee_id,\\n&quot;);\n      sb.append(&quot;             emp.last_name,\\n&quot;);\n      sb.append(&quot;             emp.first_name,\\n&quot;);\n      sb.append(&quot;             job.job_title,\\n&quot;);\n      sb.append(&quot;             jhist.start_date,\\n&quot;);\n      sb.append(&quot;             emp.salary\\n&quot;);\n      sb.append(&quot;        FROM hr.employees_v emp\\n&quot;);\n      sb.append(&quot;        JOIN hr.job_history_v jhist\\n&quot;);\n      sb.append(&quot;          ON jhist.employee_id = emp.employee_id\\n&quot;);\n      sb.append(&quot;        JOIN hr.jobs_v job\\n&quot;);\n      sb.append(&quot;          ON job.job_id = jhist.job_id\\n&quot;);\n      sb.append(&quot;      UNION\\n&quot;);\n      sb.append(&quot;      SELECT emp.employee_id,\\n&quot;);\n      sb.append(&quot;             emp.last_name,\\n&quot;);\n      sb.append(&quot;             emp.first_name,\\n&quot;);\n      sb.append(&quot;             job.job_title,\\n&quot;);\n      sb.append(&quot;             emp.hire_date AS start_date,\\n&quot;);\n      sb.append(&quot;             emp.salary\\n&quot;);\n      sb.append(&quot;        FROM hr.employees_v emp\\n&quot;);\n      sb.append(&quot;        JOIN hr.jobs_v job\\n&quot;);\n      sb.append(&quot;          ON job.job_id = emp.job_id\\n&quot;);\n      sb.append(&quot;   ),\\n&quot;);\n      sb.append(&quot;   aggr AS (\\n&quot;);\n      sb.append(&quot;      SELECT employee_id,\\n&quot;);\n      sb.append(&quot;             last_name,\\n&quot;);\n      sb.append(&quot;             first_name,\\n&quot;);\n      sb.append(&quot;             job_title,\\n&quot;);\n      sb.append(&quot;             MAX(start_date) AS start_date,\\n&quot;);\n      sb.append(&quot;             salary,\\n&quot;);\n      sb.append(&quot;             MAX(salary) OVER (PARTITION BY job_title ORDER BY MAX(start_date)\\n&quot;);\n      sb.append(&quot;                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_salary\\n&quot;);\n      sb.append(&quot;        FROM base\\n&quot;);\n      sb.append(&quot;       GROUP BY employee_id, last_name, first_name, job_title, salary\\n&quot;);\n      sb.append(&quot;   )\\n&quot;);\n      sb.append(&quot;SELECT job_title, start_date, last_name, first_name, salary\\n&quot;);\n      sb.append(&quot;  FROM aggr MATCH_RECOGNIZE (\\n&quot;);\n      sb.append(&quot;          PARTITION BY job_title\\n&quot;);\n      sb.append(&quot;          ORDER BY start_date\\n&quot;);\n      sb.append(&quot;          MEASURES LAST(employee_id) AS employee_id,\\n&quot;);\n      sb.append(&quot;                   LAST(last_name) AS last_name,\\n&quot;);\n      sb.append(&quot;                   LAST(first_name) AS first_name,\\n&quot;);\n      sb.append(&quot;                   LAST(start_date) AS start_date,\\n&quot;);\n      sb.append(&quot;                   LAST(salary) AS salary\\n&quot;);\n      sb.append(&quot;          ONE ROW PER MATCH\\n&quot;);\n      sb.append(&quot;          PATTERN((strt down*){{\\\\??\\\\}} up)\\n&quot;);\n      sb.append(&quot;          DEFINE strt AS salary = MAX(max_salary),\\n&quot;);\n      sb.append(&quot;                 down AS salary < MAX(max_salary),\\n&quot;);\n      sb.append(&quot;                 up AS salary = MAX(max_salary)\\n&quot;);\n      sb.append(&quot;       )\\n&quot;);\n      sb.append(&quot; ORDER BY job_title, start_date&quot;);\n      final ResultQuery<Record&gt; query = ctx.resultQuery(sb.toString());\n      fetchAndPrint(&quot;Best Payed New Entries&quot;, query);\n   }\" 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\">   <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">queryBestPayedNewEntries<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ using {{\\\\??\\\\}} instead of &quot;??&quot; to ensure JDBC does not interpret questions marks as a bind variable placeholders<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ see https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/18\/jjdbc\/JDBC-reference-information.html#GUID-3454411C-5F24-4D46-83A9-5DA0BA704F5D<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ documentation is wrong, escaping is required.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #4EC9B0\">StringBuffer<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">StringBuffer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;WITH<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;   base AS (<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;      SELECT emp.employee_id,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.last_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.first_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             job.job_title,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             jhist.start_date,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        FROM hr.employees_v emp<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        JOIN hr.job_history_v jhist<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          ON jhist.employee_id = emp.employee_id<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        JOIN hr.jobs_v job<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          ON job.job_id = jhist.job_id<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;      UNION<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;      SELECT emp.employee_id,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.last_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.first_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             job.job_title,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.hire_date AS start_date,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             emp.salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        FROM hr.employees_v emp<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        JOIN hr.jobs_v job<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          ON job.job_id = emp.job_id<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;   ),<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;   aggr AS (<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;      SELECT employee_id,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             last_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             first_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             job_title,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             MAX(start_date) AS start_date,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             salary,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;             MAX(salary) OVER (PARTITION BY job_title ORDER BY MAX(start_date)<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;        FROM base<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;       GROUP BY employee_id, last_name, first_name, job_title, salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;   )<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;SELECT job_title, start_date, last_name, first_name, salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;  FROM aggr MATCH_RECOGNIZE (<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          PARTITION BY job_title<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          ORDER BY start_date<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          MEASURES LAST(employee_id) AS employee_id,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                   LAST(last_name) AS last_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                   LAST(first_name) AS first_name,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                   LAST(start_date) AS start_date,<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                   LAST(salary) AS salary<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          ONE ROW PER MATCH<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          PATTERN((strt down*){{<\/span><span style=\"color: #D7BA7D\">\\\\<\/span><span style=\"color: #CE9178\">??<\/span><span style=\"color: #D7BA7D\">\\\\<\/span><span style=\"color: #CE9178\">}} up)<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;          DEFINE strt AS salary = MAX(max_salary),<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                 down AS salary &lt; MAX(max_salary),<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;                 up AS salary = MAX(max_salary)<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;       )<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">append<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot; ORDER BY job_title, start_date&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">final<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">ResultQuery<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">Record<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">resultQuery<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toString<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">fetchAndPrint<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Best Payed New Entries&quot;<\/span><span style=\"color: #D4D4D4\">, query);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Query &amp; Result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On line 49 you see that <code>{\\??\\}<\/code>&nbsp; is used instead of <code>??<\/code>. This is a necessity for the JDBC driver. Otherwise, the driver would expect bind variables for these question marks. All Java-based tools such as SQL Developer and SQLcl do have the same &#8220;problem&#8221;.<\/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\">Row Pattern Matching &#8211; SQL Query &amp; Result<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Best Payed New Entries: \n\nWITH\n   base AS (\n      SELECT emp.employee_id,\n             emp.last_name,\n             emp.first_name,\n             job.job_title,\n             jhist.start_date,\n             emp.salary\n        FROM hr.employees_v emp\n        JOIN hr.job_history_v jhist\n          ON jhist.employee_id = emp.employee_id\n        JOIN hr.jobs_v job\n          ON job.job_id = jhist.job_id\n      UNION\n      SELECT emp.employee_id,\n             emp.last_name,\n             emp.first_name,\n             job.job_title,\n             emp.hire_date AS start_date,\n             emp.salary\n        FROM hr.employees_v emp\n        JOIN hr.jobs_v job\n          ON job.job_id = emp.job_id\n   ),\n   aggr AS (\n      SELECT employee_id,\n             last_name,\n             first_name,\n             job_title,\n             MAX(start_date) AS start_date,\n             salary,\n             MAX(salary) OVER (PARTITION BY job_title ORDER BY MAX(start_date)\n                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_salary\n        FROM base\n       GROUP BY employee_id, last_name, first_name, job_title, salary\n   )\nSELECT job_title, start_date, last_name, first_name, salary\n  FROM aggr MATCH_RECOGNIZE (\n          PARTITION BY job_title\n          ORDER BY start_date\n          MEASURES LAST(employee_id) AS employee_id,\n                   LAST(last_name) AS last_name,\n                   LAST(first_name) AS first_name,\n                   LAST(start_date) AS start_date,\n                   LAST(salary) AS salary\n          ONE ROW PER MATCH\n          PATTERN((strt down*){\\??\\} up)\n          DEFINE strt AS salary = MAX(max_salary),\n                 down AS salary < MAX(max_salary),\n                 up AS salary = MAX(max_salary)\n       )\n ORDER BY job_title, start_date\n\nBest Payed New Entries result (25 rows): \n\n+-------------------------------+----------+---------+----------+------+\n|JOB_TITLE                      |START_DATE|LAST_NAME|FIRST_NAME|SALARY|\n+-------------------------------+----------+---------+----------+------+\n|Accountant                     |2002-08-16|Faviet   |Daniel    |  9000|\n|Accounting Manager             |2001-10-28|Kochhar  |Neena     | 17000|\n|Administration Assistant       |2003-09-17|Whalen   |Jennifer  |  4400|\n|Administration Vice President  |2001-01-13|De Haan  |Lex       | 17000|\n|Administration Vice President  |2005-09-21|Kochhar  |Neena     | 17000|\n|Finance Manager                |2002-08-17|Greenberg|Nancy     | 12008|\n|Human Resources Representative |2002-06-07|Mavris   |Susan     |  6500|\n|Marketing Manager              |2004-02-17|Hartstein|Michael   | 13000|\n|Marketing Representative       |2004-02-17|Hartstein|Michael   | 13000|\n|President                      |2003-06-17|King     |Steven    | 24000|\n|Programmer                     |2001-01-13|De Haan  |Lex       | 17000|\n|Public Accountant              |1997-09-21|Kochhar  |Neena     | 17000|\n|Public Relations Representative|2002-06-07|Baer     |Hermann   | 10000|\n|Purchasing Clerk               |2003-05-18|Khoo     |Alexander |  3100|\n|Purchasing Manager             |2002-12-07|Raphaely |Den       | 11000|\n|Sales Manager                  |2004-10-01|Russell  |John      | 14000|\n|Sales Representative           |2004-01-30|King     |Janette   | 10000|\n|Sales Representative           |2004-05-11|Abel     |Ellen     | 11000|\n|Sales Representative           |2005-03-11|Ozer     |Lisa      | 11500|\n|Shipping Clerk                 |2004-01-27|Sarchand |Nandita   |  4200|\n|Stock Clerk                    |2003-07-14|Ladwig   |Renske    |  3600|\n|Stock Clerk                    |2006-03-24|Raphaely |Den       | 11000|\n|Stock Manager                  |2003-05-01|Kaufling |Payam     |  7900|\n|Stock Manager                  |2004-07-18|Weiss    |Matthew   |  8000|\n|Stock Manager                  |2005-04-10|Fripp    |Adam      |  8200|\n+-------------------------------+----------+---------+----------+------+\" 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\">Best Payed New Entries: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   base AS (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      SELECT emp.employee_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.last_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.first_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             job.job_title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             jhist.start_date,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        FROM hr.employees_v emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        JOIN hr.job_history_v jhist<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ON jhist.employee_id = emp.employee_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        JOIN hr.jobs_v job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ON job.job_id = jhist.job_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      SELECT emp.employee_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.last_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.first_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             job.job_title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.hire_date AS start_date,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             emp.salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        FROM hr.employees_v emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        JOIN hr.jobs_v job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ON job.job_id = emp.job_id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   aggr AS (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      SELECT employee_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             last_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             first_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             job_title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             MAX(start_date) AS start_date,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             salary,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             MAX(salary) OVER (PARTITION BY job_title ORDER BY MAX(start_date)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        FROM base<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       GROUP BY employee_id, last_name, first_name, job_title, salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SELECT job_title, start_date, last_name, first_name, salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  FROM aggr MATCH_RECOGNIZE (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          PARTITION BY job_title<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ORDER BY start_date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          MEASURES LAST(employee_id) AS employee_id,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   LAST(last_name) AS last_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   LAST(first_name) AS first_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   LAST(start_date) AS start_date,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   LAST(salary) AS salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ONE ROW PER MATCH<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          PATTERN((strt down*){\\??\\} up)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          DEFINE strt AS salary = MAX(max_salary),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 down AS salary &lt; MAX(max_salary),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 up AS salary = MAX(max_salary)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> ORDER BY job_title, start_date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Best Payed New Entries result (25 rows): <\/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\">|JOB_TITLE                      |START_DATE|LAST_NAME|FIRST_NAME|SALARY|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-------------------------------+----------+---------+----------+------+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Accountant                     |2002-08-16|Faviet   |Daniel    |  9000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Accounting Manager             |2001-10-28|Kochhar  |Neena     | 17000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Administration Assistant       |2003-09-17|Whalen   |Jennifer  |  4400|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Administration Vice President  |2001-01-13|De Haan  |Lex       | 17000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Administration Vice President  |2005-09-21|Kochhar  |Neena     | 17000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Finance Manager                |2002-08-17|Greenberg|Nancy     | 12008|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Human Resources Representative |2002-06-07|Mavris   |Susan     |  6500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Marketing Manager              |2004-02-17|Hartstein|Michael   | 13000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Marketing Representative       |2004-02-17|Hartstein|Michael   | 13000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|President                      |2003-06-17|King     |Steven    | 24000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Programmer                     |2001-01-13|De Haan  |Lex       | 17000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Public Accountant              |1997-09-21|Kochhar  |Neena     | 17000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Public Relations Representative|2002-06-07|Baer     |Hermann   | 10000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Purchasing Clerk               |2003-05-18|Khoo     |Alexander |  3100|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Purchasing Manager             |2002-12-07|Raphaely |Den       | 11000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Manager                  |2004-10-01|Russell  |John      | 14000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |2004-01-30|King     |Janette   | 10000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |2004-05-11|Abel     |Ellen     | 11000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Sales Representative           |2005-03-11|Ozer     |Lisa      | 11500|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Shipping Clerk                 |2004-01-27|Sarchand |Nandita   |  4200|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk                    |2003-07-14|Ladwig   |Renske    |  3600|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Clerk                    |2006-03-24|Raphaely |Den       | 11000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Manager                  |2003-05-01|Kaufling |Payam     |  7900|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Manager                  |2004-07-18|Weiss    |Matthew   |  8000|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">|Stock Manager                  |2005-04-10|Fripp    |Adam      |  8200|<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+-------------------------------+----------+---------+----------+------+<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Trace Output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>tkprof<\/code> excerpt shows that most of the time is spent parsing the query, but it is still fast. All 25 result rows are fetched in a single network roundtrip.<\/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\">Row Pattern Matching &#8211; TKPROF excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"call     count       cpu    elapsed       disk      query    current        rows\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\nParse        1      0.01       0.20          0          0          0           0\nExecute      1      0.00       0.00          0          0          0           0\nFetch        1      0.00       0.00          0         22          0          25\n------- ------  -------- ---------- ---------- ---------- ----------  ----------\ntotal        3      0.01       0.20          0         22          0          25\n\nMisses in library cache during parse: 1\nOptimizer mode: ALL_ROWS\nParsing user id: 133  \nNumber of plan statistics captured: 1\n\nRows (1st) Rows (avg) Rows (max)  Row Source Operation\n---------- ---------- ----------  ---------------------------------------------------\n        25         25         25  SORT ORDER BY (cr=22 pr=0 pw=0 time=1965 us starts=1 cost=22 size=7839 card=117)\n        25         25         25   VIEW  (cr=22 pr=0 pw=0 time=2016 us starts=1 cost=21 size=7839 card=117)\n        25         25         25    MATCH RECOGNIZE SORT (cr=22 pr=0 pw=0 time=2016 us starts=1 cost=21 size=9360 card=117)\n       115        115        115     VIEW  (cr=22 pr=0 pw=0 time=1905 us starts=1 cost=20 size=9360 card=117)\n       115        115        115      WINDOW SORT (cr=22 pr=0 pw=0 time=1904 us starts=1 cost=20 size=9360 card=117)\n       115        115        115       HASH GROUP BY (cr=22 pr=0 pw=0 time=1718 us starts=1 cost=20 size=9360 card=117)\n       116        116        116        VIEW  (cr=22 pr=0 pw=0 time=385 us starts=1 cost=18 size=9360 card=117)\n       116        116        116         SORT UNIQUE (cr=22 pr=0 pw=0 time=384 us starts=1 cost=18 size=7879 card=117)\n       117        117        117          UNION-ALL  (cr=22 pr=0 pw=0 time=213 us starts=1)\n        10         10         10           HASH JOIN  (cr=14 pr=0 pw=0 time=210 us starts=1 cost=9 size=710 card=10)\n        10         10         10            NESTED LOOPS  (cr=8 pr=0 pw=0 time=126 us starts=1 cost=9 size=710 card=10)\n        10         10         10             NESTED LOOPS  (cr=8 pr=0 pw=0 time=116 us starts=1)\n        10         10         10              STATISTICS COLLECTOR  (cr=8 pr=0 pw=0 time=115 us starts=1)\n        10         10         10               MERGE JOIN  (cr=8 pr=0 pw=0 time=121 us starts=1 cost=6 size=480 card=10)\n        10         10         10                TABLE ACCESS BY INDEX ROWID JOB_HISTORY (cr=2 pr=0 pw=0 time=34 us starts=1 cost=2 size=210 card=10)\n        10         10         10                 INDEX FULL SCAN JHIST_JOB_IX (cr=1 pr=0 pw=0 time=24 us starts=1 cost=1 size=0 card=10)(object id 78632)\n        10         10         10                SORT JOIN (cr=6 pr=0 pw=0 time=72 us starts=10 cost=4 size=513 card=19)\n        19         19         19                 TABLE ACCESS FULL JOBS (cr=6 pr=0 pw=0 time=42 us starts=1 cost=3 size=513 card=19)\n         0          0          0              INDEX UNIQUE SCAN EMP_EMP_ID_PK (cr=0 pr=0 pw=0 time=0 us starts=0)(object id 78622)\n         0          0          0             TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=0 pr=0 pw=0 time=0 us starts=0 cost=3 size=23 card=1)\n       107        107        107            TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=11 us starts=1 cost=3 size=2461 card=107)\n       107        107        107           MERGE JOIN  (cr=8 pr=0 pw=0 time=366 us starts=1 cost=6 size=7169 card=107)\n        19         19         19            TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=27 us starts=1 cost=2 size=513 card=19)\n        19         19         19             INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=5 us starts=1 cost=1 size=0 card=19)(object id 78619)\n       107        107        107            SORT JOIN (cr=6 pr=0 pw=0 time=67 us starts=19 cost=4 size=4280 card=107)\n       107        107        107             TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=7 us starts=1 cost=3 size=4280 card=107)\n\n\nElapsed times include waiting on following events:\n  Event waited on                             Times   Max. Wait  Total Waited\n  ----------------------------------------   Waited  ----------  ------------\n  SQL*Net message to client                       1        0.00          0.00\n  PGA memory operation                            5        0.00          0.00\n  SQL*Net message from client                     1        0.01          0.01\" 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\">call     count       cpu    elapsed       disk      query    current        rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parse        1      0.01       0.20          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Execute      1      0.00       0.00          0          0          0           0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Fetch        1      0.00       0.00          0         22          0          25<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------- ------  -------- ---------- ---------- ---------- ----------  ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">total        3      0.01       0.20          0         22          0          25<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Misses in library cache during parse: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Optimizer mode: ALL_ROWS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Parsing user id: 133  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Number of plan statistics captured: 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Rows (1st) Rows (avg) Rows (max)  Row Source Operation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- ----------  ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        25         25         25  SORT ORDER BY (cr=22 pr=0 pw=0 time=1965 us starts=1 cost=22 size=7839 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        25         25         25   VIEW  (cr=22 pr=0 pw=0 time=2016 us starts=1 cost=21 size=7839 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        25         25         25    MATCH RECOGNIZE SORT (cr=22 pr=0 pw=0 time=2016 us starts=1 cost=21 size=9360 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       115        115        115     VIEW  (cr=22 pr=0 pw=0 time=1905 us starts=1 cost=20 size=9360 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       115        115        115      WINDOW SORT (cr=22 pr=0 pw=0 time=1904 us starts=1 cost=20 size=9360 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       115        115        115       HASH GROUP BY (cr=22 pr=0 pw=0 time=1718 us starts=1 cost=20 size=9360 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       116        116        116        VIEW  (cr=22 pr=0 pw=0 time=385 us starts=1 cost=18 size=9360 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       116        116        116         SORT UNIQUE (cr=22 pr=0 pw=0 time=384 us starts=1 cost=18 size=7879 card=117)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       117        117        117          UNION-ALL  (cr=22 pr=0 pw=0 time=213 us starts=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10           HASH JOIN  (cr=14 pr=0 pw=0 time=210 us starts=1 cost=9 size=710 card=10)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10            NESTED LOOPS  (cr=8 pr=0 pw=0 time=126 us starts=1 cost=9 size=710 card=10)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10             NESTED LOOPS  (cr=8 pr=0 pw=0 time=116 us starts=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10              STATISTICS COLLECTOR  (cr=8 pr=0 pw=0 time=115 us starts=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10               MERGE JOIN  (cr=8 pr=0 pw=0 time=121 us starts=1 cost=6 size=480 card=10)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10                TABLE ACCESS BY INDEX ROWID JOB_HISTORY (cr=2 pr=0 pw=0 time=34 us starts=1 cost=2 size=210 card=10)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10                 INDEX FULL SCAN JHIST_JOB_IX (cr=1 pr=0 pw=0 time=24 us starts=1 cost=1 size=0 card=10)(object id 78632)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10         10         10                SORT JOIN (cr=6 pr=0 pw=0 time=72 us starts=10 cost=4 size=513 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19                 TABLE ACCESS FULL JOBS (cr=6 pr=0 pw=0 time=42 us starts=1 cost=3 size=513 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         0          0          0              INDEX UNIQUE SCAN EMP_EMP_ID_PK (cr=0 pr=0 pw=0 time=0 us starts=0)(object id 78622)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         0          0          0             TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=0 pr=0 pw=0 time=0 us starts=0 cost=3 size=23 card=1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107            TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=11 us starts=1 cost=3 size=2461 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107           MERGE JOIN  (cr=8 pr=0 pw=0 time=366 us starts=1 cost=6 size=7169 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19            TABLE ACCESS BY INDEX ROWID JOBS (cr=2 pr=0 pw=0 time=27 us starts=1 cost=2 size=513 card=19)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        19         19         19             INDEX FULL SCAN JOB_ID_PK (cr=1 pr=0 pw=0 time=5 us starts=1 cost=1 size=0 card=19)(object id 78619)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107            SORT JOIN (cr=6 pr=0 pw=0 time=67 us starts=19 cost=4 size=4280 card=107)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       107        107        107             TABLE ACCESS FULL EMPLOYEES (cr=6 pr=0 pw=0 time=7 us starts=1 cost=3 size=4280 card=107)<\/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\">Elapsed times include waiting on following events:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Event waited on                             Times   Max. Wait  Total Waited<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ----------------------------------------   Waited  ----------  ------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message to client                       1        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PGA memory operation                            5        0.00          0.00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  SQL*Net message from client                     1        0.01          0.01<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"conclusion\"><\/a>12. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A view-API has a value. You can change the physical data model and keep the existing view layer compatible for the consuming applications. This makes the database application independent, at least to a certain extent. That&#8217;s a great value when you think of testing interfaces or releasing new versions.\u00a0Building an initial 1:1 view-API is no big deal,\u00a0especially since it can be generated. The maintenance costs for such a view-API depend on many things. But I can&#8217;t imagine a scenario that isn&#8217;t worth it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I was positively surprised by the feature richness and good usability of JOOQ. Things like the deep data model awareness including referential integrity constraints to make joins simpler and less error-prone are impressive. Ok, the DSL\u00a0needs some getting used to, but the excellent documentation helps a lot.\u00a0Although I have only scratched the surface of JOOQ, I am convinced that it is very well suited for developing high-performing PinkDB applications. Because JOOQ developers have control over the SQL statements sent to the database.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog post, I show how to build a read-only view-API for Oracle&#8217;s\u00a0HR sample schema. And I will use this view-API in a JOOQ application.\u00a0This application will fully comply with the\u00a0Pink Database Paradigm (PinkDB). This means the application executes set-based SQL and retrieves data with as few network roundtrips as possible.<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":8745,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[107,118,94,109,13,85],"class_list":["post-8722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-java","tag-jooq","tag-oddgen","tag-pinkdb","tag-plsql","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>View-API for JOOQ Application - Philipp Salvisberg&#039;s 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.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"View-API for JOOQ Application - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this blog post, I show how to build a read-only view-API for Oracle&#8217;s\u00a0HR sample schema. And I will use this view-API in a JOOQ application.\u00a0This application will fully comply with the\u00a0Pink Database Paradigm (PinkDB). This means the application executes set-based SQL and retrieves data with as few network roundtrips as possible. [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-05T20:34:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T02:11:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png\" \/>\n\t<meta property=\"og:image:width\" content=\"949\" \/>\n\t<meta property=\"og:image:height\" content=\"657\" \/>\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=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"View-API for JOOQ Application\",\"datePublished\":\"2018-08-05T20:34:07+00:00\",\"dateModified\":\"2023-11-08T02:11:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/\"},\"wordCount\":1476,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/HR-View-API.png\",\"keywords\":[\"Java\",\"JOOQ\",\"oddgen\",\"PinkDB\",\"PL\\\/SQL\",\"SQL\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/\",\"name\":\"View-API for JOOQ Application - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/HR-View-API.png\",\"datePublished\":\"2018-08-05T20:34:07+00:00\",\"dateModified\":\"2023-11-08T02:11:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/HR-View-API.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/HR-View-API.png\",\"width\":949,\"height\":657},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/08\\\/05\\\/view-api-jooq-application\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"View-API for JOOQ Application\"}]},{\"@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":"View-API for JOOQ Application - Philipp Salvisberg&#039;s 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.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/","og_locale":"en_US","og_type":"article","og_title":"View-API for JOOQ Application - Philipp Salvisberg&#039;s Blog","og_description":"In this blog post, I show how to build a read-only view-API for Oracle&#8217;s\u00a0HR sample schema. And I will use this view-API in a JOOQ application.\u00a0This application will fully comply with the\u00a0Pink Database Paradigm (PinkDB). This means the application executes set-based SQL and retrieves data with as few network roundtrips as possible. [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2018-08-05T20:34:07+00:00","article_modified_time":"2023-11-08T02:11:28+00:00","og_image":[{"width":949,"height":657,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.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":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"View-API for JOOQ Application","datePublished":"2018-08-05T20:34:07+00:00","dateModified":"2023-11-08T02:11:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/"},"wordCount":1476,"commentCount":1,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png","keywords":["Java","JOOQ","oddgen","PinkDB","PL\/SQL","SQL"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/","url":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/","name":"View-API for JOOQ Application - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png","datePublished":"2018-08-05T20:34:07+00:00","dateModified":"2023-11-08T02:11:28+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/08\/HR-View-API.png","width":949,"height":657},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2018\/08\/05\/view-api-jooq-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"View-API for JOOQ Application"}]},{"@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\/8722","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=8722"}],"version-history":[{"count":103,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8722\/revisions"}],"predecessor-version":[{"id":12645,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8722\/revisions\/12645"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/8745"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=8722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=8722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=8722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}