Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
Добрый день ! подскажите пожалуйста как ускорить процедуру к-я вызывает функцию(где лучше отсортировать строку? а то я беру по одному символу это долго)
CREATE OR REPLACE FUNCTION GetOnlyNumbers(VAL in varchar2)
RETURN VARCHAR2 IS
Result1 varchar2(100):='';
Result2 varchar2(100):='';
Result3 varchar2(100):='';
Result4 varchar2(100):='';
Result5 varchar2(100):='';
i integer;
c char(1);
a char(1);
BEGIN
if val is not null then
for i in 1..length(VAL) loop
select
c:=substr(VAL,i,1);
insert into Sor values (c);

if (c>='A') and (c<='Z') then Result1:=Result1||c; end if;
------------------------------------
if (c>='a') and (c<='z') then Result2:=Result2||c; end if;
------------------------------------
if (c>='0') and (c<='9') then Result3:=Result3||c; end if;
------------------------------------
if (c>='А') and (c<='Я') then Result4:=Result4||c; end if;
------------------------------------
if (c>='а') and (c<='я') then Result5:=Result5||c; end if;

end loop;
end if;

return(Result1||Result2||Result3||Result4||Result5);
END;
и соответственно процедура
create or replace procedure SortSt(str IN varchar) is
c char;
set_str varchar(500) := '';
begin
set_str := GetOnlyNumbers(str);
dbms_output.put_line(set_str);
end SortSt; строку вывожу сначала загл. англ, затем прописные англ, потом цифры ,потом с русскими буквами
10 апр 08, 10:05    [5528237]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
ditbunau
Member

Откуда: оттуда
Сообщений: 717
Курите мануалы по строковым функциям.
10 апр 08, 10:07    [5528260]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
ditbunau
Курите мануалы по строковым функциям.


Извените я так не понимаю,на форуме не давно и еще незнакома с некоторыми словами!
10 апр 08, 10:09    [5528278]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Курите=читайте
10 апр 08, 10:13    [5528306]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
Я смотрела функции! но не могу придумать! Дайте направление!
10 апр 08, 10:18    [5528342]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
sendal
Guest
vizalis

.......
for i in 1..length(VAL) loop
..........
insert into Sor values (c);
..........

end loop;
...........

Думаю , что алгоритмы отсортировки строки - это не там проблему ищете .... :)
10 апр 08, 10:20    [5528348]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64018
Блог
vizalis
Добрый день ! подскажите пожалуйста как ускорить процедуру

Полагаю, если придумаете, как применить translate, получите выигрыш на порядок-другой.
10 апр 08, 10:22    [5528375]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
vizalis
Добрый день ! подскажите пожалуйста как ускорить процедуру к-я вызывает функцию(где лучше отсортировать строку? а то я беру по одному символу это долго)
 CREATE OR REPLACE FUNCTION GetOnlyNumbers(VAL in varchar2)
   RETURN VARCHAR2 IS
      Result1 varchar2(100):='';
      Result2 varchar2(100):='';
      Result3 varchar2(100):='';
      Result4 varchar2(100):='';
      Result5 varchar2(100):='';
      i      integer;
      c      char(1);
      a      char(1);
   BEGIN
       if val is not null then
         for i in 1..length(VAL) loop
         select     -- Что это?
            c:=substr(VAL,i,1);
             insert into Sor values (c);    -- Зачем это?
            
             if (c>='A') and (c<='Z') then Result1:=Result1||c;  end if;
  ------------------------------------           
             if (c>='a') and (c<='z') then Result2:=Result2||c;  end if;
  ------------------------------------          
             if (c>='0') and (c<='9') then Result3:=Result3||c;  end if;
  ------------------------------------
             if (c>='А') and (c<='Я') then Result4:=Result4||c;  end if;    
  ------------------------------------
             if (c>='а') and (c<='я') then Result5:=Result5||c;  end if;       
 
         end loop;
      end if;

      return(Result1||Result2||Result3||Result4||Result5);
   END;
и соответственно процедура
create or replace procedure SortSt(str IN varchar) is
c char;
set_str varchar(500) := '';
begin
  set_str := GetOnlyNumbers(str);
  dbms_output.put_line(set_str);
end SortSt;
строку вывожу сначала загл. англ, затем прописные англ, потом цифры ,потом с русскими буквами
10 апр 08, 10:23    [5528381]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
Вставка тут не нужна! я просто строку забыла убрать! Так что мне делать?
10 апр 08, 10:24    [5528386]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
эти две строки просто забыла убрать а с процедурой все впорядке

