JDE如何将F983051.VRPODATA(long/blob)转换为字符串(varchar2)?
JDE how to convert F983051.VRPODATA (long / blob) to a string (varchar2)?
JDE如何将F983051.VRPODATA(long/blob)转成字符串(varchar2)?
我不确定我是否可以做类似的事情:
SELECT VRPID, VRVERS, FUNCTION(VRPODATA) FROM SCHEMA.F983051;
其中 FUNCTION 是将 BLOB 文件转换为 varchar2 的东西。
P.d。我不能使用任何类型的 DDL。
请指教,
请注意,我没有使用 CONVERTTOCLOB
的经验,因为我们总是使用 ClOB
s 来存储文本。参考 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;
我居然找到了我想要的:DBMS_LOB.SUBSTR({BLOB field}).
该字段可以帮助您识别 BLOB 和 HUGEBLOB 数据类型,但它可能无法识别所有值。它将用正方形代替它们。
示例:
SELECT DBMS_LOB.SUBSTR({Huge Blob Field}) FROM {Table};
如果你能做到这一点,那就是要走的路。
干杯。
我们在 sql-server 上托管我们的 JD Edwards 实例,要在那里执行相同的操作,只需要:
convert(nvarchar(max),convert(varbinary(max),vrpodata))
结果仍然是竖线分隔的字符串。
JDE如何将F983051.VRPODATA(long/blob)转成字符串(varchar2)?
我不确定我是否可以做类似的事情:
SELECT VRPID, VRVERS, FUNCTION(VRPODATA) FROM SCHEMA.F983051;
其中 FUNCTION 是将 BLOB 文件转换为 varchar2 的东西。
P.d。我不能使用任何类型的 DDL。
请指教,
请注意,我没有使用 CONVERTTOCLOB
的经验,因为我们总是使用 ClOB
s 来存储文本。参考 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;
我居然找到了我想要的:DBMS_LOB.SUBSTR({BLOB field}).
该字段可以帮助您识别 BLOB 和 HUGEBLOB 数据类型,但它可能无法识别所有值。它将用正方形代替它们。
示例:
SELECT DBMS_LOB.SUBSTR({Huge Blob Field}) FROM {Table};
如果你能做到这一点,那就是要走的路。
干杯。
我们在 sql-server 上托管我们的 JD Edwards 实例,要在那里执行相同的操作,只需要:
convert(nvarchar(max),convert(varbinary(max),vrpodata))
结果仍然是竖线分隔的字符串。