В базе данных 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, но я не могу подтвердить это, и ОБНОВЛЕНИЕ выполняется правильно, если я игнорирую свою функцию.
Может кто-нибудь указать мне направильное направление?Большое спасибо.