Migrate to the Oracle Database Cloud Service

On the 6th of October the Oracle Cloud Day 2015 takes place in The Netherlands. iAdvise is proud to be a bronze sponsor on what promises to be a day filled with interesting sessions.

One of the main topics will be the Oracle Database Cloud service. In this blog post, which was published in the OGh Visie earlier this year, you can read what the Oracle Database Cloud Service is, which configuration possibilities there are and what steps are needed to migrate.

Oracle Database Cloud Service

Suppose you want to start with the Oracle Database Cloud Service tomorrow, what options are there? What services are there, and what do they do? Below you will find the 3 services available. In the future, Managed Database as a Service will be added to these services.

Database Schema Service

Interesting to know is that, already since 2012, you can use the Oracle Cloud, namely through the Oracle Database Cloud Schema Service (ODCSS).  It was – and still is- possible to get a database schema in the Oracle Cloud, on an 11g database that is fully managed by Oracle. You can connect to this schema through: SQL Developer, RESTful Web Services, Oracle Java Cloud or
Oracle APEX.oracle_database_cloud_scheme_service

However, there are some limitations. You have no SQL*Net access, so you can only use SQL Developer (or APEX) to connect to your cloud database schema. You can do this through a so-called “Cloud Connection”, but need to know that you can only browse and load/unload data. So, not really convenient for development purposes. In addition, you cannot “connect” multiple schemas with each other, and packages such as: utl_smtp, utl_ftp and features as VPD (Virtual Private Database) are not available.

If you don’t mind these limitations, ODCSS is a very budget-friendly solution. Starting at $175 per month, you have an Oracle database in the cloud with 5GB storage available

Virtual image

Are you looking for a cloud environment where you can install and manage your databases yourself, then the virtual image option might be something for you. You get a dedicated VM on which you can install an 11g or 12c database, either manually or through the Database Configuration Assistant (DBCA). Unlike with the ODCSS, you have SQL*net access and full access to the VM.

You get the choice whether you want to pay per hour or per month. From $400/month or $0,672/hour you can get started with SE 1.

Database as a Service

If you choose the Database as a Service, you have the same possibilities as with the virtual image option, but in addition you have a number of nice tools at your disposal. So you can create a database instance in 4 easy steps thanks to Oracle’s automatic provisioning system. In addition, you have a number of cloud tools to maintain and monitor your database very easily.

You can start with the Database as a Service for a SE1 database from $600/month or $1,008/hour.

Setting Up the Oracle Cloud Database as a Service

Database instance

For the creation of an Oracle database you have a simple wizard. This initiates the automatic provisioning of your database.  The provisioning ensures that your database is installed with cloud tooling technology and it configures the backup facilities.


The 4 steps that you must follow are:

  1. Choose your service: Virtual image or Oracle Database Cloud Service
    How do you want to pay: hourly or monthly?
  2. Choose your database version: 11gR2 or 12c?
  3. Choose your edition: SE1, EE, EE High performance, EE Extreme performance
  4. Choose the name of your instance, your compute shape (number of CPUs) and connect an SSH key to access to your VM.  Set a number of database configurations: how much storage you need, SID, and – in the future also a possible – a fail over database. If you also choose for Backup and Recovery, you select the storage container here.
    Then simply confirm, and you’re done! Fifteen minutes later you have a fully functioning database instance in the Oracle Cloud and access to a dedicated VM.


Backup & Recovery

When you choose the Oracle Cloud Database as a Service, you also have the necessary cloud tooling technology to simply set up the desired backup options.

If you’re only interested in a local backup, then the block store only option will do. During the provisioning of the VM, some additional disk space will be configured for the backup, by default 1.7 times the required database data volume. Through a combination of the familiar Oracle RMAN and classic system management tools, nicely packaged in a command line API, not only your database but also important system files are added to the local backup.

If you want full protection for your VM, then your best option is to choose the block store and cloud storage option. This option presupposes that Oracle Cloud Storage as a Service is purchased and configured. With a few simple commands, you will then be able to restore your full VM instance, including system files and configured Oracle database, into a new VM.

Both systems follow a series of Oracle’s best-practice guidelines and can be expanded and adapted to suit your needs.

Do you want your on-premise Oracle database(s) or Oracle database(s) that were created in an Oracle Cloud Database – Virtual image instance, also to be backed up in the Oracle Cloud, then you can set this up via the Oracle Cloud Backup as a Service. This service only relates to the storage of Oracle database backups. Do you also want to back up other types of data in the Oracle Cloud – for example, important system files – then you can do the setup through the Oracle Cloud Storage as a Service. In that case you are responsible for setting up the necessary backup policy.

Access rules

Who has which access to the Oracle Cloud Database as a Service?

Each Compute Cloud Service VM, child to the Oracle Cloud Database as a Service, is shielded from the angry world through so-called access rules. These are firewall rules that check the access to the VM specific protocols, such as HTTP(S), SSH or SQL * Net access. In these rules you define what source groups of VMs (network groups) or lists of IP addresses on a specific protocol may connect within a certain target group of VM(s).

When creating an Oracle Cloud Database as a Service instance, by default, 7 Oracle Compute Cloud Service access rules are created. These access rules control access to SSH (port 22), Enterprise Manager Database Control (port 1158), Enterprise Manager Database Express 12c (port 5500), Database listener (port 1521), Glassfish Server admin console (port 4848), HTTP (port 80) and HTTPS (port 443). The last one is necessary for accessing the Oracle REST Data Services, Oracle APEX and Oracle Cloud on-instance database monitor.

Only the SSH access is standard enabled. The other access rules must be explicitly enabled after creation.


Migrate to the Oracle Cloud

Have you decided to use the Oracle Database Cloud Service? Nice, but now you probably want to know what steps are needed to get your current on-premise environment in the cloud. And that happens to be one of the strengths of the Oracle Cloud: because you have full access to your dedicated cloud VM, you can tackle the migration in different ways.

For the migration of OraEvents (an application we build for Oracle) we used the classical method: an Oracle Data Pump export (expdp) of the on-premise database and an import (impdp) into the cloud database. The steps we went through are:

  • Expdp of the database schema
  • Copy the expdp DATA_PUMP_DIR directory to the Oracle database
  • Preparing the database – create new tablespaces, user schemas and assign the necessary rights
  • Import the expdp into the new database schema
  • Export and import of APEX workspace and applications
  • Copy the APEX images in the default DocumentRoot of the Glassfish server running the ORDS
  • Ready for testing!


If you decide to migrate to the Oracle Cloud today, you have a range of options available to ensure that your cloud database is more than just a replacement for you on-premise database. The automatic provisioning, powerful cloud tooling and integrated systems offer a great extra value. Because migrating to the cloud is very similar to a classic migration, there are no major objections from a technical perspective. The Oracle Cloud is ready. Now, it’s up to us!

Creating a basic application in APEX 5.0

iAdvise presented the APEX 5.0 roadshows in the first half of 2015. Besides the presentation about the new features, we provided 3 tutorials which helped the visitors to explore Oracle Application Express 5.0. Now we offer these tutorials through our blog. In this article the first tutorial is presented, you will learn how to create a basic application.

This tutorial helps you step-by-step through the process of creating a basic application in Oracle Application Express 5.0.
To create a basic application with a few pages, you have to follow the next steps. We decided to split up this tutorial into six steps.

In this tutorial we talk about Oracle Application Express when Oracle APEX is mentioned. The intention of this tutorial is to become familiar with Oracle APEX 5.0 and its features.

We assume you have an environment where you can work with APEX 5.0.

Step 1: Upload and run SQL script.

First, go over here: https://goo.gl/cg2izy. Click ‘Tutorial 1 – Creating a basic application in APEX 5.0’ and you a page appears where 3 SQL-files are presented. Download the scripts to your local drive.

Login to the workspace provided to you. You will reach a window with these icons at the top of the page. Click ‘SQL Workshop’.


Now click ‘SQL Scripts’.


You reach a page where you can upload the SQL files by clicking ‘Upload’. Unfortunately the script cannot be loaded all at once. Click ‘Choose File’ and select the SQL-file you want to upload. Finally fill in the field ‘Script Name’ and click ‘Upload’ at the bottom of the page. In this tutorial keep the script name the same as the filename.


Repeat this steps for the other files. When all files are uploaded, they have to be executed. Select the file you want to execute by clicking the checkbox at the left side. Now click on the ‘Play’ button at the right side of the row.


The next page will appear. Just click ‘Run in Background’.


When you run these scripts in the right order ( 1_tutori… .sql, 2_tutori… .sql, 3_tutori… .sql) they should return no errors.

Step 2: Create a new application

After you have logged in to the right workspace, a window with this icons will appear. Click Application Builder and the next window will appear:


To create the application, click Create. Now it’s possible to choose a type of application. In this tutorial we want to create a desktop application. This option is already selected by Oracle APEX. To continue, click the icon or click Next.


The next page allows you to enter basic information about your new application.


