EDYCJA 2:

Po małych badaniach odkryłem, że problem jest z długą wartością tekstową (więcej niż 2000 symboli). Umieściłem wartości w pojedynczych cytatach w instrukcji, którą próbuję wykonać w "Wykonaj natychmiastową insert_query;".

Lubić:

INSERT INTO
tablename(
    field1,
    field2,
    field3
)
VALUES(
    '123',
    'some value',
    'long value more than 2000 symbols'
)

więc prawdziwe pytanie brzmi:

Jak poprawnie wstawię długie wartości w tabeli?


Muszę zaimportować duże dane łańcuchowe z zewnętrznego źródła danych do Oracle DB.

Mam Oracle 12C (12.1.0.2.0)

, co próbuję zrobić

Jest to uproszczony kod, aby wyjaśnić mój pomysł

CREATE OR REPLACE PROCEDURE parsedata AS 
    TYPE string_dict IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100);
    field_name_list string_dict;
    query_field_list varchar2(3000);
    query_value_list varchar2(10000);
    insert_query varchar2(20000);
    --insert_query CLOB;
BEGIN
    -- Field mapping for data source and destination database
    field_name_list('source_field1') := 'destination_field1';
    field_name_list('source_field2') := 'destination_field2';
    field_name_list('source_field3') := 'destination_field3';

    -- Iterate over records in the data source
    FOR record_index IN 1..record_count_total LOOP
        insert_query := 'INSERT INTO tablename([FIELDS]) VALUES([VALUES])';
        query_field_list := '';
        query_value_list := '';

        -- Iterate over fields per record
        FOR field_index IN 1..field_count_total LOOP
            query_field_list := query_field_list || field_name_list(source_field_name) || ',';
            query_value_list := query_value_list || field_value || ',';     

        insert_query := REPLACE(insert_query, '[FIELDS]', query_field_list);
        insert_query := REPLACE(insert_query, '[VALUES]', query_value_list);
        EXECUTE IMMEDIATE insert_query;
END parsedata;

Co mam

Błąd: ORA-01704: Truck Literal zbyt długi w linii "Wykonaj natychmiastową insert_query;"

Mam ten sam błąd, jeśli używam CLOB

Clob Insert_query;

EDYCJA 1:

Sprawdziłem długość "insert_query":

length(insert_query)

I otrzymuję błąd, gdy długość jest większa niż 3000:

Długość (wkładka_query): 3038

1
VictorDDT 24 grudzień 2019, 05:15

1 odpowiedź

Najlepsza odpowiedź

Ten problem występuje, gdy próbujesz wstawić wartość string w kolumnie CLOB za pomocą długości łańcucha większego niż 4000 .

Musisz użyć TO_CLOB, aby przekonwertować ciąg do {x1}}, ale niestety może być również akceptować 4000 znaków .

Aby rozwiązać problem, musisz podzielić swój ciąg w kawałkach 4000 znaków i użyj do_Clob, jak opisano w poniższym przykładzie:

SQL> CREATE TABLE CLOB_TEST (
  2      MY_CLOB   CLOB
  3  );

Table created.

próbuje wstawić ciąg o długości 4282 & GT; 4000 - Błąd

SQL> INSERT INTO CLOB_TEST ( MY_CLOB )  -- inserting a string of length 4282 > 4000
  2  VALUES ( '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  3  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  4  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  5  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  6  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  7  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  8  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  9  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 10  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 11  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 12  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 13  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 14  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 15  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 16  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 17  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 18  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 19  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 20  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 21  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 22  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 23  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 24  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 25  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 26  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 27  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 28  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 29  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 30  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 31  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 32  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 33  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 34  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 35  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 36  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 37  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 38  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 39  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 40  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 41  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 42  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 43  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'
 44  );
VALUES ( '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
         *
ERROR at line 2:
ORA-01704: string literal too long

próbując włożyć ciąg o długości 4282 z do_Clob - błąd

SQL> INSERT INTO CLOB_TEST ( MY_CLOB )  -- trying to insert the string of length 4282 with TO_CLOB
  2  VALUES ( TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  3  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  4  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  5  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  6  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  7  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  8  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  9  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 10  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 11  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 12  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 13  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 14  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 15  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 16  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 17  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 18  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 19  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 20  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 21  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 22  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 23  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 24  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 25  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 26  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 27  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 28  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 29  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 30  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 31  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 32  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 33  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 34  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 35  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 36  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 37  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 38  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 39  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 40  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 41  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 42  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 43  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'
 44  ) );
VALUES ( TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
                 *
ERROR at line 2:
ORA-01704: string literal too long

próbuje włożyć ciąg o długości 3670 ° C; 4000 - Sukces

SQL> INSERT INTO CLOB_TEST ( MY_CLOB )  -- inserting a string of length 3670
  2  VALUES ( '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  3  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  4  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  5  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  6  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  7  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  8  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  9  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 10  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 11  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 12  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 13  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 14  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 15  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 16  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 17  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 18  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 19  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 20  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 21  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 22  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 23  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 24  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 25  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 26  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 27  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 28  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 29  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 30  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 31  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 32  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 33  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 34  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 35  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 36  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 37  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'
 38  );

1 row created.

próbując włożyć ciąg o długości 4282 z do_Clob - błąd

SQL> INSERT INTO CLOB_TEST ( MY_CLOB )  -- trying to insert the string of length 4282 with TO_CLOB
  2  VALUES ( TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  3  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  4  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  5  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  6  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  7  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  8  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  9  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 10  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 11  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 12  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 13  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 14  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 15  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 16  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 17  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 18  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 19  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 20  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 21  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 22  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 23  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 24  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 25  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 26  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 27  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 28  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 29  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 30  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 31  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 32  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 33  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 34  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 35  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 36  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 37  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 38  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 39  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 40  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 41  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 42  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 43  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'
 44  ) );
VALUES ( TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
                 *
ERROR at line 2:
ORA-01704: string literal too long

próbuje wstawić ciąg w dwóch częściach długości (3670,610) za pomocą TO_CLOB () - SUKCES

SQL> INSERT INTO CLOB_TEST ( MY_CLOB ) -- trying to insert the data in two parts(3670,610) with TO_CLOB ()
  2  VALUES ( TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  3  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  4  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  5  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  6  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  7  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  8  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
  9  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 10  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 11  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 12  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 13  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 14  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 15  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 16  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 17  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 18  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 19  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 20  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 21  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 22  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 23  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 24  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 25  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 26  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 27  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 28  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 29  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 30  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 31  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 32  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 33  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 34  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 35  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 36  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 37  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789')
 38  --
 39  || TO_CLOB('0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 40  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 41  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 42  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 43  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
 44  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'
 45  )
 46  );

1 row created.

SQL>

Uwaga: Jeśli włączysz dwa ciągi o długości poniżej 4000 znaków (wynikowa długość łańcucha i 4000), a także nie zadziała i nie powiedzie się o błędzie: ORA-01489: result of string concatenation is too long

Więc wniosek jest użycie TO_CLOB z kawałkami mniej niż 4000 znaków i konkatuje CLOB s za pomocą operatora concatanation ||

Twoje zdrowie!!

1
Popeye 24 grudzień 2019, 05:34