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


jueves, 18 de noviembre de 2021

Oracle Tablespaces Smallfile y Bigfile

Saludos,  

Como ya sabemos los tablespaces son parte de la estructura lógica de la base de datos que puede tener 1 o mas datafiles. Los datafiles son parte de la estructura física de la base de datos que puede estar asignado a 1 tablespace.

Hasta antes de la versión 10g solo existía 1 tipo de Tablespaces conocidó como SmallFile. El nuevo tipo de Tablespaces incluido desde la versión 10g es BigFile.



TABLESPACES SMALLFILE.- Tablespaces tradicional por defecto de Oracle y podrá tener uno o varios Datafile. El Datafile su tamaño será limitado por el parámetro db_block_size(2k, 4k, 8k, 16k y 32k) que se define al crear la base de datos.


TABLESPACES BIGFILE.- Este tipo de tablespace aparece de la versión de la 10g y  presentan la ventaja de tener datafiles de mayor tamaño de hasta 128Tb(Dependera sistema de archivos) pero con la restricción que el tablespace solo puede tener 1 datafile.


Habiendo dicho esto cual seria la ventaja entre SMALLFILE y BIGFILE?

SmallFile fue la primera versión para los Tablespaces y se recomienda su uso para sistemas de archivos que manejan tamaños limitados.

BigFile fue introducido desde la versión 10g y solo puede contener un solo datafile que puede tener un gran tamaño.

Por ejemplo si tenemos una base de datos db_block_size de 8k y necesitamos un tablespace de de tamaño de 1Tb  usando SmallFile vamos a tener que asignar 32 datfiles de 32Gb para poder alcanzar la capacidad de 1Tb mientras que con BigFile solo necesitamos agregar 1 solo de 1Tb el cual puede seguir aumentando de tamaño.

Tablespaces SmallFile

CREATE TABLESPACE TS_SMALLFILE DATAFILE 
  '/u01/app/dbfiles/orcl/ts_smallfile01.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile02.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile03.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile04.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile05.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile06.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile07.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile08.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile09.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile10.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile11.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile12.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile13.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile14.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile15.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile16.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile17.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile18.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile19.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile20.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile21.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile22.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile23.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile24.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile25.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile26.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile27.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile28.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile29.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile30.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile31.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile32.dbf' SIZE 32G   
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Tablespaces BigFile

CREATE BIGFILE TABLESPACE TS_BIGFILE DATAFILE 
  '/u01/app/dbfiles/orcl/ts_bigfile.dbf' SIZE 1024G AUTOEXTEND ON NEXT 100M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;


Si bien es cierto ambos van a tener la capacidad de crecer pero para la gestión de un DBA va hacer mas fácil gestionar tablespace con 1 solo datafile que con muchos datafile. Está bastante claro que los Tablespaces Bigfile ayudan en la transparencia de los datos, ya que cada Tablespaces tiene solo un archivo de datos, por lo que parece muy claro dónde pueden estar nuestros datos. Además, la base de datos se vuelve más fácil de administrar, ya que tiene que administrar una menor cantidad de archivos de datos. Entonces, si cree que tiene espacio de base de datos para administrar, simplemente hágalo

No existe limitantes para el uso de tablas, índices u otro objeto de base que haga uso de Tablespace.

 

Limitaciones y consideraciones Tablespaces BigFile:

  • Los tablespaces Bigfile deben crearse administrados localmente y con administración automática del espacio de segmento. Éstas son las especificaciones predeterminadas. Oracle devolverá un error si se especifica DEXTENT MANAGEMENT DICTIONARY o SEGMENT SPACE MANAGEMENT MANUAL. Pero hay dos excepciones cuando los segmentos de tablespaces de bigfile se administran manualmente:
    • Undo tablespace administrado localmente
    • Espacio de tabla temporal
  • Los tablespaces Bigfile deben dividirse para que las operaciones en paralelo no se vean afectadas negativamente. Oracle espera que los tablespaces de bigfile se utilice con Automatic Storage Management (ASM) u otros administradores de volúmenes lógicos que admitan la creación de bandas o RAID.
  • Los tablespaces Bigfile no deben usarse en plataformas con restricciones, lo que limitaría la capacidad del tablespaces.
  • Evite el uso de tablespaces de archivos grandes si es posible que no haya espacio libre disponible en un grupo de discos y la única forma de ampliar un tablespaces es agregar un nuevo archivo de datos en un grupo de discos diferente.


Referencias

https://docs.oracle.com/cd/E18283_01/server.112/e17120/tspaces002.htm

https://docs.oracle.com/database/121/VLDBG/GUID-7B764F63-C4B4-4D30-9E96-2D6D73CB4122.htm