powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / clob построчно
25 сообщений из 51, страница 1 из 3
clob построчно
    #35966486
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Пробую считать содержимое clob поля таблицы построчно. Используя для этого dbms_lob.instr, dbms_lob.substr если небольшое количество строк то ещё ничего у меня же этих строк 57348 и время за которое выбирается строка в переменную большое, я даже нестал до конца ждать(было больше 20 минут). В чем здесь может быть дело. Что еще можно использовать для построчного чтения clob ?
...
Рейтинг: 0 / 0
clob построчно
    #35966491
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r900000В чем здесь может быть дело. В 17-ой строке
...
Рейтинг: 0 / 0
clob построчно
    #35966582
AndrK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r900000,
Навскидку несколько вариантов
1.instr, substr не над всем CLOB делать
2. JAVA StringTokenizer
3. через dbms_lob.read работать
....
...
Рейтинг: 0 / 0
clob построчно
    #35966672
ILoveCoffee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r900000Добрый день.
Пробую считать содержимое clob поля таблицы построчно. Используя для этого dbms_lob.instr, dbms_lob.substr если небольшое количество строк то ещё ничего у меня же этих строк 57348 и время за которое выбирается строка в переменную большое, я даже нестал до конца ждать(было больше 20 минут). В чем здесь может быть дело. Что еще можно использовать для построчного чтения clob ?


клоб построчно
...
Рейтинг: 0 / 0
clob построчно
    #35966684
ILoveCoffee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ILoveCoffee,
+ regexp
...
Рейтинг: 0 / 0
clob построчно
    #35966766
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r900000Добрый день.
Пробую считать содержимое clob поля таблицы построчно. Используя для этого dbms_lob.instr, dbms_lob.substr если небольшое количество строк то ещё ничего у меня же этих строк 57348 и время за которое выбирается строка в переменную большое, я даже нестал до конца ждать(было больше 20 минут). В чем здесь может быть дело. Что еще можно использовать для построчного чтения clob ?
Что-то мне подсказывает, что Вы при парсинге меняете параметр nth, а надо менять offset. И все будет хорошо.
...
Рейтинг: 0 / 0
clob построчно
    #35966907
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В процедуре у меня сделано так:

sobch varchar2(4000);
s clob;
.....

select t into s from t2;
i1:=0;
i2:=0;
i3:=1;
loop


i2:=dbms_lob.instr(s,CHR (10),1,i1+1);
sobch := dbms_lob.substr(s,i2-i3,i3);
i3:=i2+1;

i1:=i1+1;


IF i1>57348
THEN
EXIT;
END IF;

end loop;

1) и как тут можно не над всем CLOB делать, когда мне нужно каждую строку считать?
2) На JAVA пока не хотелось бы делать это, если без неё здесь можно обойтись(или нельзя)?
3) А какая разница использовать dbms_lob.read или dbms_lob.substr? Вы уверены что с dbms_lob.read будет быстрее работать?
Тоже долго делает я это вроде тоже проверил:
sobch:='';
iobch:=i2-i3;
dbms_lob.read(s, iobch, i3, sobch);
Да версия 9 oracle а в ней regexp не работает
...
Рейтинг: 0 / 0
clob построчно
    #35966924
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да у меня и такой вариант есть, тоже долго работает:
....
i2:=dbms_lob.instr(s,CHR (10),i3+1,1);
i3:=i3+i2-ipr;

ipr:=i2;
i1:=i1+1;
....
...
Рейтинг: 0 / 0
clob построчно
    #35967083
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Тоже приходилось разбирать большой clob (строки с разделителями).
Решил привести его к XML, чтобы потом стандартно обрабатывать.
Для этого нужна быстрая функция clob_replace. Все варианты, которые пробовал (через dbms_lob.instr/dbms_lob.substr) тормозили не по детски.
Сделал хранимку на Java - скорость вполне устроила.
...
Рейтинг: 0 / 0
clob построчно
    #35967101
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно на примере. Как вы это сделали.
...
Рейтинг: 0 / 0
clob построчно
    #35967203
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Java -модуль, оставил только функцию replaceClob

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
create or replace and compile java source named out_reestr as
import java.io.BufferedReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.*;
import java.util.StringTokenizer;
import java.sql.*;
import oracle.sql.CLOB;
import oracle.jdbc.driver.*;


 public class OUT_CSV_REESTR {

   public static oracle.sql.CLOB replaceClob(oracle.sql.CLOB cont, String find,String replace) throws SQLException,IOException {

      String content;
      int length;
      StringBuffer buf;
      CLOB clob=null;
      java.io.Writer out=null;
      Connection con = null;
        try {
            if (cont != null) {
               buf = new StringBuffer("");
               Reader is = cont.getCharacterStream();
               char buffer[] = new char[ 8192 ];
               while((length=is.read(buffer, 0 , 8192 )) != - 1 )
                 buf.append(buffer, 0 ,length);
               content=buf.toString();
               content=content.replaceAll(find,replace);
             }
             else
             return null;
             
            con=new OracleDriver().defaultConnection();
            clob = CLOB.createTemporary(con, true, CLOB.DURATION_SESSION);
            out=clob.setCharacterStream( 0 );
            out.write(content);
             
        } catch (Exception ex) {
           return null;
        }
        finally {
           if(out!=null) out.close();
     }
        return clob;
    }
 }

