Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle postgresql 9.5-解码/选择案例以解决utf8错误不起作用_Oracle_Postgresql_Utf 8_Oracle Fdw - Fatal编程技术网

Oracle postgresql 9.5-解码/选择案例以解决utf8错误不起作用

Oracle postgresql 9.5-解码/选择案例以解决utf8错误不起作用,oracle,postgresql,utf-8,oracle-fdw,Oracle,Postgresql,Utf 8,Oracle Fdw,在延续至my-“oracle到postgresql的迁移”中,编码“UTF8”的字节序列无效:0x00 我试图从远程oracle表(通过oracle_fdw扩展)向本地postgresql表插入数据。我的oracle表有一个名为street的列,它有有效的字符串值,有时还有下一个无效的(在postgresql中)字符串:“”(空格)。当我试图复制列值时,我得到了上面和我上一篇文章中提到的错误。我明白在将oracle数据插入postgresql之前需要更改它。我必须马上做,所以我试着在postgr

在延续至my-“oracle到postgresql的迁移”中,编码“UTF8”的字节序列无效:0x00

我试图从远程oracle表(通过oracle_fdw扩展)向本地postgresql表插入数据。我的oracle表有一个名为street的列,它有有效的字符串值,有时还有下一个无效的(在postgresql中)字符串:“”(空格)。当我试图复制列值时,我得到了上面和我上一篇文章中提到的错误。我明白在将oracle数据插入postgresql之前需要更改它。我必须马上做,所以我试着在postgresql中搜索oracle decode func。我找到了两种解决方案,并使用了这两种方法,但我得到了相同的错误:

1.将选择与案例一起使用:

mydb=>select *,(case when v.street=' ' then null END) from customer_prod v;
ERROR:  invalid byte sequence for encoding "UTF8": 0x00
CONTEXT:  converting column "street" for foreign table scan of 
 "customer_prod", row 254148

2.使用orafce扩展的解码功能:

mydb=>select decode(street,' ',null) from customer_prod;
ERROR:  invalid byte sequence for encoding "UTF8": 0x00

所以,我还是得到了错误。知道我如何解决这个问题吗?

当值从Oracle传输到PostgreSQL时会发生错误,因此后处理无法防止错误

为了演示,让我们创建一个Oracle表来展示问题:

CREATE TABLE nulltest(
   id number(5) CONSTRAINT nulltest_pkey PRIMARY KEY,
   val varchar2(10 CHAR)
);

INSERT INTO nulltest VALUES (1, 'schön');
INSERT INTO nulltest VALUES (2, 'bö' || CHR(0) || 'se');
INSERT INTO nulltest VALUES (3, 'egal');

COMMIT;
让我们在PostgreSQL中为其创建一个外部表:

CREATE FOREIGN TABLE nulltest (
   id integer OPTIONS (key 'true') NOT NULL,
   val varchar(10)
) SERVER oracle
   OPTIONS (table 'NULLTEST');

SELECT * FROM nulltest;

ERROR:  invalid byte sequence for encoding "UTF8": 0x00
CONTEXT:  converting column "val" for foreign table scan of "nulltest", row 2
现在最简单的方法是创建一个外来表,过滤掉零个字符:

CREATE FOREIGN TABLE filter_nulltest (
   id integer OPTIONS (key 'true') NOT NULL,
   val varchar(10)
) SERVER oracle
   OPTIONS (table '(SELECT id, replace(val, CHR(0), NULL) FROM nulltest)');

SELECT * FROM filter_nulltest;

┌────┬───────┐
│ id │  val  │
├────┼───────┤
│  1 │ schön │
│  2 │ böse  │
│  3 │ egal  │
└────┴───────┘
(3 rows)
另一个效率较低的选项是创建一个函数,用于捕获并向您报告错误行,以便您可以在Oracle端修复它们:

CREATE OR REPLACE FUNCTION get_nulltest() RETURNS SETOF nulltest
   LANGUAGE plpgsql AS
$$DECLARE
   v_id integer;
   n nulltest;
BEGIN
   FOR v_id IN SELECT id FROM nulltest
   LOOP
      BEGIN
         SELECT nulltest.* INTO n
            FROM nulltest
            WHERE id = v_id;
         RETURN NEXT n;
      EXCEPTION
         WHEN OTHERS THEN
            RAISE NOTICE 'Caught error % for id=%: %', SQLSTATE, v_id, SQLERRM;
      END;
   END LOOP;
