当BLOB超过3000-4000个字符时,加密值设置为NULL值的Oracle更新BLOB列
在Oracle11g数据库中,我有一个带有blob列的表,我想在其中放置加密数据。 我的数据库中有以下功能:当BLOB超过3000-4000个字符时,加密值设置为NULL值的Oracle更新BLOB列,oracle,plsql,oracle11g,blob,Oracle,Plsql,Oracle11g,Blob,在Oracle11g数据库中,我有一个带有blob列的表,我想在其中放置加密数据。 我的数据库中有以下功能: create or replace FUNCTION encryptmyBLOB(content IN BLOB, key in VARCHAR2) RETURN BLOB AS CRYPTED BLOB; encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCR
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 param包含的数据少于大约4000字节时,这种方法效果很好,但当SERIAL包含的数据较多时,会出现数据库错误
ORA-01461:只能为插入到长列中绑定长值
我不明白我做错了什么。我怀疑我的应用程序Oracle驱动程序在我的串行参数中发送了一个长值,而不是一个BLOB值,但我无法确认它,如果我绕过我的函数,更新就正确完成了
谁能给我指出正确的方向吗?
非常感谢。错误很清楚:You列不是
BLOB
-column
您应该将数据类型更改为BLOB
,因为LONG
/LONG RAW
已被弃用:
如果无法更改列的类型,可以在函数中检查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;
您使用的是哪种应用程序Oracle驱动程序(用于哪种编程语言)?您如何绑定
SERIAL
值?只是出于兴趣,您使用的是SecureFile LOB吗?您可以加密整个LOB段,而无需自己编写代码…@Thilo如果您可以修改表结构,我将使用devart dbexpress驱动程序进行Delphi,而不是建议使用securefile Blob。您只需更改create语句。它们速度更快,支持性更好,而旧的也越来越不受欢迎。语法看起来像LOB(mycolumn)存储为SECUREFILE(tablespacemylobbablespace)
mycolumn是一个BLOB列。正如我所理解的错误消息“…仅用于插入长列的长值”,在我看来,长值更多的是“encryptmyBLOB”的值(“content”参数或encryptmyBLOB返回的值)