2017-05-31 45 views
0

我在通過APEX從CSV讀取數據到oracle數據庫表時遇到問題。獲取(否?)嘗試加載CSV的ASCII值。 (APEX)

我正在通過文件上傳將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

我看不到你在哪裏解釋CSV文件的字符編碼。獨立於APEX和Oracle,要讀取CSV文件,您需要知道作者用於:字符編碼,行結尾,字段分隔符,字段引用方案(文本限定符),包括文本限定符字符在部分的字段數據,如果第一行是標題或數據。而且,除非您想將所有列作爲文本,列或數據類型來推斷它們。 –

回答

0

能夠解決這個自己:

要轉換RAW在甲骨文CHAR:utl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));

其中v_raw_chunk是十六進制數據。