END;$$;

SELECT * FROM get_nulltest();

NOTICE:  Caught error 22021 for id=2: invalid byte sequence for encoding "UTF8": 0x00
┌────┬───────┐
│ id │  val  │
├────┼───────┤
│  1 │ schön │
│  3 │ egal  │
└────┴───────┘
(2 rows)

将值从Oracle传输到PostgreSQL时会发生错误,因此后处理无法防止此错误

为了演示,让我们创建一个Oracle表来展示问题:

CREATE TABLE nulltest(
   id number(5) CONSTRAINT nulltest_pkey PRIMARY KEY,
   val varchar2(10 CHAR)
);

INSERT INTO nulltest VALUES (1, 'schön');
INSERT INTO nulltest VALUES (2, 'bö' || CHR(0) || 'se');
INSERT INTO nulltest VALUES (3, 'egal');

COMMIT;
让我们在PostgreSQL中为其创建一个外部表:

CREATE FOREIGN TABLE nulltest (
   id integer OPTIONS (key 'true') NOT NULL,
   val varchar(10)
) SERVER oracle
   OPTIONS (table 'NULLTEST');

SELECT * FROM nulltest;

ERROR:  invalid byte sequence for encoding "UTF8": 0x00
CONTEXT:  converting column "val" for foreign table scan of "nulltest", row 2
现在最简单的方法是创建一个外来表,过滤掉零个字符:

CREATE FOREIGN TABLE filter_nulltest (
   id integer OPTIONS (key 'true') NOT NULL,
   val varchar(10)
) SERVER oracle
   OPTIONS (table '(SELECT id, replace(val, CHR(0), NULL) FROM nulltest)');

SELECT * FROM filter_nulltest;

┌────┬───────┐
│ id │  val  │
├────┼───────┤
│  1 │ schön │
│  2 │ böse  │
│  3 │ egal  │
└────┴───────┘
(3 rows)
另一个效率较低的选项是创建一个函数,用于捕获并向您报告错误行,以便您可以在Oracle端修复它们:

CREATE OR REPLACE FUNCTION get_nulltest() RETURNS SETOF nulltest
   LANGUAGE plpgsql AS
$$DECLARE
   v_id integer;
   n nulltest;
BEGIN
   FOR v_id IN SELECT id FROM nulltest
   LOOP
      BEGIN
         SELECT nulltest.* INTO n
            FROM nulltest
            WHERE id = v_id;
         RETURN NEXT n;
      EXCEPTION
         WHEN OTHERS THEN
            RAISE NOTICE 'Caught error % for id=%: %', SQLSTATE, v_id, SQLERRM;
      END;
   END LOOP;
END;$$;

SELECT * FROM get_nulltest();

NOTICE:  Caught error 22021 for id=2: invalid byte sequence for encoding "UTF8": 0x00
┌────┬───────┐
│ id │  val  │
├────┼───────┤
│  1 │ schön │
│  3 │ egal  │
└────┴───────┘
(2 rows)

非常感谢你,劳伦斯!在最后的帖子里你帮了我很多。你是最棒的!CHR(0)=''(空格)吗?当我将CHR(0)与“”切换时,SELECT起作用,但如果我使用CHR(0),我会得到错误:在Oracle中不允许使用空字符
CHR(0)'
。在PostgreSQL中,您不能像前面解释的那样拥有
CHR(0)
。我问它是因为我在有问题的列中拥有的值是“”。所以我想知道在postgresql中“”是否是CHR(0)。我意识到我有3个有问题的列,所以我对它们都运行了replace函数。我的桌子尺寸是600米。当我运行select时,消息被终止。这是一个性能问题吗?我在选择10G大小的表时没有任何问题。非常感谢Laurenz!在最后的帖子里你帮了我很多。你是最棒的!CHR(0)=''(空格)吗?当我将CHR(0)与“”切换时,SELECT起作用,但如果我使用CHR(0),我会得到错误:在Oracle中不允许使用空字符
CHR(0)'
。在PostgreSQL中,您不能像前面解释的那样拥有
CHR(0)
。我问它是因为我在有问题的列中拥有的值是“”。所以我想知道在postgresql中“”是否是CHR(0)。我意识到我有3个有问题的列,所以我对它们都运行了replace函数。我的桌子尺寸是600米。当我运行select时,消息被终止。这是一个性能问题吗?我从表中选择大小为10G的表没有任何问题。。