Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

PostgreSQL 9.5 - giải mã / chọn trường hợp để giải quyết lỗi với utf8 không hoạt động

Lỗi xảy ra khi các giá trị được chuyển từ Oracle sang PostgreSQL, do đó, quá trình xử lý sau sẽ không ngăn được lỗi.

Để minh họa, hãy tạo một bảng Oracle trình bày vấn đề:

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;

Hãy tạo một bảng ngoại trong PostgreSQL cho nó:

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

Bây giờ, điều dễ dàng nhất là tạo một bảng ngoại lọc bỏ các ký tự 0:

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)

Một tùy chọn khác, kém hiệu quả hơn, sẽ là tạo một chức năng bắt và báo cáo các dòng xấu cho bạn để bạn có thể sửa chúng ở phía 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt kích thước tìm nạp hàng của Oracle cao hơn khiến ứng dụng của tôi chậm hơn?

  2. Đặt classpath cho một thủ tục được lưu trữ Java trong Oracle

  3. Cài đặt ROracle trên Mac OS X - Oracle cần những gì?

  4. Chọn từ bảng bằng cách chỉ biết ngày mà không có thời gian (ORACLE)

  5. nhật ký kích hoạt oracle