Conjunto De Caracteres Da Base De Dados Oracle

Como posso manter os caracteres especiais no meu pacote, quando compilo usando o sqlplus ou qualquer outra ferramenta?

NLS_CHARACTERSET: WE8MSWIN1252
Os caracteres do cliente definidos: desconhecido
O problema é: Apresentação dos dados
OS e DB: UNIX \ Oracle Database 12c Enterprise Edition Release 12.1.0.2.0-64bit Production

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0-64bit Production
PL / SQL Release 12.1.0.2.0-Production
Produção principal 12.1.0.2.0
TNS Para Linux: versão 12.1.0.2.0-Produção
NLSRTL Version 12.1.0.2.0-Production

Exemplo:

CREATE OR REPLACE PACKAGE BODY pkg1
AS
  procedure sp 
  IS
  v_var VARCHAR2(100);
  BEGIN
        v_var := '**último**';
  END;

   END;

quando descrevo o pacote parece-se com isto:

CREATE OR REPLACE PACKAGE BODY HR.pkg1
AS
  procedure sp
  IS
  v_var VARCHAR2(100);
  BEGIN
        v_var := '**£ltimo**';     
  END;


   END;
Author: Jason Aller, 2018-02-14

1 answers

Existe uma forma genérica de introduzir dados unicode arbitrários em bases de dados oracle limitando-se à codificação ascii:

  1. Determine a representação utf-8 do texto alvo como uma sequência de bytes em hex.

    Use um editor utf8-savvy e indique o texto que deseja transferir para o db. Muitos editores vêm com um modo hex que lhe permite inspecionar a representação utf8 e escrevê-lo em outro lugar. Em alternativa, use um editor hexadecimal dedicado ou use o cli ferramentas como od (linux) para produzir conteúdo de ficheiros como uma sequência tabulada de octetos representados em hex:

     od --output-duplicates --format x1 --width=16 demo.txt
    

    A saída precisa de algum pós-processamento para se livrar dos números de linha e espaços em branco, no entanto, isso deve ser simples. Para os dados a granel, utilizar sed ou uma ferramenta semelhante.

  2. Converte a cadeia hexadecimal para o tipo de dados do oráculo.

    Chamar em PlSql faz o truque.
  3. Converta os dados raw para varchar2, ou seja. banco caracter.

    Utilizar o procedimento do pacote plsql utl_i18n.raw_to_char. Seu segundo argumento especifica a codificação de código.

Em resumo, o método resume-se a uma consulta semelhante a (o texto de teste são as letras minúsculas a até f seguido pelos umlauts alemães ) :

 select utl_i18n.raw_to_char ( hextoraw ( '616263646566c3a4c3b6c3bcc384c396c39cc39f' ), 'AL32UTF8' ) from dual;
No seu pacote escreveria:
 v_var := '**' || utl_i18n.raw_to_char ( hextoraw ( 'c3ba' ), 'AL32UTF8' )
               || 'ltimo**';
   -- c3ba being the utf8 encoding of unicode codepoint U+00fa,
   -- 'LATIN SMALL LETTER U WITH ACUTE'
Obviamente, a técnica só funciona se o conjunto de caracteres da base de dados for capaz de representar os caracteres na primeira lugar.

Atalhos

  1. Você pode usar qualquer outra codificação fonte em que os caracteres especiais que você precisa sejam representáveis, desde que o db esteja ciente dessa codificação. Nomeadamente, pode ser utilizada a Série iso 8859-x de codificações para alfabetos latinos. No seu caso para ú e iso8859-1:

     v_var := utl_i18n.raw_to_char ( hextoraw ( 'fa' ), 'WE8ISO8859P1' ) from dual;
    
  2. Usando o conjunto de caracteres nacional no seu db, pode introduzir caracteres unicode pelos seus pontos de código nas suas cadeias literais. Basta embrulhar o literal cordas com a função UNISTR:

    v_var := TO_CHAR(UNISTR('**\00faltimo**')) from dual;
    
 0
Author: collapsar, 2018-02-14 10:36:07