我在通过APEX将数据从CSV读取到oracle数据库表时遇到问题。
我通过文件上传接收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
谢谢,
康纳
答案 0 :(得分:0)
能够自己解决这个问题:
在Oracle中将RAW转换为CHAR:utl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));
其中v_raw_chunk
是十六进制数据。