【发布时间】:2018-09-29 16:08:39
【问题描述】:
我有两个功能。一种将变量 (uuid) 复制到一个数据库上的二进制文件的方法。
CREATE OR REPLACE FUNCTION ECRS."MIGRATION.DBF_COPY_TO"(file_name VARCHAR(500))
RETURNS INTEGER AS $$
DECLARE
iniPath varchar(500) = file_name || '/Ini.dat';
researchIdToCopy uuid;
BEGIN
SELECT R.RESEARCHID FROM ECRS.RESEARCH R WHERE R.NAME = 'BADANIE_TESTOWE' INTO researchIdToCopy;
EXECUTE('COPY (SELECT '''|| researchIdToCopy ||''') TO ' || quote_literal(iniPath)|| ' WITH BINARY');
RETURN 1;
END; $$
LANGUAGE plpgsql;
第二个负责从文件中复制这些数据并将其存储到另一个 postgress 数据库的变量中。
CREATE OR REPLACE FUNCTION ECRS."MIGRATION.DBF_COPY_FROM"(file_name VARCHAR(500))
RETURNS INTEGER AS $$
DECLARE
iniPath varchar(500) = file_name || '/Ini.dat';
researchIdToInsert text;
tmp text;
BEGIN
-- get research id (store ini file in tmp table and select from it)
tmp := quote_ident(uuid_generate_v4()::text);
EXECUTE 'CREATE TEMP TABLE ' || tmp || ' (researchid text)';
EXECUTE 'COPY ' || tmp || ' FROM ' || quote_literal(iniPath);
EXECUTE 'SELECT researchid FROM ' || tmp INTO researchIdToInsert;
EXECUTE 'DROP TABLE ' || tmp;
-- DO SOMETHING MORE ...
RETURN 1;
END; $$
LANGUAGE plpgsql;
执行函数 DBF_COPY_FROM 时出错:
ERROR: literal carriage return found in data
HINT: Use "\r" to represent carriage return.
CONTEXT: COPY f4c96770-f2f3-45e9-8678-1626b9bef843, line 2
SQL statement "COPY "f4c96770-f2f3-45e9-8678-1626b9bef843" FROM 'C://Test/Ini.dat'"
PL/pgSQL function ecrs."MIGRATION.DBF_COPY_FROM"(character varying) line 29 at EXECUTE
两个数据库具有相同的属性:
- 编码 = 'UTF8'
- TABLESPACE = pg_default
- LC_COLLATE ='English_United Kingdom.1252'
- LC_CTYPE = 'English_United Kingdom.1252'
- 连接限制 = -1;
我尝试过使用 将client_encoding设置为'WIN1252'; 要么 将 client_encoding 设置为“UTF8”;但它不起作用。
【问题讨论】:
标签: postgresql plsql copy