获取(负?)尝试加载CSV的ASCII值。 (顶尖)

时间:2017-05-31 21:34:40

标签: sql oracle csv plsql oracle-apex

我在通过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

谢谢,

康纳

1 个答案:

答案 0 :(得分:0)

能够自己解决这个问题:

在Oracle中将RAW转换为CHAR:utl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));

其中v_raw_chunk是十六进制数据。