在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驱动程序在我的SERIAL参数中发送了一个LONG值而不是BLOB值,但我无法确认它,如果我绕过我的函数,则UPDATE正确完成。
有人能指出我正确的方向吗? 非常感谢。
答案 0 :(得分:0)
错误非常明确:您的列不是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;