当blob超过3000-4000 char时,Oracle更新BLOB列,加密值设置为NULL值

时间:2018-05-30 11:44:58

标签: oracle plsql oracle11g blob

在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正确完成。

有人能指出我正确的方向吗? 非常感谢。

1 个答案:

答案 0 :(得分:0)

错误非常明确:您的列不是BLOB - 列。

您应该将数据类型更改为BLOB,因为不推荐使用LONG / LONG RAWhttps://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;