No banco de dados Oracle, o
DECOMPOSE()
A função retorna o resultado da aplicação de uma das decomposições Unicode ao seu argumento de string. A decomposição é determinada pelo segundo argumento (opcional). É o oposto do
COMPOSE()
função. Sintaxe
A sintaxe fica assim:
DECOMPOSE( string [, { 'CANONICAL' | 'COMPATIBILITY' } ] )
Onde ambos os argumentos podem ser qualquer um dos
CHAR
, VARCHAR2
, NCHAR
, ou NVARCHAR2
tipos de dados ou um tipo que pode ser convertido implicitamente em VARCHAR2
ou NVARCHAR2
. Em relação ao segundo argumento (opcional):
CANONICAL
resulta em decomposição canônica, conforme descrito na definição do padrão Unicode D68, e retorna uma string no formulário de normalização NFD.COMPATIBILITY
resulta em decomposição de compatibilidade, conforme descrito na definição do padrão Unicode D65, e retorna uma string no formulário de normalização NFKD.
O comportamento padrão é aplicar a decomposição canônica.
Exemplo
Aqui está um exemplo:
SELECT DECOMPOSE('ã') FROM DUAL;
Resultado:
ã
No entanto, o exemplo a seguir é uma demonstração melhor:
SELECT ASCIISTR(DECOMPOSE('ã')) FROM DUAL;
Resultado:
a\0303
Aqui, usamos
ASCIISTR()
para retornar uma versão ASCII do resultado de DECOMPOSE()
no conjunto de caracteres do banco de dados. Veja o que acontece se usarmos
ASCIISTR()
sem DECOMPOSE()
:SELECT ASCIISTR('ã') FROM DUAL;
Resultado:
\00E3
Caracteres não Unicode
Se o conjunto de caracteres do argumento não for um dos conjuntos de caracteres Unicode, o argumento será retornado sem modificações.
Exemplo:
SELECT ASCIISTR(DECOMPOSE('a')) FROM DUAL;
Resultado:
a
Argumento nulo
Se o argumento for null
, o resultado é null
:
SET NULL 'null';
SELECT DECOMPOSE(null)
FROM DUAL;
Resultado:
null
Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que um valor nulo ocorre como resultado de um SQL SELECT
demonstração.
No entanto, você pode usar SET NULL
para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null
deve ser devolvido.
Contagem de argumentos inválidos
Chamando DECOMPOSE()
sem nenhum argumento resulta em um erro:
SELECT DECOMPOSE()
FROM DUAL;
Resultado:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
E passar muitos argumentos também resulta em um erro:
SELECT DECOMPOSE('a', 'b')
FROM DUAL;
Resultado:
Error report - ORA-12702: invalid NLS parameter string used in SQL function