Some values (Schema, Application, Theme, Theme Style) already have a default value. In this window only change Name. In this example, let’s name it ‘My APEX 5.0 Application’. Click the button Next. This same action also has to be performed in the next page.


In the following page, it’s possible to indicate that you want to copy Shared Components from other Applications. The default value is ‘No’. Don’t change this value and click Next.


The next page allows us to enter global settings for the application such as language and date/time settings. Don’t change the default values except for Date Format. Click the arrow at the right of the field and select the value ’12-JAN-2004’ in the popup window that appears. The popup will close automatically and will set the date format to ‘DD-MON-YYYY’.


Later you will see it is possible to use another format on a date field.


Click Next. A page with summarized information of the new application will appear. Now it’s time to create the application by clicking on ‘Create Application’.


You will see the Application Builder for the application we just created. In this example, the application number is 107. Two pages are already generated. (1 – Home, 101 – Login Page).

Step 3: Create an interactive report

We continue where step 2 ended: in the Application Builder. Click the button ‘Create page’.


A window with many page options appears. Click the icon ‘Report’.


A window with three options for report types appears. Click ‘Interactive Report’.


In the next window it is possible to enter the first basic information about the page we are creating. Only enter a clear page name. Here we enter ‘Department employees’. When you leave this field it automatically updates ‘Region Name’ with the value you just entered. In this situation this is ok.
Click Next.


Now it is possible to add information about navigation in menu entries. Accept the defaults by clicking on Next.


Next add information about which table or view we want to use in this interactive report.

  • Don’t change anything for the default values of ‘Source Type’ and ‘Table/View Owner’.
  • Choose ‘IADV_DPT_EMPLOYEES_VW (view)’ at ‘Table/View Name’.
  • As you can see, all available columns in the shuttle are at the right side so no action at this field is required.
  • Change value to ‘No’ at ‘Link to Single Row View’.

Continue the creation by clicking Next.


A window with summarized information about the interactive report appears. Now create the page by clicking Create.


Now you see the Page Designer from APEX 5.0.
You can watch the result by clicking on the blue ‘Play’ icon (Save and Run) at the right corner on top of the screen. Because this is (probably) the first time you navigate to the ‘runtime’ version of your application, you have to login. Use the same combination of user and password as you do in the Application Builder.

Keep in mind: in Oracle APEX 5.0 your application will by default not appear in the same window or tab as where you click ‘Save and Run’. When you use Google Chrome or Internet Explorer, it starts in a new tab. In Safari and Firefox a new window will open.



As long as you open both tabs, it is possible to use the Oracle APEX developer toolbar at the bottom of your ‘runtime’ screen. When you click ‘Edit Page 2’ you automatically switch to the tab window of your Page Designer. If you change something in the Page Designer and then click the blue icon (Save and Run), you automatically switch to the tab with your ‘runtime’ page.


A bit more about this toolbar: all items are clickable. What happens if you click on an entry of this toolbar?

  • Home:
    You will navigate to the workspace where your application belongs to.
  • Application xxx:
    You will navigate to the Application Builder of your application
  • Edit page x:
    Depending the settings you made before, you will navigate to your page in the Page Designer or in Component View
  • Session:
    Shows session state information about your page. Change the value in select list ‘View’ to ‘All’ to see more information.


  • View Debug:
    You will see the debug reports. Click on one of the numbers under ‘View identifier’ to see detailed debug information.



  • Debug:
    This toggles the page between Debug mode and No Debug mode.
  • Show Grid:
    This toggles between Show Grid and Hide Grid. This is only applies if a grid layout is used and that layout supports showing a grid and the page has more than one column.
  • Quick Edit:
    The cursor changes into a plus symbol (+) and then it’s possible to click the desired component in your page you want to (quick) edit. When you click you will navigate to the page in the Page Designer, even if you explicit showed this page in Component View before.
  • Theme Roller:
    It’s is possible to easily customize the appearance of the application by using all options that are shown in the window that appears. This theme roller only appears for themes supporting this feature. This theme roller offers some fancy features to change the layout of your page.



  • The ‘wheel’ icon:
    This offers you possibilities about where your toolbar is located. For example, the toolbar can be located at the right side of your page.



Step 4: Edit the interactive report

Let’s edit some little esthetical aspects in the interactive report we just created. As you can see, a few columns can be removed or hidden from the report and some headers have to be edited.


Columns Dee Id, Dpt Id and Epe Id are not interesting to show in the report. Besides this, Name and Employee Name have to be changed to more clear terms. Also despite our Application Setting concering date formats, we still want to change the date format for these columns into DD-MM-YYYY.