execute SortSt('JH222gfsdlsA4555546DJЯЯЯЯЯFH645LLЮЮЮЮюL6ээээ6');

и результат
Процедура PL/SQL успешно завершена.

JHADJFHLLLgfsdls222455554664566ЯЯЯЯЯЮЮЮЮюээээ
10 апр 08, 10:26    [5528413]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
vizalis

         select     
            c:=substr(VAL,i,1);
             insert into Sor values (c);


Вам это точно нужно?
10 апр 08, 10:28    [5528426]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Elic
Member

Откуда:
Сообщений: 29991
vizalis
FUNCTION GetOnlyNumbers
STFF Отсечение цифр от букв
10 апр 08, 10:28    [5528433]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
vizalis
Member

Откуда:
Сообщений: 75
Сергей Арсеньев
vizalis

         select     
            c:=substr(VAL,i,1);
             insert into Sor values (c);


Вам это точно нужно?


Ну вставлю я строку в таблицу а как ее отсортировать лучше?
10 апр 08, 10:32    [5528471]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
К вопросу об извращениях :)
with t as (select 'JH222gfsdlsA4555546DJЯЯЯЯЯFH645LLЮЮЮЮюL6ээээ6' str from dual),
pivot as (select substr(str, level, 1) litera from t connect by level <= length (str))
select replace(max(sys_connect_by_path(litera, ' ')) keep (dense_rank last order by length(sys_connect_by_path(litera, ','))), ' ')
from
(
select litera,
       row_number() over (order by case when litera between 'A' and 'Z' then 1 
                                        when litera between 'a' and 'z' then 2 
                                        when litera between '0' and '9' then 3 
                                        when litera between 'А' and 'Я' then 4
                                        when litera between 'а' and 'я' then 5
                                        else 6
                                   end) rn
from pivot
) t
connect by rn = prior rn+1
10 апр 08, 10:33    [5528483]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
vizalis

Ну вставлю я строку в таблицу а как ее отсортировать лучше?

Не строку а каждый символ в отдельную запись таблицы. Что с этим потом делать то?
Вам даже порядок никто не гарантирует (хотя скорее всего он будет верен).
10 апр 08, 10:36    [5528504]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Elic
Member

Откуда:
Сообщений: 29991
Jannny
                                        when litera between 'А' and 'Я' then 4
                                        when litera between 'а' and 'я' then 5
А Ё/ё у нас кто? :)
10 апр 08, 10:38    [5528522]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Jannny
                                        when litera between 'А' and 'Я' then 4
                                        when litera between 'а' and 'я' then 5
А Ё/ё у нас кто? :)
Ну э...
10 апр 08, 10:40    [5528541]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Jannny
К вопросу об извращениях :)

Ну да препод на экзамене будет в отпаде задав сакральный вопрос - что это про "pivot".
10 апр 08, 10:41    [5528549]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
Олег_s
Member

Откуда: Кумертау
Сообщений: 77
а ЭТО работает недостаточно быстро? на крайняк можно попробовать разветвить Ваши условия. Как ето реализовано в Оракле не знаю, но если "по честному", то может дать прирост скорости

CREATE OR REPLACE FUNCTION GetOnlyNumbers(VAL in varchar2)
   RETURN VARCHAR2 IS
      Result1 varchar2(100):='';
      Result2 varchar2(100):='';
      Result3 varchar2(100):='';
      Result4 varchar2(100):='';
      Result5 varchar2(100):='';
      i      integer;
      c      char(1);
      a      char(1);
   BEGIN
       if val is not null then
         for i in 1..length(VAL) loop
            c:=substr(VAL,i,1);
            
             if (c>='A') and (c<='Z') then Result1:=Result1||c;  
             else
              if (c>='a') and (c<='z') then Result2:=Result2||c;
              else
               if (c>='0') and (c<='9') then Result3:=Result3||c;
               else
                if (c>='А') and (c<='Я') then Result4:=Result4||c;  
                else
                 if (c>='а') and (c<='я') then Result5:=Result5||c;end if;
                end if;    
               end if;
              end if;
             end if; 
         end loop;
      end if;

      return(Result1||Result2||Result3||Result4||Result5);
   END;
11 апр 08, 18:28    [5536412]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить процедуру???  [new]
ГостЪ
Guest
Олег_s
на крайняк можно попробовать разветвить
RTFM Searched CASE Expression
11 апр 08, 18:44    [5536501]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить