2017-05-25 200 views
0

我正在將數據從oracle數據庫遷移到postgresql數據庫。我遇到了一個問題,我使用存儲過程從oracle導出數據,並將其導入到postgresql中。當我嘗試將數據導入到PostgreSQL的我得到這個錯誤:從Oracle遷移到PostgreSQL編碼錯誤

錯誤:無效字節序列編碼「UTF8」:0xcb 0xcf 背景:COPY項目,線路810

我發現,Oracle數據庫的設置defult將被編碼爲ASCII,因此CSV文件通常以ASCII格式輸出,在Postgres DB中默認編碼爲UTF-8,不允許接受ASCII

因此,在從Oracle導出數據時到CSV文件,我需要使用存儲過程與UTF-8編碼,我曾嘗試跟隨在甲骨文它不起作用。

CREATE OR REPLACE 
PROCEDURE export_main(dir VARCHAR2, file_name VARCHAR2) 
    IS 
select_stmt VARCHAR2(100) := 'SELECT MTYPE || '','' || MNO FROM MAIN'; 
    cur INTEGER; 
    file UTL_FILE.FILE_TYPE; 
    row_value VARCHAR2(4000); 
    ret INTEGER; 
    BEGIN 
    -- Open a cursor for the specified SELECT statement 
    cur := DBMS_SQL.OPEN_CURSOR; 
    DBMS_SQL.PARSE(cur, select_stmt, DBMS_SQL.NATIVE); 
    ret := DBMS_SQL.EXECUTE(cur); 

    -- All columns were concatenated into single value in SELECT 
    DBMS_SQL.DEFINE_COLUMN(cur, 1, row_value, 4000); 

    -- Open the file for writing 
    --file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767); 
file := UTL_FILE.FOPEN_NCHAR(UPPER(dir), file_name, 'w', 32767); 
    -- Export rows one by one 
    LOOP 
     ret := DBMS_SQL.FETCH_ROWS(cur); 
     EXIT WHEN ret = 0; 

     -- Get the value 
     row_value := NULL; 
     DBMS_SQL.COLUMN_VALUE(cur, 1, row_value); 

     -- Write the row to the file 
     -- UTL_FILE.PUT_LINE(file, row_value); 
UTL_FILE.PUT_LINE_NCHAR(file, TO_NCHAR(row_value)); 
    END LOOP; 

    UTL_FILE.FCLOSE(file); 
    DBMS_SQL.CLOSE_CURSOR(cur); 

    EXCEPTION WHEN NOT_LOGGED_ON THEN 
    DBMS_OUTPUT.PUT_LINE ('A program issues a database call without being connected to Oracle.'); 
    END; 

否則在在Postgres的數據庫,我需要編碼與UTF-8與存儲過程 這裏導入從CSV文件中的數據的時間是在Postgres的

begin 
    set schema 'public'; 
    raise notice 'CSV PATH: %,TABLE NAME: %',csv_path,target_table; 
    execute format('truncate %I ',target_table); 
    execute format('copy %I from %L WITH (FORMAT csv)',target_table, csv_path); 
    return; 
end; 

你的腳本想看到CSV文件?

回答

0

您可以使用SET client_encoding='latin1'來告訴postgres您正在發送的數據的編碼。將latin1替換爲oracle數據庫中使用的編碼。

可以找到postgres支持的字符集列表here。該列表還提到了SQL_ASCII,但是對於值0-127而不是值128-255,ASCII只是完全標準化的。所以這些更高的值不能轉換爲UTF8,因爲它沒有定義它們的含義。

+0

我需要使用script.Not由終端無論如何它不會持續一次會話或機器重新啓動。它是臨時的。 –

+0

這不是一個終端SET命令,它是一個postgresql SET命令。 – Eelke

+0

Eelke您能否將SET命令放在上面的腳本中 –