Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

PostgreSQL 9.5 - utf8 के साथ त्रुटि को हल करने के लिए डिकोड / चयन केस काम नहीं करता है

त्रुटि तब होती है जब मान 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कीवर्ड के बीच उपयोग करते समय पंक्ति संख्या कोई पंक्ति प्रदर्शित नहीं कर रही है

  2. क्या वर्तमान सत्र के लिए Oracle ट्रिगर अक्षम किया जा सकता है?

  3. Oracle में इंडेक्स की जांच कैसे करें

  4. Oracle में नियंत्रण फिर से शुरू करने के लिए लूप्स में CONTINUE का उपयोग करना

  5. टॉड में संग्रहीत प्रक्रिया को कॉल करना