Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当BLOB超过3000-4000个字符时,加密值设置为NULL值的Oracle更新BLOB列_Oracle_Plsql_Oracle11g_Blob - Fatal编程技术网

当BLOB超过3000-4000个字符时,加密值设置为NULL值的Oracle更新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

在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.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返回的值)