PACK función escalar

La función PACK devuelve un valor de cadena binaria que contiene una matriz de tipo de datos y una representación empaquetada de cada argumento de expresión no nulo.

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualPACK( CCSID 1208CCSID DEFAULT, ,expresión )

El esquema es SYSIBM.

CCSID 1208
Especifica que CCSID 1208 se utiliza para codificar valores de cadenas de caracteres.
CCSID DEFAULT
Especifica que las cadenas de caracteres deben empaquetarse en su codificación original, tal cual, sin conversión CCSID.
expresión
Expresión que devuelve un valor para ser codificado en la cadena de resultado. La expresión debe ser un tipo de datos integrado que no sea DECFLOAT, GRAPHIC, VARGRAPHIC, ROWID, un LOB, XML o una cadena de caracteres definida como FOR BIT DATA.

El resultado de la función PACK es una cadena binaria que se construye a partir de los siguientes elementos:

  • Un byte de bandera reservado para uso futuro
  • Un valor entero de 2 bytes que indica el número de argumentos codificados en la cadena resultante
  • El conjunto de datos que contiene un elemento con información de tipo de datos para cada uno de los argumentos codificados
  • Los valores codificados para los argumentos de expresión en el orden especificado en la invocación de la función.

La cadena binaria resultante tiene el siguiente formato:

longitud de 2 bytes Byte de distintivo Número de elementos Matriz de tipo de datos Valores de datos codificados
Longitud VARBINARIA Datos VARBINARIOS

La matriz de tipo de datos incluye un elemento para cada argumento de expresión en el mismo orden especificado en la invocación de la función. Cada elemento de la matriz contiene un valor SQLTYPE de 2 bytes que indica el tipo de datos de la expresión correspondiente. Cuando el valor SQLTYPE es un número impar, la expresión correspondiente representa un valor nulo y el valor no se codifica en la cadena resultante. Cuando el valor SQLTYPE es un número par, la cadena resultante contiene una representación codificada del valor en función del tipo de datos. La siguiente tabla describe los tipos de datos:

Tabla 1. Tipos de datos para la expresión de la función PACK
Tipo de datos de expresión Descripción de la representación codificada del valor en la cadena resultante
SMALLINT, INTEGER o BIGINT El valor de la expresión como un entero binario con signo de 16 bits, entero binario con signo de 32 bits o entero binario con signo de 64 bits, dependiendo del tipo de datos
dec imal( p,s)1 Una secuencia de 1 byte de precisión p, 1 byte de escala s y (p+2)/2 bytes del número decimal empaquetado con signo
real 2 o doble 3 El valor de la expresión como formato de punto flotante IEEE de 64 bits
CHAR o VARCHAR Una secuencia del CCSID de 2 bytes de la codificación de la cadena, seguida de la longitud de 2 bytes de la cadena y, a continuación, los datos del argumento en la codificación CCSID especificada
BINARY o VARBINARY Una secuencia de: longitud de 2 bytes de la cadena, seguida de los datos del argumento
FECHA Una representación numérica decimal empaquetada sin signo de 4 bytes de la fecha en el formato AAAAAMMDD
HORA Una representación numérica decimal empaquetada sin signo de 3 bytes de la hora en el formato HHMMSS
FECHA Y HORA (p ) SIN ZONA HORARIA Una secuencia de un valor entero binario sin signo de 2 bytes de precisión p, seguida de 7+ (p+1)/2 bytes de una representación numérica decimal empaquetada sin signo de la marca de tiempo en forma de AAAAMMDDHHMMSSNN, donde NN son de cero a seis bytes de los segundos fraccionarios, dependiendo de la precisión p
FECHA Y HORA (p) CON ZONA HORARIA Una secuencia de un valor entero binario sin signo de 2 bytes de precisión p, seguido de 7+ (p+1)/2 bytes de una representación de número decimal empaquetado sin signo de la marca de tiempo en forma de AAAAMMDDHHMMSSNN, donde NN es de cero a seis bytes de los segundos fraccionarios, dependiendo de la precisión p, y luego seguido de 2 bytes de una representación de número decimal empaquetado sin signo de la zona horaria (con el bit de orden superior establecido para el valor de zona horaria negativo)
Nota : Los tipos de datos en minúsculas se definen de la siguiente manera:
  1. decimal = DECIMAL (p,s) o NUMER IC(p,s )
  2. real = REAL o FLOAT(n) donde n es la especificación para un punto flotante de precisión simple
  3. double = DOBLE, DOBLE PRECISIÓN, FLOAT o FLOAT(n) donde n es la especificación para un punto flotante de doble precisión
