lunes, 25 de septiembre de 2017

Oracle 12c R2 - Utilizar Constantes para definir el tamaño de Variables

Es común encontrar en nuestras aplicaciones, lugares donde accedemos a tablas o vistas diccionario de datos de Oracle para obtener cierta información, por ejemplo:

SELECT t.table_name
INTO vTabla
FROM user_tables t
WHERE t.table_name like ‘T_%’

El tamaño máximo de los indicadores era, hasta Oracle 12c R2, de 30 caracteres, por lo que es frecuente encontrar que se definía a la variable “vTabla” de la siguiente forma:

DECLARE
    vTabla    VARCHAR2(30);

Pero, como ya vimos en el artículo anterior del blog, "Oracle 12c R2 - Identificadores de 128 Bytes", la Release 2 de Oracle 12c nos permite definir indicadores de hasta 128 caracteres de largo, por lo que es probable que nuestras aplicaciones que definían variables para almacenar indicadores con un largo fijo de 30 caracteres muy pronto comiencen a fallar con el siguiente error:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

Afortunadamente, el cambio  en el tamaño de los indicadores viene acompañado en Oracle 12c R2 de la posibilidad de declarar el largo de variables usando constantes. Por ejemplo, podemos definir un paquete de constantes y especificar en el mismo los valores que deseamos utilizar:

CREATE OR REPLACE PACKAGE pkg_constantes
AS
  --
  cn_largo_identificadores  constant pls_integer := 128;
  cn_largo_codigos          constant pls_integer := 20;
  cn_largo_cuit             constant pls_integer := 11;
  --
END pkg_constantes;
/

Y luego utilizar los mismos al momento de definir variables:

declare
  vNombreTabla     VARCHAR2(pkg_constantes.cn_largo_identificadores );
  vCUIT           NUMBER(pkg_constantes.cn_largo_cuit);
  vCodigoCliente  VARCHAR2(pkg_constantes.cn_largo_codigos);

Para simplificar nuestra tarea, la versión 12c R2 ya provee una constante declarada en el paquete “DBMS_STANDARD” llamada “ORA_MAX_NAME_LEN” la cual representa un valor de 128, por lo que nuestro primer ejemplo puede ser reformulado de la siguiente forma:

DECLARE
    vTabla   VARCHAR2(ORA_MAX_NAME_LEN);

Ejemplo y documentación adicional 



No hay comentarios.:

Publicar un comentario