2017-05-31 3 views
0

APEX経由でCSVからoracleデータベース・テーブルへのデータの読み込みに問題があります。CSVを読み込もうとしている(負の?)ASCII値です。 (APEX)

私はファイルアップロードによって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を取得していない午前理由を知るためにそれを使用しています値。

-17 
-17 
-17 
73 
116 
101 
95 
32 
67 
95 
100 
101 
31 
66 
117 
115 
31 
32 
68 
97 
116 

:興味深いのは、ここで

が出力のサブセットです...負のASCII値が存在しない場合、私はいくつかの否定的な結果(失敗するクエリの残りの原因となる)を取得していますということです

をオラクルにCHARにRAWを変換するには:おかげで、

コナー

+0

私は、CSVファイルの文字エンコーディングを考慮していません。 APEXとOracleとは別に、CSVファイルを読み込むには、文字エンコーディング、行末、フィールド区切り、フィールドクオリファイアスキーム(テキスト修飾子)、テキスト修飾子文字が部分的にどのように表現されているかを含むフィールド・データの最初の行がヘッダーまたはデータの場合また、すべての列をテキストとして扱う場合を除いて、列のデータ型またはそれらを推論するための規則。 –

答えて

0

は、この自分自身を解決することができましたutl_raw.cast_to_varchar2(hextoraw(v_raw_chunk));

ここで、v_raw_chunkは16進データです。

関連する問題