top of page

Query an address from a Web Source Module [APEX 18.1]

Updated: Dec 8, 2018

In this example, we will learn how to create and consume data from a Web Source Module in Oracle Application Express (APEX) 18.1. It is very simple and useful!

What is a Web Source Module in Oracle APEX?

Web Source Modules allow developers to access REST services or JSON data in applications, enabling the use of this data in APEX components such as interactive reports and forms.

Unlike Web Services references, a Web Source Module contains Web Service metadata that can be used in APEX component processes as well as in a PL/SQL block to perform a service call and process the responses

To learn more about Web Source Modules, go to: Application Express App Builder User's Guide.

How create and use a Web Source Module?

In this example, I will demonstrate how to create a Web Source Module by accessing a Web Service that contains address data from Brazil. The Web Service is available for free and is maintained by ViaCEP. Web service access instructions are available on

1. To create a Web Source Module go to Shared Components > Data Sources > Web Source Modules and click on Create.

2. In the next step, enter a name of your choice for the Web Source Module and the URL Endpoint and click on Next. In this case, our URL Endpoint is: Note: The URL must begin with http:// or https://

3. On the next screen, enter the data for the Remote Server. Select the Remote Server, entered in the previous step, and enter the Service URL Path. In this example, we pass a parameter that the zip code and the JSON output format.

4. Now it is necessary to inform if the Web Service needs authentication. In our example, we will not need authentication.

5. We now declare the parameters needed to query the addresses. We'll just need the zip code. We select the Parameter Type, we define a Parameter Name and, just to verify that everything is working correctly, we pass a Value as parameter.

Note: In our example, the parameter values ​​will be dynamic, so we define that it will not be static in the Is Static.

By clicking on Discover, we can see the Data returned based on the parameter we reported, as well as the Data Profile of the Web Service.

6. Once you have verified that the data returned and the Data Profile is correct, click on Create Web Source.

Once this is done, our Web Source Module will be created. We can verify, after its creation, in our Data Profile that the Response Format is JSON and that there are nine columns visible.

7. After creating the Web Source Module, we created a Blank Page named Search Address and added three items to it.

We define the P3_ZIP_CODE item as the Number Field and maximum length of 8 - number of digits required for the Brazilian zip code standard. And other items (P3_ADDRESS and P3_CITY) as Display Only field.

8. We now create a dynamic action for the P3_ZIP_CODE item when the item is changed (Event: Change). The condition for execution must be set to when the item is not null. If the action is true, we execute the following PL/SQL code:


   l_context     apex_exec.t_context;
   l_parameters  apex_exec.t_parameters;
   l_logidx      pls_integer;
   l_baridx      pls_integer;
   l_locidx      pls_integer;
   l_ufidx       pls_integer;

   apex_exec.add_parameter (
      p_parameters => l_parameters,
      p_name       => 'zipcode',
      p_value      => :P3_ZIP_CODE);
   -- Open Web Source
   l_context: = apex_exec.open_web_source_query (
      p_module_static_id => 'Viacep_Web_Source',
      p_parameters       => l_parameters);
   l_logidx: = apex_exec.get_column_position (l_context, 'LOGRADOURO');
   l_baridx: = apex_exec.get_column_position (l_context, 'BAIRRO');
   l_locidx: = apex_exec.get_column_position (l_context, 'LOCALITY');
   l_ufidx:  = apex_exec.get_column_position (l_context, 'UF');
   while apex_exec.next_row (l_context) loop
      if apex_exec.get_varchar2 (l_context, l_logidx) is null or 
         apex_exec.get_varchar2 (l_context, l_locidx) is null then
         : P3_ADDRESS: = null;
         : P3_CITY: = null;
         : P3_ADDRESS: = apex_exec.get_varchar2 (l_context, l_logidx) || 
                         ',' || apex_exec.get_varchar2 (l_context, 
         : P3_CITY: = apex_exec.get_varchar2 (l_context, l_locidx) || 
                      '('|| apex_exec.get_varchar2 (l_context, l_ufidx) 
                      ||') ';
      end if;
   end loop;
   -- Close Web Source
   apex_exec.close (l_context);

   when others then
      -- Close Web Source
      apex_exec.close (l_context);

In this PL/SQL block we use the OPEN_WEB_SOURCE_QUERY function of the APEX_EXEC package. Note that we use the GET_COLUMN_POSITION functions to get the index of the columns we are retrieving from our Web Source Module. Afterwards, we use the GET_VARCHAR2 function, passing as a parameter the context of the Web Source that we open and the index of the column from where we want to retrieve the value, passing to page items P3_ADDRESS and P3_CITY.

To learn more about APEX_EXEC package, go to: Application Express API Reference.

9. To conclude, we save the changes made to the page and run to see the result.

In this post we could see how working with Web Source Modules in Oracle Application Express (APEX) makes the work of the developer less costly and more agile.

Demo Application

User: demo

Password: demo

4,751 views12 comments

Recent Posts

See All

12 comentários

Alex Euzébio
Alex Euzébio
22 de fev. de 2023

Olá Lucas

Obrigado pelo post. Muito útil. Se puder me ajudar numa dúvida a respeito: Quando tento criar uma origem de dados com endereço Http e não Https, o Apex exibe a mensagem ORA-20987: O URL solicitado foi proibido. Entre em contato com o administrador. Isso tem relação com APEX_INSTANCE_ADMIN.SET_PARAMETER('REQUIRE_OUT_HTTPS', 'N') ??

Agradeço qualquer comentário


Gabriel Bento
Gabriel Bento
04 de mar. de 2021

Pô Lucas, to com dificuldade de fazer funcionar na minha aplicação... será que poderia me auxiliar? meu e-mail é

Dá uma luz aí pra mim, por favorrrr


Hello, any ideas on troubleshooting if after following this carefully, instead of a filtered set I get the full set of data, as if there isn't a parameter?


Yes! About new pagination Method..


Lucas Rayner
Lucas Rayner
01 de mai. de 2019

I'm glad to have helped in part :)

The Oracle APEX documentation usually helps a lot. Whenever you have a question and can not find the answer easily, I recommend that you consult it.

bottom of page