Função CAST
CAST é uma função complexa que transforma um ou mais valores de um tipo de dados para outro.
Sintaxe
Na prática, não é possível especificar todos os parâmetros acima ao mesmo tempo. Por exemplo, os parâmetrosCCSID e ENCODING têm efeito somente em conversões entre sequências, enquanto FORMAT aplica-se somente às conversões entre sequência e numérico e entre sequência e data/hora (em qualquer direção).
Nem todas as conversões são suportadas; veja Casts suportados para uma lista de conversões suportadas.
Parâmetros
Expressão de Origem
CAST retorna seu primeiro parâmetro (source_expression), que pode conter mais de um valor, como o tipo de dados especificado por seu segundo parâmetro (DataType). Em todos os casos, se a expressão de origem for NULL, o resultado será NULL. Se a expressão de origem avaliada não for compatível com o tipo de dados de destino, ou se a expressão de origem tiver o formato incorreto, será gerado um erro de tempo de execução.
CCSID
O parâmetro CCSID é utilizado somente para conversões para/de um dos tipos de dados de sequência. Utilize o parâmetro CCSID para especificar a página de códigos da sequência de origem ou de destino.
O parâmetro CCSID pode ser qualquer expressão que seja avaliada para um valor do tipo INT. A expressão é interpretada de acordo com regras normais IBM® Integration Bus para CCSIDs. Veja Páginas de código suportadas para uma lista de valores válidos.
tipo de dados
- Tipos de sequência:
- BIT
- BLOB
- CARÁTER
- Tipos numéricos:
- DECIMAL
- VALOR FLUTUANTE
- Número inteiro
- Tipos de data/hora:
- Data
- GMTTIME
- GMTTIMESTAMP
- INTERVALO
- Hora
- TIMESTAMP
- Booleano:
- BOOLEAN
DEFAULT
O parâmetro DEFAULT fornece um método para evitar que exceções sejam emitidas de instruções CAST, fornecendo um valor de último recurso para o retorno.
O parâmetro DEFAULT deve ser uma expressão ESQL válida que retorne o mesmo tipo de dados que está especificado no parâmetro DataType, caso contrário, uma exceção é emitida.
Os parâmetros CCSID, ENCODING e FORMAT não são aplicados ao resultado do parâmetro DEFAULT; portanto, a expressão deve ser do CCSID, ENCODING e FORMAT corretos.
Codificação
- MQENC_NATIVE (0x00000222L)
- MQENC_INTEGER_NORMAL (0x00000001L)
- MQENC_INTEGER_REVERSED (0x00000002L)
- MQENC_DECIMAL_NORMAL (0x00000010L)
- MQENC_DECIMAL_REVERSED (0x00000020L)
- MQENC_FLOAT_IEEE_NORMAL (0x00000100L)
- MQENC_FLOAT_IEEE_REVERSED (0x00000200L)
- MQENC_FLOAT_S390 (0x00000300L)
Formato
Use o parâmetro FORMAT para conversões entre tipos de dados de sequência e tipos de dados numéricos ou de data/hora. Para conversões de tipos de sequência, FORMAT define como a sequência de origem deve ser analisada para preencher o tipo de dados de destino. Para conversões para tipos de sequência, define como os dados na expressão de origem são formatados na sequência de destino.
FORMAT utiliza tipos diferentes de expressões para conversões de data/hora e numéricas. Entretanto, a mesma expressão FORMAT pode ser utilizada independentemente se a conversão é para uma sequência ou de uma sequência.
- DECIMAL
- VALOR FLUTUANTE
- Número inteiro
- Data
- GMTTIMESTAMP
- TIMESTAMP
- GMTTIME
- Hora
Para obter mais informações sobre conversão para e a partir de tipos de dados numéricos, consulte Formatando e parsing números como strings. Para obter mais informações sobre conversão para e a partir de tipos de dados de data / hora, consulte Formatando e analisando dateTimes como strings.
O parâmetro FORMAT é equivalente aos utilizados em muitos outros produtos, como a ICU e o Microsoft Excel.
Exemplos
Exemplo 1. CAST formatado de DECIMAL para CHARACTER
DECLARE source DECIMAL 31415.92653589;
DECLARE target CHARACTER;
DECLARE pattern CHARACTER '#,##0.00';
SET target = CAST(source AS CHARACTER FORMAT pattern);
-- target is now '31,415.93'
Exemplo 2. CAST formatado de DATE para CHARACTER
DECLARE now CHARACTER;
SET now = CAST(CURRENT_TIMESTAMP AS CHARACTER FORMAT 'yyyyMMdd-HHmmss');
-- target is now '20041007-111656' (in this instance at least)
Exemplo 3. CAST formatado do CHARACTER para DATE
DECLARE source CHARACTER '01-02-03';
DECLARE target DATE;
DECLARE pattern CHARACTER 'dd-MM-yy';
SET target = CAST(source AS DATE FORMAT pattern);
-- target now contains Year=2003, Month=02, Day=01
Exemplo 4. CAST formatado de CHARACTER para TIMESTAMP
DECLARE source CHARACTER '12 Jan 03, 3:45pm';
DECLARE target TIMESTAMP;
DECLARE pattern CHARACTER 'dd MMM yy, h:mma';
SET target = CAST(source AS TIMESTAMP FORMAT pattern);
-- target now contains Year=2003, Month=01, Day=03, Hour=15, Minute=45,
Seconds=58
-- (seconds taken from CURRENT_TIME since not present in input)
Exemplo 5. CAST formatado de DECIMAL para CHARACTER, com padrão negativo
DECLARE source DECIMAL -54231.122;
DECLARE target CHARACTER;
DECLARE pattern CHARACTER '#,##0.00;(#,##0.00)';
SET target = CAST(source AS CHARACTER FORMAT pattern);
-- target is now '£(54,231.12)'
Exemplo 6. CAST formatado de CHARACTER para TIME
DECLARE source CHARACTER '16:18:30';
DECLARE target TIME;
DECLARE pattern CHARACTER 'hh:mm:ss';
SET target = CAST(source AS TIME FORMAT pattern);
-- target now contains Hour=16, Minute=18, Seconds=30
Exemplo 7. CASTs dos tipos numéricos para DATE
CAST(7, 6, 5 AS DATE);
CAST(7.4e0, 6.5e0, 5.6e0 AS DATE);
CAST(7.6, 6.51, 5.4 AS DATE);
Exemplo 8. CASTs dos tipos numéricos para TIME
CAST(9, 8, 7 AS TIME);
CAST(9.4e0, 8.6e0, 7.1234567e0 AS TIME);
CAST(9.6, 8.4, 7.7654321 AS TIME);
Exemplo 9. CASTs para TIMESTAMP
CAST(DATE '0001-02-03', TIME '04:05:06' AS TIMESTAMP);
CAST(2, 3, 4, 5, 6, 7.8 AS TIMESTAMP);
Exemplo 10. CASTs para GMTTIMESTAMP
CAST(DATE '0002-03-04', GMTTIME '05:06:07' AS GMTTIMESTAMP);
CAST(3, 4, 5, 6, 7, 8 AS GMTTIMESTAMP);
CAST(3.1e0, 4.2e0, 5.3e0, 6.4e0, 7.5e0, 8.6789012e0 AS GMTTIMESTAMP);
CAST(3.2, 4.3, 5.4, 6.5, 7.6, 8.7890135 AS GMTTIMESTAMP);
Exemplo 11. CASTs para INTERVAL de INTEGER
CAST(1234 AS INTERVAL YEAR);
CAST(32, 10 AS INTERVAL YEAR TO MONTH );
CAST(33, 11 AS INTERVAL DAY TO HOUR );
CAST(34, 12 AS INTERVAL HOUR TO MINUTE);
CAST(35, 13 AS INTERVAL MINUTE TO SECOND);
CAST(36, 14, 10 AS INTERVAL DAY TO MINUTE);
CAST(37, 15, 11 AS INTERVAL HOUR TO SECOND);
CAST(38, 16, 12, 10 AS INTERVAL DAY TO SECOND);
Exemplo 12. CASTs para INTERVAL de FLOAT
CAST(2345.67e0 AS INTERVAL YEAR );
CAST(3456.78e1 AS INTERVAL MONTH );
CAST(4567.89e2 AS INTERVAL DAY );
CAST(5678.90e3 AS INTERVAL HOUR );
CAST(6789.01e4 AS INTERVAL MINUTE);
CAST(7890.12e5 AS INTERVAL SECOND);
CAST(7890.1234e0 AS INTERVAL SECOND);
Exemplo 13. CASTs para INTERVAL de DECIMAL
CAST(2345.67 AS INTERVAL YEAR );
CAST(34567.8 AS INTERVAL MONTH );
CAST(456789 AS INTERVAL DAY );
CAST(5678900 AS INTERVAL HOUR );
CAST(67890100 AS INTERVAL MINUTE);
CAST(789012000 AS INTERVAL SECOND);
CAST(7890.1234 AS INTERVAL SECOND);
Exemplo 14. CASTs para FLOAT de INTERVAL
CAST(INTERVAL '1234' YEAR AS FLOAT);
CAST(INTERVAL '2345' MONTH AS FLOAT);
CAST(INTERVAL '3456' DAY AS FLOAT);
CAST(INTERVAL '4567' HOUR AS FLOAT);
CAST(INTERVAL '5678' MINUTE AS FLOAT);
CAST(INTERVAL '6789.01' SECOND AS FLOAT);
Exemplo 15. CASTs DECIMAL de INTERVAL
CAST(INTERVAL '1234' YEAR AS DECIMAL);
CAST(INTERVAL '2345' MONTH AS DECIMAL);
CAST(INTERVAL '3456' DAY AS DECIMAL);
CAST(INTERVAL '4567' HOUR AS DECIMAL);
CAST(INTERVAL '5678' MINUTE AS DECIMAL);
CAST(INTERVAL '6789.01' SECOND AS DECIMAL);
Exemplo 16. Uma Coerção Ternária que Falha e Resulta na Substituição de um Valor Padrão
CAST(7, 6, 32 AS DATE DEFAULT DATE '1947-10-24');
Exemplo 17. Uma Coerção Sexternária que Falha e Resulta na Substituição de um Valor Padrão
CAST(2, 3, 4, 24, 6, 7.8 AS TIMESTAMP DEFAULT TIMESTAMP '1947-10-24 07:08:09');
Exemplo 18. Uma Coerção Ternária que Falha e Emite uma Exceção
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE LIKE '%' BEGIN
SET OutputRoot.XMLNS.Data.Date.FromIntegersInvalidCast = 'Exception thrown';
END;
DECLARE Dummy CHARACTER CAST(7, 6, 32 AS DATE);
END;
Exemplo 19. Uma Coerção Sexternária que Falha e Emite uma Exceção
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE LIKE '%' BEGIN
SET OutputRoot.XMLNS.Data.Timestamp.FromIntegersInvalidCast = 'Exception thrown';
END;
DECLARE Dummy CHARACTER CAST(2, 3, 4, 24, 6, 7.8 AS TIMESTAMP);
END;
Exemplo 20. Efetuar cast de BLOB para INTEGER
-- Input BLOB must be 16 digits
DECLARE source BLOB X'0000000000000006';
DECLARE target INT;
SET target = CAST(source AS INT);
-- target is now base 10 integer 6
SET source = X'00000000000012C4';
SET target = CAST(source AS INT);
-- target is now base 10 integer 4804
Exemplo 21. Efetuar cast de INTEGER para BLOB
DECLARE source INT 6;
DECLARE target BLOB;
SET target = CAST(source AS BLOB);
-- target is now x'0000000000000006'
SET source = 4804;
SET target = CAST(source AS BLOB);
-- target is now x'00000000000012C4'