пользовательская функция Java в оракуле, используя byte [] - PullRequest
5 голосов
/ 09 сентября 2011

С учетом этой таблицы в Oracle

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

или в MSSQL

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

Я ищу исчерпывающий пример того, как создать UDF для Oracle в Java, который использует поддержку кодирования текста Java.

В MSSQL я бы создал эту сборку .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);
        }
    }
}

и используйте эти команды для регистрации сборки и определения 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

и используйте его в запросе, подобном этому:

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

bytes      chset       decoded
0x454647   iso-8859-1  EFG

обновление

до сих пор я создал этот класс 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();
    }
}

и использовал эти команды для создания 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';

но когда я пытаюсь использовать его, я получаю эту ошибку:

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

ORA-29531: no method Decode in class Common

обновление 2

Оказывается, java.lang.byte [] - это не вещь, его замена на байт [] приводит к тому, что все работает. Спасибо, Тим!

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

здесь есть удобный стол: http://download.oracle.com/docs/cd/B19306_01/java.102/b14187/chsix.htm#BABJIJEB

1 Ответ

1 голос
/ 18 августа 2015

Вам действительно нужна Java (UDF), определенная пользователем, или иным образом, когда oracle уже предоставляет достаточно утилит для таких преобразований?

Пакет UTL_I18N предоставляет все необходимые функции. Функция MAP_CHARSET сопоставляет имена наборов символов ISO с именами наборов Oracle, затем функция RAW_TO_CHAR преобразует необработанные данные указанного набора символов в VARCHAR2 в наборе символов базы данных.

SQL Fiddle

Настройка схемы Oracle 11g R2 :

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

Запрос 1 :

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

Результаты

| BYTES |      CHSET | DECODED |
|-------|------------|---------|
|  RUZH | iso-8859-1 |     EFG |
...