Функция обертка (у меня в пакете, где все функции Java)
Код: plaintext
1.
2.
3.
4.
 -- Заменяет внутри clob подстроки
 create or replace function replaceClob(p_clob clob, p_find varchar2, p_replace varchar2)
    return clob as
    language java name 'OUT_CSV_REESTR.replaceClob(oracle.sql.CLOB, java.lang.String,java.lang.String)   return clob';

Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select
/* 
 regexp_substr(str,'[^'||chr(9)||']+',1,1) f1,
 regexp_substr(str,'[^'||chr(9)||']+',1,2) f1,
 regexp_substr(str,'[^'||chr(9)||']+',1,3) f1,
 */
* 
from (
select 
  extract(column_value,'/b/text()').getStringVal() str
 from
  table(
      xmlsequence(xmltype(
   '<a><b>'
    ||
   -- clob_replace
     java_pck.replaceclob ((select reestr from log_table where t.id= 2124 ),chr( 13 )||chr( 10 ),'</b><b>')
    ||
   '</b></a>'
   ).extract('//b')
  )
 )
)  
(select reestr from log_table where t.id=2124) - исходный clob.
...
Рейтинг: 0 / 0
clob построчно
    #35967605
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Или так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
extractvalue(column_value,'/b/c[1]'),
extractvalue(column_value,'/b/c[2]'),
extractvalue(column_value,'/b/c[3]'),
extractvalue(column_value,'/b/c[4]'),
extractvalue(column_value,'/b/c[5]'),
extractvalue(column_value,'/b/c[6]'),
extractvalue(column_value,'/b/c[7]')
from
table(
      xmlsequence(xmltype (
 '<a><b><c>'
    ||
    java_pck.replaceclob (
      java_pck.replaceclob ((select reestr from sverkareestr t where t.id= 2431  ),chr( 13 )||chr( 10 ),'</c></b><b><c>')
    ,chr( 9 ),'</c><c>')||'</c></b></a>' 
  ).extract('//b')
  )
 )

Но разбор XML быстрее через xmldom.
...
Рейтинг: 0 / 0
clob построчно
    #35968143
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ругается при компиляции java класса на строку content=content.replaceAll(find,replace);
говорит replaceAll не может найти.
...
Рейтинг: 0 / 0
clob построчно
    #35968289
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Вероятно у Вас версия java ниже 1.4, т.к. replaceAll появился в 1.4
Соответственно или обновить версию или написать свою функцию replace на Java.
...
Рейтинг: 0 / 0
clob построчно
    #35968432
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Например такой вариант.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
create or replace and compile java source named out_reestr as
import java.io.BufferedReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.*;
import java.util.StringTokenizer;
import java.sql.*;
import oracle.sql.CLOB;
import oracle.jdbc.driver.*;


 public class OUT_CSV_REESTR {

 public static String  replace(String str, String find,String replace) {
    StringBuffer sb = new StringBuffer("");
    int index;
    int offset =  0 ;
    for(index = str.indexOf(find); index != - 1 ; index = str.indexOf(find)){
      sb.append( str.substring( 0 , index) );
      sb.append( replace );
      offset = index + find.length();
      str = str.substring( offset );
    }
   sb.append(str);
   return sb.toString();
}


  public static oracle.sql.CLOB replaceClob(oracle.sql.CLOB cont, String find,String replace) throws SQLException,IOException {

      String content;
      int length;
      StringBuffer buf;
      CLOB clob=null;
      java.io.Writer out=null;
      Connection con = null;
        try {
            if (cont != null) {
               buf = new StringBuffer("");
               Reader is = cont.getCharacterStream();
               char buffer[] = new char[ 8192 ];
               while((length=is.read(buffer, 0 , 8192 )) != - 1 )
                 buf.append(buffer, 0 ,length);
               content=buf.toString();
               content=replace(content,find,replace);
               //content.replaceAll(find,replace);
             }
             else
             return null;
             
            con=new OracleDriver().defaultConnection();
            clob = CLOB.createTemporary(con, true, CLOB.DURATION_SESSION);
            out=clob.setCharacterStream( 0 );
            out.write(content);
             
        } catch (Exception ex) {
           return null;
        }
        finally {
           if(out!=null) out.close();
     }
        return clob;
    }
}

