sql >> Database >  >> RDS >> Oracle

PostgreSQL 9.5 - decodeer / selecteer case om fout op te lossen met utf8 werkt niet

De fout treedt op wanneer de waarden worden overgebracht van Oracle naar PostgreSQL, dus nabewerking zal de fout niet voorkomen.

Laten we omwille van de demonstratie een Oracle-tabel maken die het probleem vertoont:

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;

Laten we er een buitenlandse tabel voor maken in 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

Het eenvoudigste zou nu zijn om een ​​vreemde tabel te maken die de nultekens wegfiltert:

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)

Een andere, minder efficiënte, optie zou zijn om een ​​functie te creëren die slechte regels opvangt en aan u rapporteert, zodat u ze aan de Oracle-kant kunt repareren:

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. Selecteer een door komma's gescheiden lijst terug, gegroepeerd op een ID

  2. SQL self-join om specifieke rijen te retourneren

  3. Prisma, hoe de volgorde om te keren

  4. Hoe een MYSQL-query uitvoeren op een vooraf gedefinieerde vaste tijd?