sábado, 20 de noviembre de 2021

Consumir Servicios Web desde la base de datos Oracle (Webservice)

Desde la version 10g Oracle permite desde la base de datos poder consumir servicios web con el paquete utl_http .

Esto es una gran utilidad y tiene mucha utilidad, vamos a realizar un ejemplo en el que vamos a consultar un listado de paises en formato JSON desde esta dirección:

Para empezar vamos a tener que :
  • Dar los permisos necesarios utl_http  de ejecución 
  • Crear la reglas de ACL para consumir la pagina

Permiso UTL_HTTP usuario VICTOR
GRANT EXECUTE ON UTL_HTTP TO VICTOR;

Regla ACL
--CREAR ACL ACL_WEBSERVICE_TEST
begin
    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'acl_webservice_test.xml',
    description => 'pruebas de consumos de servicios web',
    principal => 'PUBLIC',
    is_grant => true,
    privilege => 'connect'
    );
end;
--Dar permiso para consumir la direccion COUNTRY.IO por el puerto 80
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'acl_webservice_test.xml',
host => 'country.io',
lower_port => 80);
commit;
END;


Ahora si, procedamos a realiza la rutina para la lectura de los datos, se puede traer todo de una sola o por partes, pero es preferible por parte ya que el request puede devolver un valor muy grande y resultado se cortará.

--De una sola
SELECT UTL_HTTP.REQUEST('http://country.io/names.json') FROM DUAL;

--Por partes
DECLARE
   L_HTML    UTL_HTTP.HTML_PIECES;
BEGIN
   L_HTML := UTL_HTTP.REQUEST_PIECES ( 'http://country.io/names.json', 100 );
   DBMS_OUTPUT.PUT_LINE ( L_HTML.COUNT || ' piezas.' );
   IF L_HTML.COUNT < 1 THEN
      DBMS_OUTPUT.PUT_LINE ( 'SIN DATOS' );
   ELSE
      FOR i IN 1 .. L_HTML.COUNT LOOP
         DBMS_OUTPUT.PUT_LINE ( L_HTML ( i ) );
      END LOOP;
   END IF;
END;

Ahora el mismo ejemplo pero ahora lo enviamos a una tabla, para ello crearemos una tabla para almacenarlo.

CREATE TABLE HTTP_PAISES 
(
    DATO CLOB
);
--Almacenar el resultado en la tabla HTTP_PAISES
DECLARE
   L_HTML   UTL_HTTP.HTML_PIECES;
   L_DATO   CLOB;
BEGIN
   L_HTML := UTL_HTTP.REQUEST_PIECES ( 'http://country.io/names.json', 100 );
   DBMS_OUTPUT.PUT_LINE ( L_HTML.COUNT || ' piezas.' );
   IF L_HTML.COUNT < 1 THEN
      DBMS_OUTPUT.PUT_LINE ( 'SIN DATOS' );
   ELSE
      FOR i IN 1 .. L_HTML.COUNT LOOP
         L_DATO:=L_DATO||L_HTML ( i );
         DBMS_OUTPUT.PUT_LINE ( L_HTML ( i ) );
      END LOOP;
      INSERT INTO HTTP_PAISES(DATO)VALUES(L_DATO);
      COMMIT;
   END IF;
END;
--LISTA LOS PAISES
SELECT PAIS
FROM   HTTP_PAISES t
       CROSS JOIN
       JSON_TABLE(
         t.DATO,
         '$.*'
        COLUMNS (PAIS PATH '$')
       )T_LIST;


Tienes in ejemplo sencillo de como consumir servicios web desde la base y espero te sirva.

Si quieres ver el uso de JSON en Oracle mira el siguiente blog.

https://oracle-y-yo.blogspot.com/2021/04/leer-datos-json-como-tabla-en-oracle.html


No hay comentarios:

Publicar un comentario