【问题标题】:JDE how to convert F983051.VRPODATA (long / blob) to a string (varchar2)?JDE如何将F983051.VRPODATA(long/blob)转换为字符串(varchar2)?
【发布时间】:2018-05-31 18:46:46
【问题描述】:

JDE如何将F983051.VRPODATA(long/blob)转为字符串(varchar2)?

我不确定我是否可以这样做:

SELECT VRPID, VRVERS, FUNCTION(VRPODATA) FROM SCHEMA.F983051;

其中 FUNCTION 是将 BLOB 文件转换为 varchar2 的东西。

P.d.我不能使用任何类型的 DDL。

请指教,

【问题讨论】:

  • 您确定VRPODATABLOB 而不是CLOB?如果它是一个 blob,我们需要知道它的编码。
  • 嗨,Wolphi,它的字面意思是“(BLOB)”。不确定它是否是一个通用术语。

标签: sql oracle jde


【解决方案1】:

请注意,我没有使用CONVERTTOCLOB 的经验,因为我们总是使用ClOBs 来存储文本。参考 Rene 的answer,你可以这样做:

CREATE TABLE F983051 (vrpid NUMBER, vrvers NUMBER, vrpodata BLOB) 
  LOB (vrpodata) STORE AS SECUREFILE;

INSERT INTO F983051(vrpid, vrvers, vrpodata) 
VALUES (1, 2, rawtohex('Hello world'));

CREATE OR REPLACE FUNCTION myblobtovarchar(p_blob BLOB) 
  RETURN VARCHAR2 DETERMINISTIC
IS
  l_len          number;
  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;
  l_varchar      varchar2(32767);
BEGIN
  IF p_blob IS NULL THEN RETURN NULL; END IF;

  DBMS_LOB.CREATETEMPORARY(lob_loc => l_clob, cache => false);

  l_len := DBMS_LOB.GETLENGTH(p_blob);

  IF l_len > 4000 THEN l_len := 4000; END IF;

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

  l_varchar := DBMS_LOB.SUBSTR(l_clob, 32767, 1);

  RETURN l_varchar;
END myblobtovarchar;
/

SELECT vrpid, vrvers, myblobtovarchar(vrpodata) FROM F983051;
1   2   Hello world

如果你不能创建函数,你可以试试(我也没有这方面的经验):

SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(vrpodata, 4000)) FROM F983051;

【讨论】:

  • 您好 Wolphi,非常感谢您的回复。但是,恐怕我没有 DDL 权限:我无法创建函数 =S...
【解决方案2】:

我实际上找到了我想要的:DBMS_LOB.SUBSTR({BLOB field})。

该字段可以帮助您处理 BLOB 和 HUGEBLOB 数据类型,但它可能无法识别所有值。它将用正方形代替它们。

例子:

SELECT DBMS_LOB.SUBSTR({Huge Blob Field}) FROM {Table};

如果你能做到这一点,那就是要走的路。

干杯。

【讨论】:

    【解决方案3】:

    我们将我们的 JD Edwards 实例托管在 sql-server 上,在那里执行相同的操作,只需要:

    convert(nvarchar(max),convert(varbinary(max),vrpodata))
    

    结果仍然是一个竖线分隔的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-02
      • 2017-01-17
      • 2018-04-10
      • 2013-06-28
      • 2016-04-06
      • 2013-12-27
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多