Oracle обновляет столбец BLOB с зашифрованным значением, устанавливающим значение NULL, когда значение BLOB превышает 3000-4000 символов - PullRequest
0 голосов
/ 30 мая 2018

В базе данных Oracle 11g у меня есть таблица со столбцом BLOB-объектов, в которую я хочу поместить зашифрованные данные.У меня есть эта функция в моей базе данных:

create or replace FUNCTION encryptmyBLOB(content IN BLOB, key in VARCHAR2)
RETURN BLOB  AS
    CRYPTED BLOB;
    encryption_type    PLS_INTEGER :=
                            SYS.DBMS_CRYPTO.ENCRYPT_AES128
                          + SYS.DBMS_CRYPTO.CHAIN_CBC
                          + SYS.DBMS_CRYPTO.PAD_PKCS5;
BEGIN 
        dbms_lob.createtemporary(CRYPTED,true);
        SYS.DBMS_CRYPTO.ENCRYPT(
            dst => CRYPTED,
            src => content,
            typ => encryption_type,
            key => SYS.DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW (key, 'WE8ISO8859P15'), SYS.DBMS_CRYPTO.HASH_MD5),
            iv  => utl_raw.cast_to_raw('/myIV'));
        return CRYPTED;
    end if;
END;

, и мое приложение отправляет запрос с такими параметрами:

UPDATE mytable SET myColumn=encryptmyBLOB(:SERIAL,:ENCRYPT_KEY) WHERE ...

Это хорошо работает, когда параметр SERIAL содержит менее чем приблизительно 4000 байтов, нокогда SERIAL содержит больше данных, я получаю ошибку базы данных.

ORA-01461: может связывать значение LONG только для вставки в столбец LONG

Я не понимаючто я делаю не такЯ подозреваю, что мой драйвер Oracle приложения отправляет значение LONG в моем параметре SERIAL вместо значения BLOB, но я не могу подтвердить это, и ОБНОВЛЕНИЕ выполняется правильно, если я игнорирую свою функцию.

Может кто-нибудь указать мне направильное направление?Большое спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Ошибка довольно очевидна: ваш столбец не является BLOB -колонкой.

Вам следует изменить тип данных на BLOB, поскольку LONG / LONG RAW устарела: https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT613

Если вы не можете изменить тип столбца, вы можете проверить размер вашего BLOB 'содержимого' в вашей функции:

DECLARE
    myBlob   BLOB;
    mySize   NUMBER;
BEGIN
    myBlob := utl_raw.cast_to_raw('1234567890');
    mySize := dbms_lob.getlength(myBlob);

    dbms_output.put_line('Size: ' || mySize); 

    myBlob := utl_raw.cast_to_raw('12345678901234567890');
    mySize := dbms_lob.getlength(myBlob);

    dbms_output.put_line('Size: ' || mySize); 
END;
...