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
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