Click ‘Edit Page 2’ or navigate to page 2 in the Application Builder. Now you’re in the Page Designer. At the left side of this Page Designer you see all regions on this page. When you expand some nodes in this part of the page, all report items will be shown. In this example we have to edit region ‘Department employees’.


In APEX 5.0 it is possible to do a multiple selection by using CTRL and clicking on items you want to select. We decided to hide items Dee Id, Dpt Id and Epe Id. These items match with DEE_ID, DPT_ID and EPE_ID in the Page Designer. When you do a multiple selection, it will look like this in the Page Designer.


At the right side of the Page Designer it’s possible to change properties for all the selected items at once.


Again, we want to hide all selected items. Under ‘Identification’, change the item type to ‘Hidden Column’.

Now, we want to change the headers ‘Name’ and ‘Employee Name’ into ‘Department’ and ‘Employee’. Also align these headers at the left side. For ‘Name’, select report item ‘Name’ in the Page Designer.


At the right side, change the values under ‘Heading’.

Old properties


New properties


You can repeat this action for ‘Employee Name’. Change properties for item EMPLOYEE_NAME.

When you run the page, this result will be shown.


Now we have to change the alignment for ‘Start Date’ and ‘End Date’. You have already done this for other items, so the only hint we will give is that these items can be found in the Page Designer as START_DATE and END_DATE. The headers have to be aligned to the left. Also change the headings so only the first character is uppercase (Start date and End date).

When you have finished the actions for the headers, it’s time to change the format mask of these date items. At the right side of the Page Designer, navigate to the section ‘Appearance’. It’s important to notice properties can be shown in two ways. Here it is possible to add a format mask. You can use the list or you can write something yourself. Let’s enter DD-MM-YYYY.
It’s possible to show common properties or all properties. When common properties are shown, you cannot find ‘Format Mask’. Just click ‘Show all’ and this property will appear.

Show common properties


Show all properties



Again, push the Save and Run button at the right top of the Page Designer.

Now your interactive report is ready!



Step 5: Create a form

In this step we will create a report with a form based on an table with employees. (IADV_EMLOYEES). Make sure you’re in the Application Builder of the application you created before and click ‘Create Page’.


Choose the icon ‘Form’.


In the next window, choose ‘Form on a Table with Report’.


Only change ‘Page Name’ in the next page. As seen before, ‘Region Title’ will automatically be edited when leaving ‘Page Name’.
Click Next.


Now we can enter the table we want to display in the form and region. Select IADV_EMPLOYEES and click Next.


As before, in this tutorial we skip navigation, so you can immediately click Next.


Now we can select which columns will be shown in the report. Leave the defaults and click Next.


In the page that appears we can select the icon which will be used to navigate to the detail form. Select an applicable icon and click Next.


Next, we will arrange settings for the detail form. Edit ‘Page Name’ to ‘Employee’ and navigate out of this item (for example, user your tab key). You will see that ‘Region Title’ changes to ‘Employee’.
At ‘Page Mode’ choose ‘Modal Dialog’. Click Next.


At ‘Primary Key Type’ select ‘Select Primary Key Columns’. Two items will apear. In the first item (‘Primary Key Column 1’) select column ‘EPE_ID’ and then click Next.


On the next page leave all defaults and click Next.


Here, we can select the columns which have to be shown in the form. Select all columns by clicking on the double arrows which point to the right side of the shuttle. Then click Next.


Next you can indicate whether you want to use functionality concering insert, update and/or delete. Leave all defaults as generated by APEX and click Next.


The last page of this ‘wizard’ shows summarized information about the report and form we want to create. You can edit nothing over here. Just click Create.


Now you arrive in the Page Designer again. Click the Save and Run button (the blue icon with a with triangle inside) to take a look at your result.


The second column from the left (Epe Id) needs to be a hidden column. Besides this, we want all headers to align at the left side. We already did some actions in another report to change these settings. Can you do it again to let this page look like the following image?


Now let’s take a look at the form, the modal page. You can navigate to this form by clicking on the edit icon.


Edit properties to change prompts work in a simular way as shown before.

Aligning items is the next action for this page. Place First Name and Last Name on the same line. Also Email Address and Phone Number have to appear on the same line and change their order. In Oracle APEX 5.0 you can to this in the Page Designer by a kind of drag and drop action. Select the item you want to replace. Move your cursor over the item in the center part of the Page Designer (Grid Layout) until your mouse pointer like this:




For P4_EMAIL_ADDRESS and P4_PHONE_NUMBER you can do the same actions. Finally it looks like this in the Page Designer.


