尝试加载 CSV 获取(负数?)ASCII 值。 (顶尖)
Getting (negative?) ASCII values trying to load CSV. (APEX)
我在通过 APEX 从 CSV 读取数据到 Oracle 数据库 table 时遇到问题。
我正在通过文件上传获取 CSV,将该 CSV 的内容传递到 BLOB 数据类型。然后遍历该 BLOB 的二进制文件,并将其转换为字符。
这是我正在关注的文章:Uploading CSV using Oracle Application Express (APEX)
这是我的代码:
DECLARE
v_blob_data BLOB;
v_blob_len NUMBER;
v_position NUMBER;
v_raw_chunk RAW(10000);
v_char CHAR(19000);
c_chunk_len NUMBER := 1;
v_line VARCHAR2 (32767) := NULL;
v_data_array wwv_flow_global.vc_arr2;
v_rows NUMBER;
v_sr_no NUMBER := 1;
BEGIN
-- Script adapted from https://nzchaudhry.wordpress.com/2011/07/18/uploading-csv-using-oracle-application-express-apex/
-- READ data FROM wwv_flow_files
SELECT blob_content
INTO v_blob_data
FROM wwv_flow_files
WHERE updated_on =
(
SELECT max(updated_on)
FROM wwv_flow_files
WHERE updated_by = :APP_USER)
AND id =
(
SELECT max(id)
FROM wwv_flow_files
WHERE updated_by = :APP_USER);
v_blob_len := dbms_lob.Getlength(v_blob_data);
v_position := 1;
-- READ AND convert binary TO CHAR
WHILE ( v_position <= v_blob_len ) LOOP
v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
v_char := CAST(v_raw_chunk AS CHAR);
dbms_output.put_line(Hex_to_decimal(V_RAW_CHUNK));
v_position := v_position + c_chunk_len;
END LOOP;
END;
有问题的行是:dbms_output.put_line(Hex_to_decimal(V_RAW_CHUNK));
我正在使用它来了解为什么我没有获得 ASCII 值。有趣的是,当没有负 ASCII 值时,我得到了一些负面结果(导致查询的其余部分失败)...
这是输出的一个子集:
-17
-17
-17
73
116
101
95
32
67
95
100
101
31
66
117
115
31
32
68
97
116
谢谢,
康纳
能够自己解决这个问题:
要在 Oracle 中将 RAW 转换为 CHAR:utl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));
其中 v_raw_chunk
是十六进制数据。
我在通过 APEX 从 CSV 读取数据到 Oracle 数据库 table 时遇到问题。
我正在通过文件上传获取 CSV,将该 CSV 的内容传递到 BLOB 数据类型。然后遍历该 BLOB 的二进制文件,并将其转换为字符。
这是我正在关注的文章:Uploading CSV using Oracle Application Express (APEX)
这是我的代码:
DECLARE
v_blob_data BLOB;
v_blob_len NUMBER;
v_position NUMBER;
v_raw_chunk RAW(10000);
v_char CHAR(19000);
c_chunk_len NUMBER := 1;
v_line VARCHAR2 (32767) := NULL;
v_data_array wwv_flow_global.vc_arr2;
v_rows NUMBER;
v_sr_no NUMBER := 1;
BEGIN
-- Script adapted from https://nzchaudhry.wordpress.com/2011/07/18/uploading-csv-using-oracle-application-express-apex/
-- READ data FROM wwv_flow_files
SELECT blob_content
INTO v_blob_data
FROM wwv_flow_files
WHERE updated_on =
(
SELECT max(updated_on)
FROM wwv_flow_files
WHERE updated_by = :APP_USER)
AND id =
(
SELECT max(id)
FROM wwv_flow_files
WHERE updated_by = :APP_USER);
v_blob_len := dbms_lob.Getlength(v_blob_data);
v_position := 1;
-- READ AND convert binary TO CHAR
WHILE ( v_position <= v_blob_len ) LOOP
v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
v_char := CAST(v_raw_chunk AS CHAR);
dbms_output.put_line(Hex_to_decimal(V_RAW_CHUNK));
v_position := v_position + c_chunk_len;
END LOOP;
END;
有问题的行是:dbms_output.put_line(Hex_to_decimal(V_RAW_CHUNK));
我正在使用它来了解为什么我没有获得 ASCII 值。有趣的是,当没有负 ASCII 值时,我得到了一些负面结果(导致查询的其余部分失败)...
这是输出的一个子集:
-17
-17
-17
73
116
101
95
32
67
95
100
101
31
66
117
115
31
32
68
97
116
谢谢,
康纳
能够自己解决这个问题:
要在 Oracle 中将 RAW 转换为 CHAR:utl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));
其中 v_raw_chunk
是十六进制数据。