首页 文章

XML值无法转换为BLOB

提问于
浏览
0

当我从前端检索xml文件时,我尝试将来自xml的数据放入oracle表中的blob列 . 但我得到以下错误;

ORA-01465:十六进制数无效

前端他们发送二进制对象类型 .

这里的XML标签包含以下细节 .

<Contents>MzEvMDcvMjAxNA0KMS4gRmluZCBhIHdheSB0byBzdG9wIHBvc3RiYWNrIGluIFRyZWUgR3JpZCBpbiBDYWhydCBPZiBBY2NvdW50cyBNb2R1bGUgLSBEb25lDQoyLiBJcyBEaXNidXJzZSBGb3JtdWxhIHNhbWUgYXMgRm9ybXVsYQ0KMDYvMDgvMjAxNA0KMS5DaGFuZ2UgRGViaXRDcmVkaXQgdG8gRGViaXRDcmVkaXROb3RlDQoyOS8wOC8yMDE0DQoxLlNhbGVzIC0gQXV0aGVudGljYXRpb24gcmVxdWlyZWQgZm9yIG1vcmUgb3B0aW9ucw0KMi5IaXN0b3J5IC0gT3B0aW9uIHRvIHZpZXcgaXRlbSBsaXN0DQozLkNhc2hUaWxsIC0gT3B0aW9uIHRvIHNwZWNpZnkgSW4vT3V0DQowMy8wOS8yMDE0DQooVG8gQ2FzaCBUaWxsKQ0KMS5BZGQgQ2xlYXIgQnV0dG9ucyB0byBidXR0b25zIHN0cmlwIC0gRG9uZQ0KMi5TZWFyY2ggbm90IHdvcmtpbmcNCjMuRG91YmxlIGNsaWNrIGZlYXR1cmUgdG8gaW5jcmFzZSBpdGVtcyAtIERvbmUNCjQuQWRkIENsZWFyICYgUmVtb3ZlIGJ1dHRvbiB0byBrZXkgcGFkIC0gRG9uZQ0KNS5HaXZlIGFuIG9wdGlvbiB0byBjaGFuZ2UgY29sb3IgYW5kIGltYWdlIGR5bmFtaWNhbGx5Lg0KNi5NYWtlIGRlZmFsdXQgdGhyZWUgYnV0dG9ucyBhIHJvdyAtIERvbmUNCjcuQXJyYW5nZSBCdXR0b25zDQowOS8wOS8yMDE0DQoxLk1vZGlmeSBNYXN0ZXIgVUkgYXMgZGlzY3Vzc2VkDQoyLkZpbmFsaXplIENhc2ggVGlsbCB0byBFRg0KMy5EYXRhIFBhZ2UgdG8gcHVzaCBhbmQgcHVsbCBkYXRhIEN1c3RvbWVyL0l0ZW0vTGVnYWwgVGVuZGVycw0KMTkvMDkvMjAxNA0KMS4gU3luY2hvbml6ZWQgYml0IHRvIGNoZWNrIFNhbGVzIGFucyBTYWxlcyBSZXR1cm5zIGJlZm9yZSBpbml0aWFsIGRhdGEgbG9hZCBhbmQgc2hvdyBtZXNzYWdlLg0KMi4gQWRkIHByb2dyZXNzIGJhciBhbmQgYnV0dG9ucyBmb3IgUHJvZHVjdCwgQ3VzdG9tZXIgYW5kIFByb21vdGlvbnMgU2VwZXJhdGVseS4NCjMuIEZpbmFsaXplIHNlc3Npb24gZm9yIGxvZ2luIC0gRG9uZQ0KMjIvMDkvMjAxNA0KMS4gSW50ZXJmYWNlIGZpbmFsaXphdGlvbiAtIERvbmUNCjIuIEdldCBtZXNzYWdlIGZvciB1bnN5bmNlZCBkYXRhLiBJbnZvaWNlL1NhbGVzIFJldHVybi9Wb3VjaGVyL0NvdXBvbi9PcGVyYXRvci9DYXNoVGlsbC9TZXNzaW9uSW5mb3JtYXRpb24gLSBEb25lDQozLiBTZW5kIFVuc3luY2VkIGRhdGEgdG8gc2VydmVyLiBDcmVhdGUgYSBzY3JlZW4uIFNlcGVyYXRlIGRhdGEgcGFnZSAtIERvbmUNCjIzLzA5LzIwMTQNCjEuIFZlcmlmeSBkb3dubG9hZCBkYXRhIC0gRG9uZQ0KMi4gVmVyaWZ5IGluaXRpYWxEYXRhIExvYWQgd2l0aCBtZXNzYWdpbmcNCjMuIE5ldyBvcHRpb24gdG8gZ2V0IG9wZXJhdG9ycyBzZXBlcmF0ZWx5IC0gRG9uZQ0KNC4gR2V0IHByb2R1Y3RzIHNob3VsZCBpbmNsdWRlIHByb21vdGlvbnMgLSBEb25lDQo1LiBSZW1vdmUgZGF0YSB1cGxvYWQvZG93bmxvYWQgdmFsaWRhdGlvbiAtIERvbmUNCjYuIE9wZXJ0b3IgcGFzc3dvcmQgY2hhbmdlIHNob3VsZCB3b3JrIHdpdGggc2VydmljZS4gcmVtb3ZlIGxvY2FsIHBhc3N3b3JkIHNhdmUuIC0gRG9uZQ0KMjQvMDYvMjAxNA0KMS4gU2FsZXMgUmV0dXJuIGRhdGEgdXBsb2FkIC0gRG9uZQ0KMi4gTWVzc2FnaW5nIHdpdGggc2NyZWVuIGZpbmV0dW5pbmcNCjMuIFhtbCBnZW5lcmF0aW9uIC0gRG9uZQ0KMjUvMDkvMjAxNA0KMS4gRGVmaW5lIHBybyBjbGFzcyBiYXNlIG9uIHRoZSBzYWxlcyBncmlkLiAtIERvbmUNCjIuIEFzeW5jIHRvIFN5bmMgbWV0aG9kIGluIGxvZ2luIC0gRG9uZQ0KMy4gWG1sIHZlcmlmaWNhdGlvbiBmb3IgZGF0YSB1cGxvYWQNCjI5LzA5LzIwMTQNCjEuIA0KMi4gSW52b2ljZSBJbnNlcnQgdG8gbG9jYWwgZGF0YWJhc2UsIA0KMDEvMTAvMjAxNA0KMS4gU2VuZCBvcGVyYXRvciBzZXNzaW9uIGJlZm9yZSBkYXRhIHVwbG9hZCAtIERvbmUNCjIuIEltcGxlbWVudCBwcmV2aWxhZ2VzDQozLiBSZXR1cm4gbWV0aG9kcyBpbnRlcmZhY2UgbW9kaWZpY2F0aW9uDQoxMC8wOS8xNA0KMS4gU2Vzc2lvbiwgU2Vzc2lvbiBEZXRhaWwsIENhc2ggVGlsbCwgU2FsZXMsIFNhbGVzIFJldHVybg0KMi4gUGFzd29yZCBjYW4gYmUgY2hhbmdlZCBvbmx5IHRoZSB1c2VyIGlzIG9ubGluZS4gUGFzc3dvcmQgd2lsbCBiZSB1cGRhdGVkIG9uY2UgdGhlIHVwbG9hZCBjb25maXJtZWQgYnkgdGhlIHNlcnZpY2UuDQozLiBDYXNoIHRpbGwgbmVlZHMgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgdXNlcnMgd2hvIGhhcyBhbiBhY3RpdmUgY2FzaHRpbGwuDQoxMS8wOS8yMDE0DQoxLiBDYXNodGlsbCBJc3N1ZQ0KMi4gU2hvcCBDbG9zZSBDYXNoVGlsbHMgbXVzdCBiZSBjbG9zZWQuIEFsbCB1c2VycyBtdXN0IGJlIGxvZ2dlZCBvdXQsIGFsbCBkYXRhIG11c3QgYmUgc3luY2VkLg0KMy4gRGF0YSBVcGxvYWQNCjQuIFJlbW92ZSBPQkpDRVQgd3JhcHBlciBpbiBwYXNzd29yZCBjaGFuZ2UgWE1MDQo1LiBDaGVjayB0ZXJtaW5hbCBvcGVycmF0b3JzIGluc2VydCBpbiBkYXRhIGRvd25sb2FkDQo2LiBTZXQgdG8gMTAgd2hlbiB1bmFibGUgdG8gY3JlYXRlIHNlc3Npb24NCjcuIHNhbWUgZ29lcyB0byBhcHByb3ZhbA0KMTUvMDkvMjAxNA0KMS4gU2hvdyBkaXNjdW50IHByZWNlbnRhZ2Ugb24gQmVmb3JlIEludm9pY2UgKERvY2tldCBEaXNjb3VudCwgT3ZlcnJpZGUgRGlzY291bnQpDQoyLiBJbnZvaWNlIHJldHVybiBhbW91bnQvSW52b2ljZSBEYXRlDQoyMi8xMC8yMDE0DQoxLiBEb2NrZXQgaGlzdG9yeSBwcmludGluZyAtIERvbmUNCjIuIGRvY2tldCBzY2FuIHNlYXJjaCB3aXRob3V0IHNlYXJjaCBidXR0b24gLSBEb25lDQozLiByZXR1cm4gYW1vdW50IG5vdCBjYWxjdWxhdGluZyBhZnRlciBzY2FuIC0gRG9uZQ0KNC4gY2xlYXIgdGV4dGJveCBhZnRlciBzY2FuIC0gRG9uZQ0KDQo=</Contents>