Los sinónimos de los tipos de datos, ya sea en forma larga o corta, se consideran los mismos que los que se enumeran.

Todos los datos numéricos se representan en formato big endian.

El resultado de la función es VARBINARY. El atributo de longitud del resultado es MIN (32704, la longitud del encabezado + la longitud de la matriz de tipo de datos + SUM(longitudes máximas de los valores de expresión codificados)). El resultado no puede ser nulo.

Ejemplo 1 : La siguiente declaración muestra que los valores VARCHAR, DATE y DOUBLE se empaquetan en una cadena binaria, y la cadena se devuelve a la aplicación:

  SELECT PACK(CCSID 1208, 'Alina', DATE'1977-08-01', DOUBLE(0.5))
    FROM SYSIBM.SYSDUMMYU;

La sentencia devuelve una cadena VARBINARY con el siguiente contenido (El resultado se muestra en formato hexadecimal e incluye separadores de espacio para facilitar la lectura). El resultado real no está en formato hexadecimal y no incluye ningún separador de espacios):

  00 0003 01C4 0180 01E0 04B80005416C696E61 19770801 3FE0000000000000

La cadena de caracteres «Alina» está en formato CCSID 1208 ( UTF-8 ) independientemente de la codificación original de la cadena debido a la especificación CCSID 1208 en la invocación PACK.

La cadena resultante es VARBINARY(30). El atributo de longitud de 30 viene determinado por los siguientes elementos:

  • 1 (byte de bandera)
  • +2 (tamaño del número de artículos)
  • +2*3 (tipo de datos de 2 bytes por número de artículos)
  • +2 (CCSID) + 2 (longitud) + 5 (longitud de datos VARCHAR(5))
  • +4 (longitud de datos DATE)
  • +8 (DOBLE longitud)

La longitud real del resultado también es 30.

Ejemplo 2 : La siguiente declaración muestra que cuando los valores NULL se empaquetan en una cadena binaria, no ocupan ningún espacio en la parte de valores codificados del resultado:

SELECT PACK(CCSID DEFAULT, '', CAST(NULL AS TIME),
 CAST('Bridget' AS VARCHAR(20) CCSID EBCDIC))
 FROM SYSIBM.SYSDUMMYU;

La sentencia devuelve una cadena VARBINARY con el siguiente contenido. (El resultado se muestra en formato hexadecimal e incluye separadores de espacio para facilitar la lectura). El resultado real no está en formato hexadecimal y no incluye ningún separador de espacios)

00 0003 01C4 0185 01C4 04B80000 00250007C2D9C9C4C7C5E3

La cadena de caracteres '' (cadena vacía) se empaqueta en su formato CCSID 1208 original, y 'Bridget' se empaqueta en su formato CCSID 37 original, debido a la especificación CCSID DEFAULT en la invocación PACK.

La cadena resultante es VARBINARY(40). El atributo de longitud de 40 viene determinado por los siguientes elementos:

  • 1 (byte de bandera)
  • +2 (tamaño del número de artículos)
  • +2*3 (tipo de datos de 2 bytes por número de artículos)
  • +2 (CCSID) + 2 (longitud) + 0 (longitud de datos de cadena vacía)
  • +3 (longitud de datos TIME)
  • +2 (CCSID) + 2 (longitud) + 20 (VARCHAR(20) longitud máxima)

La longitud real de la cadena resultante es 24, que está determinada por los siguientes elementos

  • 1 (byte de bandera)
  • +2 (tamaño del número de artículos)
  • +2*3 (tipo de datos de 2 bytes por número de artículos)
  • +2 (CCSID) + 2 (longitud) + 0 (longitud de datos de cadena vacía)
  • +0 (NULO)
  • +2 (CCSID) + 2 (longitud) + 7 (VARCHAR(20) longitud real)