When you look at the ‘runtime’ version of this page, you can see ‘Last name’ is placed at the right side of ‘First name’ and ‘Phone Number’ appears before ‘Email Address’.


As you can see, the width for ‘Date of birth’ is not very nice so the alignment of the page can be better. One of the options to align the items is to give them all the same width. Because P4_DATE_OF_BIRTH is a Date Picker and all other items are Text Fields, it is not possible to edit the width for all items at once. So first select P4_DATE_OF_BIRTH and navigate to section ‘Appearance’ at the right side of the Page Designer and change width into 20. Select P4_FIRST_NAME, P4_LAST_NAME, P4_PHONE_NUMBER and P4_EMAIL_ADDRESS and change width into 20 for all items at once. You can do this multiple selection by clicking the items one by one while you use the CTRL-button from your keyboard.



When you run the application and navigate to the adjusted page, you see the alignment becomes much better.


The last action is to edit the label for ‘Phone Number’. Let’s change this to a label which indicates this field is required.  Use the developer toolbar by clicking ‘Quick Edit’. Click at ‘Phone Number’ in your screen and you will jump to the page in the Page Designer.


In the Page Designer go to section ‘Appearance’ at the right side of your page. There you can change the value in ‘Template’ to ‘Required’.


Now click ‘Save and Run’ and you will see the item is shown with a changed label.


Step 6: Adding navigation

In the final step of this tutorial we will add navigation to an interactive report to navigate to another page. At this point you can see this in your Application Builder.


In page 2 we will add a button to navigate to page 3. So now open page 2 by clicking on it. The Page Designer will appear. Right click the region ‘Department employees’ and a popup menu will appear. Click ‘Create Button’ as shown.


You will see a new folder name ‘Region Buttons’ under the existing region ‘Department employees’. Besides this, in the center part of the Page Designer there you can also see the new button.


At the right side of the Page Designer we can adjust some settings for this new button.
Copy the values as shown in the following images. In detail you have to edit a few properties in the sections Identification (Button Name, Label), Layout (Button Position), Appearance (Hot) and Behavior (Action, Target).






When you have finished this, click Save and Run. You wil see at the top of your interactive report a button ‘Employees’.


When you click this button you will navigate to the page containing more detailed information about Employees. To complete navigation we will add a menu to this application. Make sure you are in the Page Designer and select the page at the left side of your page.


Take a look at the properties under Navigation Menu at the the right side of your page.

These properties need the following values:

  • Override User Interface level: Yes
  • List: Desktop Navigation Menu
  • List Position: Side
  • List Template: Side Navigation Menu

Save this settings.


Make sure you’re in the Application Builder. There you will find the icon for Shared Components. Click it for the next action. On the page that appears you see several sections. Under ‘Navigation’ you can click ‘Navigation Menu’.



You will arrive on a page where you have to click ‘Desktop Navigation Menu’.


The screen that appears offers you the possibility to add menu entries. To do this click ‘Create List Entry’.


Add information on this page

  • Section Entry
    List Entry Label: Department employees
  • Section Target
    Target type: Page in this Application
    Page: Page 2 (Department employees)


Now use the button ‘Create and Create Another’ to repeat this for the other pages. When you add the last page use ‘Create List Entry’ instead. Navigate to the ‘runtime’ version from our application. Now you can see a menu at the left side of the application.


That’s it for this tutorial, great job!

5 Things I wish I knew about APEX when I just started (part 2)

In my first post of this series, I talked about subscriptions. The next post in this series is about cookie sharing in APEX, I hope you enjoy it.

Apex SSO by Cookie sharing

In the spirit of the previous post, this post will also be one that comes in handy when running multiple applications in the same workspace. When running multiple applications in the same workspace, it’s possible to share the authentication across multiple applications so you don’t have to login every time you switch applications. The only problem is that the feature is tucked away pretty good in the authentication scheme settings.

First we will Create 2 standard Applications


Now we will create a simple page with a link to a page in the other application, to test if our setup works.


If we would click the link now we would be redirected to the login page of the other application since, we’re not yet authenticated.


What we need to do now is set up our authentication, to keep it simple I will make a hardcoded function where the process checks for username and password admin. But feel free to use your own custom login procedure. :-)


Now for the important part, scroll down in the authentication scheme until you see a block called “Session Cookie Attributes”

In the cookie name field, you can set a name for your cookie, the important thing for this to work is that the name is the same in both applications, you also have the option here to define extra settings for your cookie. Whether it should be secure or not and the cookie path and domain.


In the second application create the same authentication scheme as a copy of an existing authentication scheme. You can subscribe the authentication scheme to the first application.

