【问题标题】:How to convert blob to clob or how to use extractValue function for BLOB in oracle如何将 blob 转换为 clob 或如何在 oracle 中为 BLOB 使用 extractValue 函数
【发布时间】:2018-07-15 17:21:57
【问题描述】:

我尝试在 extractValue() 中使用 BLOB 数据类型来获取指定 XPATH 中的文本,但它对于 BLOB 数据类型的抛出错误,而它对于 CLOB 数据类型工作正常。

所以我尝试使用以下逻辑将 BLOB 转换为 CLOB,如从 stackoverflow 获得的

    create function clobfromblob(p_blob blob) return clob is
      l_clob         clob;
      l_dest_offsset integer := 1;
      l_src_offsset  integer := 1;
      l_lang_context integer := dbms_lob.default_lang_ctx;
      l_warning      integer;

   begin

      if p_blob is null then
         return null;
      end if;

      dbms_lob.createTemporary(lob_loc => l_clob
                              ,cache   => false);

      dbms_lob.converttoclob(dest_lob     => l_clob
                            ,src_blob     => p_blob
                            ,amount       => dbms_lob.lobmaxsize
                            ,dest_offset  => l_dest_offsset
                            ,src_offset   => l_src_offsset
                            ,blob_csid    => dbms_lob.default_csid
                            ,lang_context => l_lang_context
                            ,warning      => l_warning);

      return l_clob;

   end;

使用上述功能后,我得到的输出格式不可读。请帮助了解如何将 blob 转换为可读格式的 clob 或如何将 extractValue() 用于 BLOB 消息

【问题讨论】:

  • 能否请您显示您的数据和函数调用。 extractValue 用于XMLTYPE,既不是 CLOB 也不是 BLOB。
  • 如何在 XML 文档中存储 BLOB 数据?
  • 还有你得到什么错误?这对我们来说是一个很大的线索。
  • 1.上面的代码正在从blob转换为clob并以这种格式显示数据-‹(不可读格式)它不允许我将完整的数据粘贴到她。
  • 发现使用JAVA API xml被压缩(GZIPOutputStream)并通过java-new SqlLobValue(compStream, logMsg.length(), lobHandler)存入数据库。如何解压数据?

标签: sql oracle oracle11g plsqldeveloper


【解决方案1】:

你可以使用包 OraOpenSource Utils link 它包含许多与 BLOB/CLOB 等一起使用的功能。

【讨论】:

    【解决方案2】:

    1) 错误:PLS-306:参数数量或类型错误。 Blob 数据的 Xmltype 构造函数需要两个参数。 xmltype(blob,csid)

    cisd - blob 数据的字符集 ID SELECT NLS_CHARSET_ID('UTF8') csid FROM DUAL;

    2) ORA-31011:XML 解析失败。 ... LPX-00216:无效字符 31 (0x1F) 这意味着oracle 无法解析clobfromblob 生成的xml。 invalid character 31 (0x1F) 0x1f 是美国(单位分隔符)的 asci 十六进制代码。此异常的原因可能是从 blob 转换为 clob 期间的错误编码或 blob 数据中的无效 xml。

    【讨论】:

    • 是的,刚刚发现使用JAVA API xml被压缩(GZIPOutputStream)并通过java-new SqlLobValue(compStream, logMsg.length(), lobHandler)存入数据库。如何解压数据?
    • 问题解决了!!! blob:= utl_compress.lz_uncompress(blob); - 这行代码添加到有问题的函数中,现在它解压缩然后转换为 CLOB,并且能够在 extractValue() 中使用这个 CLOB 从指定的 xpath 中提取值
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2018-08-05
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2021-10-14
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多