5

Dada esta tabla en OracleJava en Oracle con el byte []

create table test (bytes raw(100), chset varchar2(50)) 
insert into test (bytes, chset) values (hextoraw('454647'), 'iso-8859-1') 

o en MSSQL

create table test (bytes varbinary(100), chset nvarchar(50)) 
insert into test (bytes, chset) values (0x454647, 'iso-8859-1') 

Busco un ejemplo completo de cómo crear una UDF para Oracle en Java que hace uso del soporte de codificación de texto de Java.

En MSSQL me gustaría crear este conjunto .Net:

using System.Text; 
using Microsoft.SqlServer.Server; 

namespace Whatever 
{ 
    public class Common 
    { 
     [SqlFunction] 
     public static string Decode(byte[] Bytes, string EncodingName) 
     { 
      return Encoding.GetEncoding(EncodingName).GetString(Bytes); 
     } 
    } 
} 

y utilizar estos comandos para registrar el ensamblado y definir la UDF:

create assembly MyAssembly from '...\MyAssembly.dll' 

create function decode(@bytes varbinary(max), @chset nvarchar(100)) 
returns nvarchar(max) as external name MyAssembly.[Whatever.Common].Decode 

y utilizarlo en una consulta como la siguiente:

> select *, dbo.decode(bytes, chset) decoded from test 

bytes  chset  decoded 
0x454647 iso-8859-1 EFG 

actualización

hasta ahora he creado esta clase de Java:

import java.nio.*; 
import java.nio.charset.*; 

public class Common 
{ 
    public static String Decode(byte[] Bytes, String CharsetName) 
    { 
     return Charset.forName(CharsetName).decode(ByteBuffer.wrap(Bytes)).toString(); 
    } 
} 

y utiliza estos comandos para crear la UDF:

create directory jdir as 'C:\...'; 
create java class using bfile (jdir, 'Common.class'); 

create function jdecode(bytes raw, chset varchar2) return nvarchar2 as language java 
name 'Common.Decode(java.lang.byte[], java.lang.String) return java.lang.String'; 

pero cuando trato de usarlo me sale este error :

> select jdecode(hextoraw('454647'), 'iso-8859-1') from dual 

ORA-29531: no method Decode in class Common 

actualización 2

resulta que java.lang.byte [] no es una cosa, cambiarlo a solo byte [] hace funcionar las cosas. Gracias Tim!

create function jdecode(bytes raw, chset varchar2) return nvarchar2 as language java 
name 'Common.Decode(byte[], java.lang.String) return java.lang.String'; 

hay una mesa de útil aquí: http://download.oracle.com/docs/cd/B19306_01/java.102/b14187/chsix.htm#BABJIJEB

Respuesta

1

¿Usted realmente necesita una función definida por el usuario de Java (UDF) o de otro modo, cuando el oráculo ya proporciona suficientes utilidades para este tipo de conversiones?

El paquete UTL_I18N proporciona todas las funciones necesarias. La función MAP_CHARSET correlaciona desde nombres de conjuntos de caracteres ISO hasta nombres de conjuntos de caracteres Oracle, luego la función RAW_TO_CHAR convierte los datos sin procesar del juego de caracteres especificado a VARCHAR2 en el conjunto de caracteres de la base de datos.

SQL Fiddle

Oracle 11g R2 Configuración de esquema:

create table test (bytes raw(100), chset varchar2(50)); 
insert into test (bytes, chset) values (hextoraw('454647'), 'iso-8859-1'); 

de consulta 1:

select t.* 
    , UTL_I18N.RAW_TO_CHAR(bytes 
          , UTL_I18N.MAP_CHARSET(chset,0,1)) decoded 
from test t 

Results:

| BYTES |  CHSET | DECODED | 
|-------|------------|---------| 
| RUZH | iso-8859-1 |  EFG | 
+0

Esto era en realidad un problema de juguete para tratar de entender cómo conseguir que una UDF escrita en java se ejecutara en Oracle - terminó siendo el error tonto "byte vs. java.lang.byte" por el cual Oracle no estaba dando un mensaje de error muy informativo. – gordy