这个查询 . 我试着找回 .

SELECT CONTENT 
 FROM XMLTABLE ('/OBJECT/CommonFileUpload/CommonFileUploadFileList/CommonFileUploadFile'
               PASSING (SELECT XMLCOL FROM BIZZXE_V2_SCH.B)
               COLUMNS CONTENT   BLOB  PATH 'Contents') T

这是我的示例目标表

CREATE TABLE "TEST"  

( `"CONTENT" BLOB`
   )

1 回答

  • 1

    当我们尝试将字符串放入BLOB字段时,Oracle抛出错误 ORA-01465: invalid hex number . 我们需要先将其转换为二进制格式 . 我们可以使用UTL_RAW.CAST_TO_RAW()函数完成此操作 . Find out more .

    但是,这里有一个二进制编码的字符串表示 . 将它存储为BLOB是没有意义的 . 你应该做的是将它存储为CLOB;当前端查询 Contents 按原样返回该字符串时,让它们解码它 .


    为了记录,这里是我用于从XMLType列中提取 Contents 元素并将其存储为BLOB的代码:

    declare
        vc varchar2(32767);
        lb blob;
    begin
    
        select t.content
        into vc
        from b,
             xmltable ('/OBJECT/CommonFileUpload/CommonFileUploadFileList/CommonFileUploadFile'
                       passing b.xmlcol
                       columns content   clob  path 'Contents') t;
    
       lb := utl_raw.cast_to_raw(vc);
       insert into tgt values (lb);
    end;
    /
    

    这是结果:

    SQL> select * from tgt;
    
    BCOL
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    4D7A45764D4463764D6A41784E41304B4D533467526D6C755A43426849486468655342306279427A64473977494842766333526959574E7249476C75494652795A57556752334A705A43427062694244
    
    SQL>
    

    不是很有用 .

相关问题