For more information about subscription you can look at my first post.

If we log in to one of our applications now, we should be able to switch applications by clicking on the link we have created

That’s it! The third blog in this series will be about build options, click here to read it.


5 Things I wish I knew about APEX when I just started (part 1)

I’ve been doing apex for about 7 years now, and along the way I discovered a few things that made my life as a developer a lot easier. I made a list of 5 things that I wish I had known wen I just started. Those things will be explained to you in a series of 5 posts.


One of the most tiresome things to do when managing multiple applications is to keep things like templates, and security up-to-date across all applications.

Apex has a nice built-in system for this called ‘subscriptions’.

If you just start with a new project, the easiest way to set-up the subscriptions is by creating a new application and call it “MASTER APPLICATION” or something similar, so you know this will be the parent application for all subscriptions. For an existing application the same method applies, but it will be a bit more work intensive to get everything right.

In this application, you define your, security scheme, authorization schemes, templates, list of values.

Once you have your basic configuration done, you are ready to start working on your new applications.

To link the new application to the MASTER application let’s say for example an authorization scheme.

You go to shared components, authorization schemes, create.

Select “create as copy”.


Copy from the master application and then select copy and subscribe.


If you edit the authorization scheme now you will see that in the subscription part there is an application referenced.


By now you are wondering: “What’s the point of all this? Couldn’t I just as easily have copy pasted the code?”

Yes, you could have, but imagine having 20 or more applications using the same authorization scheme, and then one day you may have to change something inside, you would have to modify all 20 schemes in all 20 applications again.

But because now we reference the master template this is no longer necessary. For instance let’s say we want a function to return false instead of true, what we can do now is go to the master application, edit the authorization scheme, change it, save it, and press the publish scheme button.

In the long run this could save you tons of work!


For subscribing templates in apex there is a way to do all templates at the same time.

Go to shared components, templates.

On the righthand side you have a menu called task, click the link to replace templates in this application with templates from another application.


Select the master application again, in the next screen select the template, and in the action drop down select, replace/subscribe, and press replace templates.


Read the next blog in this series:  Apex SSO by Cookie sharing.

OGH APEX World 2014

Last week we attended the the 5th annual APEX World event in Zeist. As every year it was very nice to meet the growing APEX community in the Benelux, combined with some excellent APEX international and dutch presentations.
The  keynote was given  by Joel Kallman about APEX 5.0 followed by 18 very interesting sessions about customer business cases, technical developments and international presentations by APEX specialist from all over the world.

APEX 5.0

The key focus in the new APEX 5.0 is improved developer productivity.oracle apex page designer
The page builder is completely new. Through this interface developers will be able to do more in less time and most important, in fewer clicks. With a properties sidebar on the right side of the screen it will be possible to quickly change elements and regions on a page, even multiple elements at the same time!  Regions and items can be created through drag and drop which increases the development speed.

Other new features

Improved tab navigation. The current tab system isn’t user friendly enough, so it’s better to use lists. Now you can create new pages and define their hierarchy in the application. When this is done, an automatic tab will be created with dropdown submenus to display the hierarchy.

Interactive reports
Two important improvements for interactive reports. First and foremost it’s possible to have multiple interactive reports on one page, something we’ve all been waiting for since APEX 4.x. And secondly there is a new format function to pivot your report. Joel Kallman presented this feature: in a couple of clicks he created a nice pivoted table on the screen.

jQuery Mobile integration
With jQuery Mobile your SQL reports will have the possibility to be responsive. You have the option to:
a) only display the most important columns on a small screen, or
b) to switch to some kind of single record view. The result is something similar to what you can see here: http://elvery.net/demo/responsive-tables/

Modal popup
Instead of using a plugin to let your pages open in a modal window, users can now set this feature as a property of the page. Whenever the user navigates to this page, it will open in a modal window.

Be sure to take a look at the APEX early adaptor: apexea.oracle.com



After the APEX 5.0 demonstration, there were 3 parallel tracks, all with very different and interesting sessions.  Read our impressions …

Going public with your APEX application
FOEX brought this presentation very well. Their problem scenario was the following one: If you want to make a public APEX application, you are always stuck with the typical APEX URL like “apex/f?p=100:1:5039230103::::”. During the demo they showed how to create a nice and readable URL like “apex/demo/customers”. To accomplish this they used aliases, REST services, PL/SQL and a few lines of javascript.

