Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função CAST() no Oracle


No banco de dados Oracle, o CAST() função converte seu argumento para um tipo de dados diferente.

Mais especificamente, ele permite converter tipos de dados internos ou valores tipados por coleção de um tipo em outro tipo de dados interno ou tipo de coleção.

Sintaxe


A sintaxe fica assim:
CAST({ expr | MULTISET (subquery) } AS type_name
  [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Exemplo


Segue um exemplo para demonstrar:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;

Resultado:
10-AUG-30 12.00.00.000000000 AM

Forneça um valor padrão no erro de conversão


Você pode usar o DEFAULT return_value ON CONVERSION ERROR argumento para especificar o que retornar no caso de ocorrer um erro ao converter o valor.

Exemplo:
SELECT CAST(
    'Homer' AS NUMBER
    DEFAULT '0' ON CONVERSION ERROR
    )
FROM DUAL;

Resultado:
0

Veja o que acontece quando removemos o DEFAULT return_value ON CONVERSION ERROR argumento:
SELECT CAST(
    'Homer' AS NUMBER
    )
FROM DUAL;

Resultado:
ORA-01722: invalid number

Especificar um formato – O fmt Argumento


Neste exemplo eu uso o fmt argumento para especificar o formato da data no primeiro argumento:
SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP,
    'Day, DD Month YYYY'
    )
FROM DUAL;

Resultado:
03-SEP-21 12.00.00.000000000 AM

Quando você omite o formato


Omitir o formato pode resultar em erro, dependendo se o primeiro argumento está em conformidade com a formatação padrão da sessão para o tipo de dados resultante.

Aqui está o que acontece quando deixo de fora o argumento de formato:
SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultado:
Error report -
ORA-01858: a non-numeric character was found where a numeric was expected

Neste caso, tentei converter uma string em um TIMESTAMP valor, mas a string não se parecia com um TIMESTAMP valor baseado no NLS_TIMESTAMP_FORMAT da minha sessão parâmetro e ocorreu um erro.

Aqui está o formato que minha sessão atual usa para TIMESTAMP valores:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

Resultado:
DD-MON-RR HH.MI.SSXFF AM

Vamos mudar isso:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';

Resultado:
Session altered.

E agora vamos executar a conversão anterior novamente:
SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultado:
Friday, 3 September 2021 12.0.0.000000000 AM

Desta vez não há erro.

Observe que, embora eu tenha alterado explicitamente o NLS_TIMESTAMP_FORMAT parâmetro aqui, geralmente é melhor alterar o NLS_TERRITORY parâmetro em vez disso. Alterando o NLS_TERRITORY parâmetro altera implicitamente outros parâmetros NLS, como os formatos de data, símbolos de moeda, etc.

De qualquer forma, como demonstrado acima, em vez de alterar qualquer um dos parâmetros NLS, você pode usar o fmt argumento ao chamar a função.

O nlsparam Argumento


Você pode usar o opcional nlsparam argumento para especificar parâmetros NLS de dentro da função.

Exemplo:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'English';
ALTER SESSION SET NLS_DATE_FORMAT = 'fmDay, DD Month YYYY';
SELECT 
    CAST(
    'sábado, 10 agosto 30' AS DATE,
    'Day, DD Month RR',
    'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Resultado:
Saturday, 10 August 2030

Nesse caso, comecei definindo alguns dos parâmetros NLS da minha sessão. Então, quando eu chamei CAST() , passei a string em espanhol e usei o nlsparam argumento para especificar isso.

Assim, o resultado é exibido usando os parâmetros NLS da minha sessão, mas o valor real que passei estava em espanhol.

Mais informações


Há muito o que ter em mente ao converter entre tipos de dados. Consulte a documentação da Oracle para obter mais informações sobre como usar o CAST() função.