2013-12-16 4 views
2

В соответствии с documentation столбцами типа данных CLOB и NCLOB может храниться до 8 терабайт символьных данных.Работа с очень большими текстовыми данными и столбцом CLOB

У меня есть текст, который содержит 100 000 символов, как я могу запустить запрос, как это:

UPDATE my_table SET clob_column = 'text, which contains 100 000 characters' 
WHERE id = 1 

?

Если в тексте, количество символов до 32767, то можно использовать PL/SQL анонимный блок:

DECLARE 
    myvar VARCHAR2(15000); 
BEGIN 
    myvar := 'text, which contains 100 000 characters'; 
    UPDATE my_table SET clob_column = myvar 
    WHERE id = 1; 
    .... 
END; 

Что такое решение, где текст очень большой и содержит, например, 100 000 символов?

обновление

Я пытаюсь с dbms_lob.append:

create table t1 (c clob); 

    declare 
     c1 clob; 
     c2 clob; 
    begin 
     c1 := 'abc'; 
     c2 := 'text, which contains 100 000 characters'; 
     dbms_lob.append(c1, c2); 
     insert into t1 values (c1); 
    end; 

Хотя, также получил ошибку: string literal too long.

Я делаю что-то неправильно?

+1

Откуда берутся эти данные? Набрание 100 тыс. Символов было бы плохим выбором, поэтому прямой SQL или анонимный блок PL/SQL не является хорошей идеей. Если данные находятся в файлах, вы можете напрямую использовать 'UTL_FILE'. Если данные поступают из приложения, вы можете использовать любой язык, который он написал, для непосредственного взаимодействия с объектами clob. –

+0

Спасибо за ответ, мне просто нужно хранить большой текст в столбце clob – RIKI

ответ

4

Вы должны использовать пакет dbms_lob, процедура добавления строки в клоб - dbms_lob.append.

DBMS_LOB documentation

declare 
    c1 clob; 
    c2 varchar2(32000); 
begin 
    c1 := 'abc'; 
    c2 := 'text, which contains 32 000 characters'; 
    dbms_lob.append(c1, c2); 
    c2 := 'some more text, which contains 32 000 characters'; 
    dbms_lob.append(c1, c2); 
    insert into t1 values (c1); 
end; 
+0

Спасибо, я пытаюсь с 'dbms_lob.append', хотя и получил ошибку:' string literal too long'. См. Обновление, о котором идет речь. – RIKI

+0

Varchar ограничен 32 тыс. Символов. Ваша переменная 'c2' не может содержать 100 тыс. Символов. Вы должны вызывать функцию 'append' несколько раз, каждый раз добавляя не более 32 тыс. Символов. –

1

Я нашел этот вопрос, а погуглить как добавить данные в CLOB. Для моей конкретной проблемы я использую устаревшую систему PL/SQL, где я не могу использовать пакет dbms_lob, поэтому я подумал, что поделись своим ответом на благо других в моей ситуации.

Использование Oracle CONCAT function in a SELECT query, the CONCAT function works for the CLOB` тип данных. Например (используя пример @ AlenOblak):

declare 
    c1 clob; 
    c2 varchar2(32000); 
begin 
    c1 := 'abc'; 
    c2 := 'text, which contains 32 000 characters'; 
    SELECT CONCAT(c1, c2) INTO c1 FROM DUAL; 
    c2 := 'some more text, which contains 32 000 characters'; 
    SELECT CONCAT(c1, c2) INTO c1 FROM DUAL; 
    insert into t1 values (c1); 
end; 

Надеюсь, что это поможет.

Смежные вопросы