The best of both worlds: going hybrid with your mobile APEX application
Roel Hartman gave a presentation about Phonegap in combination with APEX. He showed a nice demo on how to sync the contacts from a database with the ones from his cell phone through a Phonegap App. It was surprising how easily this could be setup without too much code and in-depth knowledge. He used REST services to sync the data between APEX and his cellphone.

Using AngularJS in oracle applications express
Dan McGhan of Enkitec (USA) brought a technical session about combining AngularJS and APEX. He showed us a single page application containing a to do list with advanced calendar features. The end result was very nice and the demo illustrated the power of AngularJS, but it certainly requires some time to understand this framework. Maybe an interesting idea is to include AngularJS natively in APEX 6.0?

A B2B weboracle apex b2b webshop - tuur hendrickxshop with APEX!
iAdvise did two presentations. The first one dealt with a B2B webshop we developed in APEX for Billiet. Justine Ghekiere gave a brief introduction about the core business of her company, Biliet. Our colleague Tuur Hendrickx showed a lot of features he implemented in the webshop with APEX. Topics he show-cased were:  special advertisements, restricted products for different customers, the use of a shopping cart and a stunning layout were demonstrated.

We also attended a nice presentation of Martin Giffy D’Souza about APEX and HTML5. He showed the advantages of HTML5 and the typical use cases in APEX. During a live demo he showed how to record a video within APEX and stream the feed to another frame in the same screen. Really impressive!  Also nice to see was how easily it is to implement voice recognition by using HTML5.

Dutch immigration services (IND) monitor xml messages with oracle apex
A department of the Dutch government has built an application which provides residence permits to immigrants or refugees. Before they could start building the APEX application there was a lot of effort necessary in the Oracle database for dealing with all the XML files. It was not just a problem with the size of the XML files, but there were also issues with differences between Oracle 10.2 and 11.2 in the way the database handles XML files.

Reporting solutions for oracle APEX – choose your weapons
During this session Dietmar Aust gave us an overview of possible reporting solutions  for APEX applications. Many solutions were covered in an objective way:  BI Publisher, Jasper Reports, Apache FOP, APEX PDF printing, PL/PDF, … Dietmar even demonstrated our own tool Doxxy (www.doxxy.eu). Nice to hear that he likes Doxxy! He also showed us his own solution for typical problems related to exporting data from interactive report to MS Excel, especially regarding the proper data types: OPAL:XP (for eXPorting to MS Excel).

Single-click deployment in APEX development
One of the last tracks we visited was about single-click deployment of APEX applications in OTAP areas. They talked about the use of bamboo, in combination with GIT and APEX. It was nice to see how they solved the problem of continuous integration with APEX.

A logistic data portal with APEX!oracle apex data portaal - menno hoogendijk
In the second iAdvise customer case Robert Esseling explained why Bas Logistics needed a data portal. Those requirements where then demonstrated by Menno Hoogendijk.
The portal has an admin module to manage the data import and mapping settings. In the very straight-forward  front-end, users drill down from dashboards to detailed data.


Thanks to the organization for hosting this great event, really one of the best conferences in the benelux!
See you at APEX World 2015!

Watch out with function result cache based on data dictionary views

Result cache is a powerful tool to gain performance in PL/SQL.
There are many examples on the internet that proves this, e.g. these articles on All things Oracle:
Result Cache(1)
Result Cache(2)

But I’m not going to talk about performance.
This article is some kind of warning.

First I’ll show you how result cache works on a normal view.
I’ll create a table, a view on this table and a function that counts the rows in the view.

SQL> create table x (field1 varchar2(1), field2 number(1));

Table created.

SQL> create or replace view vie_x as select * from x;

View created.

   l_return NUMBER;
   SELECT count(*)
     INTO l_return
     FROM vie_x
     WHERE field1 = p_field1;

   RETURN l_return;

END vie_x_rowcount;

Function created.

SQL> insert into x(field1, field2) values('x', 1);

1 row created.

SQL> commit;

Commit complete.

These are the statistics for the result cache, just to show you we’re starting without any caching.

SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       0
Find Count		               0
Invalidation Count	           0

When we execute the function, the statistics show that there’s an entry created in the cache.

SQL> select vie_x_rowcount('x') from dual;


SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               0
Invalidation Count	           0

When we execute the same code again, we’ll get the same result and the statistics show us that the result is found in the cache.
Good job Oracle!

SQL> select vie_x_rowcount('x') from dual;


SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               1
Invalidation Count	           0

Let’s insert a new row in the table.
This time the statistics show us that the cache is “invalidated”, meaning the function has to be executed again to return the correct value.

SQL> insert into x values('x', 2);

1 row created.

SQL> commit;

Commit complete.

SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               1
Invalidation Count	           1

And the expected result…

SQL> select vie_x_rowcount('x') from dual;


The Oracle database has its own data dictionary, a set of tables where it stores all information about the database and what’s in it.
Data of these tables are available through views, data dictionary views.
In the following example I’ll use the data dictionary view that holds the information on columns.
I created a function that returns the number of columns for a certain table.

SQL> CREATE OR REPLACE FUNCTION number_of_columns(p_table_name VARCHAR2)

   l_return NUMBER;


   SELECT count(*)
     INTO l_return
     FROM user_tab_columns
    WHERE table_name = p_table_name;

   RETURN l_return;

END number_of_columns;

Function created.

To make sure we’ll start with a clean cache, I’ll flush it using the dbms_result_cache.flush procedure.

SQL> execute dbms_result_cache.flush

PL/SQL procedure successfully completed.

SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       0
Find Count		               0
Invalidation Count	           0

When we execute the function, we’ll get the expected result: the function is executed and a cache entry is created.

SQL> select number_of_columns('X') from dual;


SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               0
Invalidation Count	           0

We can execute it again and see that the return value is retrieved from the cache.

SQL> select number_of_columns('X') from dual;


SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               1
Invalidation Count	           0

Let’s add a column to the table.
This should add a new row in a data dictionary table and thus in the data dictionary view we use in our function.

SQL> alter table x add (field3 date);

Table altered.

SQL> desc x
 Name					   Null?    Type
 ------------------------- -------- ----------------------------
 FIELD1 					        VARCHAR2(1)
 FIELD2 					        NUMBER(1)
 FIELD3 					        DATE

Now execute the function again.
And the result is…

SQL> select number_of_columns('X') from dual;


Not what we expected!
When we take a look at the result cache statistics, it shows that the cache wasn’t invalidated and the result was retrieved from the result cache.

SQL> select name, value from v$result_cache_statistics where name in ('Create Count Success', 'Find Count', 'Invalidation Count');

NAME			               VALUE
------------------------------ ------------------------------
Create Count Success	       1
Find Count		               2
Invalidation Count	           0

When we flush the cash and execute the function again, we’ll get the correct result cache.

SQL> execute dbms_result_cache.flush

PL/SQL procedure successfully completed.

SQL> select number_of_columns('X') from dual;


So, it seems that the result cache isn’t invalidated on data dictionary tables.
And indeed this is what I found in the Oracle documentation:

You cannot cache results when the following objects or functions are in a query:

  • Temporary tables and tables in the SYS or SYSTEM schemas

Migrate your MS Access data to an Oracle database using the ETL Tool Talend

APEX is promoted as the perfect replacement for MS Access applications. One thing you should consider though is how you migrate your data to the Oracle database. In APEX there is a handy tool called the Data Workshop that can be used for this. You first export your Excel files from the MS Access database, and then follow the data upload wizard to import the data into identical tables. Since you are not always working with a 1-1 relationship, you will most likely have to write some PL/SQL to get all the data in the right tables.


The downside is that you will need to repeat this process when you go into production. This is not a big problem if you only have one table to migrate. But if you have multiple tables and/ or your users also want new data during tests and trainings, you will spend a lot of time exporting and importing Excel files.

A recent APEX project for a client required a large data migration from MS Access Databases to the Oracle database. Because we would require fresh data on several points in the development process we decided to use the ETL Open Source Tool Talend. We got impressed of how intuitive the tool is, it only took a few days before we were familiar with the tool. Once you get the hang of it, you can write (or should I say draw) migrations of tables in no time. We needed to migrate from an MS Access database but the tool supports a wide range of databases and documents to import your data from. In total we migrated around 30-40 tables to our Oracle database.

Let’s have a closer look at one of our migration jobs.


At the left we see our MS Access database. Each tAccessInput component will get data from one table. After that we join the tables in our tMap_1 component. The reason we don’t just write our joins in one component, is because this way we can really see how many rows every table returns.

On the bottom we have some Oracle Database input connections. They will join the persons of our MS Access Database with the persons in our Oracle Database based on the National registration number. After that we write our data to our Oracle Database. You may notice that we have two lines going to Excel files. This is our error logging; we use this to log the rows that did not find a match. In our first Excel for example we write persons that did not find a match in our Oracle Database.

This is just one example, in total about 20 jobs were built. During the development we also had to deal with certain calculations or convert data. For most things there was a component ready to use and if there wasn’t you could always write a Java expression in the tMap items.

I hope I convinced you of the benefits of using Talend as a migration tool for APEX projects, because we will certainly use this tool again!