Попробовал, работает в 2-3 раза быстрее стандартной replaceAll.
Вероятно из-за того, что replaceAll поддерживает регулярные выражения.
...
Рейтинг: 0 / 0
clob построчно
    #35968471
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r900000В процедуре у меня сделано так:
i2:=dbms_lob.instr(s,CHR (10), 1,i1+1 );
..
вы ответы, вообще, читаете?
...
Рейтинг: 0 / 0
clob построчно
    #35968618
givanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишем простой автомат. Должно работать быстрее всего.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
declare 
  cl clob:= 'qwerty
asdfgh
zxcvb';
  l_amount pls_integer:=  1 ;
  l_length pls_integer:= dbms_lob.getlength(cl);
  token varchar2( 4000 );
  sobch varchar2( 4000 );
begin
  for i in  1 ..l_length loop
    dbms_lob.read
    ( lob_loc => cl
    , amount => l_amount
    , offset => i
    , buffer => token
    );
    if token = chr( 10 ) then
      dbms_output.put_line(sobch);
      dbms_output.put_line('----------');
      sobch:= null;
    elsif i = l_length then
      sobch:= sobch||token;
      dbms_output.put_line(sobch);
      dbms_output.put_line('----------');
    else
      sobch:= sobch||token;
    end if;
  end loop;
end;
...
Рейтинг: 0 / 0
clob построчно
    #35968635
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
givanovПишем простой автомат. Должно работать быстрее всего.
Код: plaintext
1.
  l_amount pls_integer:=  1 ;
STFF "Slow-by-Slow"
...
Рейтинг: 0 / 0
clob построчно
    #35970913
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в вашем запросе

select
/*
regexp_substr(str,'[^'||chr(9)||']+',1,1) f1,
regexp_substr(str,'[^'||chr(9)||']+',1,2) f1,
regexp_substr(str,'[^'||chr(9)||']+',1,3) f1,
*/
*
from (
select
extract(column_value,'/b/text()').getStringVal() str
from
table(
xmlsequence(xmltype(
'<a><b>'
||
-- clob_replace
java_pck.replaceclob ((select reestr from log_table where t.id=2124),chr(13)||chr(10),'</b><b>')
||
'</b></a>'
).extract('//b')
)
)
)

вместо java_pck.replaceclob если не в пакете нужно, наверно, replaceclob поставить, и все равно ваш запрос мне возвратил одну пустую строку.
...
Рейтинг: 0 / 0
clob построчно
    #35971007
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Так что разбираете? Я же не знаю какие у Вас разделители.
Может у вас не chr(13)||chr(10), а chr(10). И поля может не табуляцией, а запятой разделены.
Киньте пример clob'a.
...
Рейтинг: 0 / 0
clob построчно
    #35971022
r900000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разделитель между строчками CHR (10), а в строчках столбцы(данные) разделены пробелами.
Prices and Yield Trade's Volume Best on closing KZT/USD Currency Type
Clean price for bonds Yield to maturity Price (gross price for bond) in number in Clean price Yield to maturity Price Deals NIN or Listing exchange of of ID
Date Code Open High Low Last Average Open High Low Last Average Open High Low Last Average of securities US dollar Bid Offer Bid Offer Bid Offer number NSIN category rate quote securities records
Date Code OpenCP HighCP LowCP LastCP AverageCP OpenY HighY LowY LastY AverageY OpenP HighP LowP LastP AverageP Volume VolUSD BidCP OfferCP BidY OfferY BidP OfferP Deals NIN Listing Rate Currency Type ID
02.10.2007 aASAVb2 0 0 94,0826 98,4167 11,0000 8,9990 976,5622 1019,9033 0 KZPC2Y03C346 C 120,9800 KZT 4 2208269
...
Рейтинг: 0 / 0
clob построчно
    #35971034
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
У меня работает.
Ваш clob в (select reestr from sverkareestr t where t.id=1)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
*
from (
select 
extract(column_value,'/b/text()').getStringVal() str
from
table(
xmlsequence(xmltype(
'<a><b>'
||
java_pck.replaceclob ((select reestr from sverkareestr t where t.id= 1 ),chr( 10 ),'</b><b>')
||
'</b></a>'
).extract('//b')
)
)
) 
...
Рейтинг: 0 / 0
clob построчно
    #35971049
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
А так еще разбор по словам (если слов в строке много, то столбцы неудобно вырисовывать)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t1 as (
    select rownum rn, str  from (
        select extract(column_value,'/b/text()').getStringVal() str from
        table( xmlsequence(xmltype('<a><b>'||
             java_pck.replaceclob ((select reestr from sverkareestr t where t.id= 1 ),chr( 10 ),'</b><b>')||
             '</b></a>').extract('//b'))))
          )
