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.
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:
| 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:
|
|
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 3FE0000000000000La 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 00250007C2D9C9C4C7C5E3La 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)
