我正在將數據從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文件?
我需要使用script.Not由終端無論如何它不會持續一次會話或機器重新啓動。它是臨時的。 –
這不是一個終端SET命令,它是一個postgresql SET命令。 – Eelke
Eelke您能否將SET命令放在上面的腳本中 –