SELECT rn, (REGEXP_SUBSTR(str,
  '[^ ]+',  1 , Level)) wrd
     FROM t1 
     CONNECT BY 
     prior rn=rn and prior dbms_random.random is not null
     and
     REGEXP_SUBSTR(str, '[^ ]+',  1 , LEVEL) IS not NULL
...
Рейтинг: 0 / 0
clob построчно
    #35971144
Anton_DS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r900000Разделитель между строчками CHR (10), а в строчках столбцы(данные) разделены пробелами.
Prices and Yield Trade's Volume Best on closing KZT/USD Currency Type
Clean price for bonds Yield to maturity Price (gross price for bond) in number in Clean price Yield to maturity Price Deals NIN or Listing exchange of of ID
Date Code Open High Low Last Average Open High Low Last Average Open High Low Last Average of securities US dollar Bid Offer Bid Offer Bid Offer number NSIN category rate quote securities records
Date Code OpenCP HighCP LowCP LastCP AverageCP OpenY HighY LowY LastY AverageY OpenP HighP LowP LastP AverageP Volume VolUSD BidCP OfferCP BidY OfferY BidP OfferP Deals NIN Listing Rate Currency Type ID
02.10.2007 aASAVb2 0 0 94,0826 98,4167 11,0000 8,9990 976,5622 1019,9033 0 KZPC2Y03C346 C 120,9800 KZT 4 2208269
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
WITH ttt
       AS (SELECT   DBMS_LOB.getlength (txt) - DBMS_LOB.getlength (REPLACE (txt, CHR ( 13 ), '')) ln_cnt
           FROM     loader.bonus_mates)
SELECT   lvl num, to_char(','||SUBSTR (txt, start_pos+ 2 , end_pos - start_pos - 2 )) line
FROM     (SELECT       LEVEL lvl, NVL (DBMS_LOB.INSTR (txt, CHR ( 13 ) || CHR ( 10 ),  1 , LEVEL -  1 ),  0 ) start_pos
                      ,DBMS_LOB.INSTR (txt, CHR ( 13 ) || CHR ( 10 ),  1 , LEVEL) end_pos, txt
          FROM         loader.bonus_mates
          CONNECT BY   LEVEL < (SELECT       ln_cnt FROM ttt))
я недавно делал нечто подобное..
в общем могу подсказать первый шаг как выташить строки.. из файла..
дальше уже рег_экспы или класические сабстры тибе в помощь..
...
Рейтинг: 0 / 0
clob построчно
    #35971146
Anton_DS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anton_DSr900000Разделитель между строчками CHR (10), а в строчках столбцы(данные) разделены пробелами.
Prices and Yield Trade's Volume Best on closing KZT/USD Currency Type
Clean price for bonds Yield to maturity Price (gross price for bond) in number in Clean price Yield to maturity Price Deals NIN or Listing exchange of of ID
Date Code Open High Low Last Average Open High Low Last Average Open High Low Last Average of securities US dollar Bid Offer Bid Offer Bid Offer number NSIN category rate quote securities records
Date Code OpenCP HighCP LowCP LastCP AverageCP OpenY HighY LowY LastY AverageY OpenP HighP LowP LastP AverageP Volume VolUSD BidCP OfferCP BidY OfferY BidP OfferP Deals NIN Listing Rate Currency Type ID
02.10.2007 aASAVb2 0 0 94,0826 98,4167 11,0000 8,9990 976,5622 1019,9033 0 KZPC2Y03C346 C 120,9800 KZT 4 2208269
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
WITH ttt
       AS (SELECT   DBMS_LOB.getlength (txt) - DBMS_LOB.getlength (REPLACE (txt, CHR ( 13 ), '')) ln_cnt
           FROM     loader.bonus_mates)
SELECT   lvl num, to_char(','||SUBSTR (txt, start_pos+ 2 , end_pos - start_pos - 2 )) line
FROM     (SELECT       LEVEL lvl, NVL (DBMS_LOB.INSTR (txt, CHR ( 13 ) || CHR ( 10 ),  1 , LEVEL -  1 ),  0 ) start_pos
                      ,DBMS_LOB.INSTR (txt, CHR ( 13 ) || CHR ( 10 ),  1 , LEVEL) end_pos, txt
          FROM         loader.bonus_mates
          CONNECT BY   LEVEL < (SELECT       ln_cnt FROM ttt))
я недавно делал нечто подобное..
в общем могу подсказать первый шаг как выташить строки.. из файла..
дальше уже рег_экспы или класические сабстры тибе в помощь..
Блин тока там разделители подправь..
у миня тм походу заяпятые, но я думаю разберешься с логикой запроса.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / clob построчно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]