Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Простая функция, компилируются, но не работает / 6 сообщений из 6, страница 1 из 1
05.04.2013, 17:25
    #38214823
Полено
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
Код: plsql
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
create or replace 
FUNCTION tCYR_TO_HTML_ASCII(IN_STR IN VARCHAR2) RETURN VARCHAR2
AS
result varchar2(2000);
t varchar2(255);
BEGIN
result:='';
for i in 1..length(in_str)
loop

SELECT u into t  
 FROM 
 (  select '%D0%B0' as u, 'а' as c from dual
union select '%D0%B1' as u, 'б' as c from dual
union select '%D0%B2' as u, 'в' as c from dual
union select '%D0%B3' as u, 'г' as c from dual
union select '%D0%B4' as u, 'д' as c from dual
union select '%D0%B5' as u, 'е' as c from dual
union select '%D1%91' as u, 'ё' as c from dual
union select '%D0%B6' as u, 'ж' as c from dual
union select '%D0%B7' as u, 'з' as c from dual
union select '%D0%B8' as u, 'и' as c from dual
union select '%D0%B9' as u, 'й' as c from dual
union select '%D0%BA' as u, 'к' as c from dual
union select '%D0%BB' as u, 'л' as c from dual
union select '%D0%BC' as u, 'м' as c from dual
union select '%D0%BD' as u, 'н' as c from dual
union select '%D0%BE' as u, 'о' as c from dual
union select '%D0%BF' as u, 'п' as c from dual
union select '%D1%80' as u, 'р' as c from dual
union select '%D1%81' as u, 'с' as c from dual
union select '%D1%82' as u, 'т' as c from dual
union select '%D1%83' as u, 'у' as c from dual
union select '%D1%84' as u, 'ф' as c from dual
union select '%D1%85' as u, 'х' as c from dual
union select '%D1%86' as u, 'ц' as c from dual
union select '%D1%87' as u, 'ч' as c from dual
union select '%D1%88' as u, 'ш' as c from dual
union select '%D1%89' as u, 'щ' as c from dual
union select '%D1%8A' as u, 'ъ' as c from dual
union select '%D1%8C' as u, 'ь' as c from dual
union select '%D1%8D' as u, 'э' as c from dual
union select '%D1%8E' as u, 'ю' as c from dual
union select '%D1%8F' as u, 'я' as c from dual
union select '%D0%90' as u, 'А' as c from dual
union select '%D0%91' as u, 'Б' as c from dual
union select '%D0%92' as u, 'В' as c from dual
union select '%D0%93' as u, 'Г' as c from dual
union select '%D0%94' as u, 'Д' as c from dual
union select '%D0%95' as u, 'Е' as c from dual
union select '%D0%81' as u, 'Ё' as c from dual
union select '%D0%96' as u, 'Ж' as c from dual
union select '%D0%97' as u, 'З' as c from dual
union select '%D0%98' as u, 'И' as c from dual
union select '%D0%99' as u, 'Й' as c from dual
union select '%D0%9A' as u, 'К' as c from dual
union select '%D0%9B' as u, 'Л' as c from dual
union select '%D0%9C' as u, 'М' as c from dual
union select '%D0%9D' as u, 'Н' as c from dual
union select '%D0%9E' as u, 'О' as c from dual
union select '%D0%9F' as u, 'П' as c from dual
union select '%D0%A0' as u, 'Р' as c from dual
union select '%D0%A1' as u, 'С' as c from dual
union select '%D0%A2' as u, 'Т' as c from dual
union select '%D0%A3' as u, 'У' as c from dual
union select '%D0%A4' as u, 'Ф' as c from dual
union select '%D0%A5' as u, 'Х' as c from dual
union select '%D0%A6' as u, 'Ц' as c from dual
union select '%D0%A7' as u, 'Ч' as c from dual
union select '%D0%A8' as u, 'Ш' as c from dual
union select '%D0%A9' as u, 'Щ' as c from dual
union select '%D0%AA' as u, 'Ъ' as c from dual
union select '%D0%AC' as u, 'Ь' as c from dual
union select '%D0%AD' as u, 'Э' as c from dual
union select '%D0%AE' as u, 'Ю' as c from dual
UNION SELECT '%D0%AF' AS U, 'Я' AS C FROM DUAL
) where c=substr(in_str,i,1); 

result:=result||t;
end loop;
return result;

end;



select tCYR_TO_HTML_ASCII('Ведомость дефектов') t from dual

возвращает NULL
...
Рейтинг: 0 / 0
05.04.2013, 22:35
    #38215193
Cepega88
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
Ну во первых null потому, что происходит ошибка (no_data_found). нет символа пробел. она выходит если запустить функцию в plsql. И ещё такой способ не очень производительный. на вскидку можно использовать массив
Код: plsql
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
CREATE OR REPLACE Function Tcyr_To_Html_Ascii1(In_Str In Varchar2)
  Return Varchar2 As
  Result Varchar2(2000);
  Type Charset Is Table Of Varchar2(6) Index By Varchar2(2);
  Char_Table Charset;
Begin
  Char_Table('Ё') := '%D0%81';
  Char_Table('А') := '%D0%90';
  Char_Table('Б') := '%D0%91';
  Char_Table('В') := '%D0%92';
  Char_Table('Г') := '%D0%93';
  Char_Table('Д') := '%D0%94';
  Char_Table('Е') := '%D0%95';
  Char_Table('Ж') := '%D0%96';
  Char_Table('З') := '%D0%97';
  Char_Table('И') := '%D0%98';
  Char_Table('Й') := '%D0%99';
  Char_Table('К') := '%D0%9A';
  Char_Table('Л') := '%D0%9B';
  Char_Table('М') := '%D0%9C';
  Char_Table('Н') := '%D0%9D';
  Char_Table('О') := '%D0%9E';
  Char_Table('П') := '%D0%9F';
  Char_Table('Р') := '%D0%A0';
  Char_Table('С') := '%D0%A1';
  Char_Table('Т') := '%D0%A2';
  Char_Table('У') := '%D0%A3';
  Char_Table('Ф') := '%D0%A4';
  Char_Table('Х') := '%D0%A5';
  Char_Table('Ц') := '%D0%A6';
  Char_Table('Ч') := '%D0%A7';
  Char_Table('Ш') := '%D0%A8';
  Char_Table('Щ') := '%D0%A9';
  Char_Table('Ъ') := '%D0%AA';
  Char_Table('Ь') := '%D0%AC';
  Char_Table('Э') := '%D0%AD';
  Char_Table('Ю') := '%D0%AE';
  Char_Table('Я') := '%D0%AF';
  Char_Table('а') := '%D0%B0';
  Char_Table('б') := '%D0%B1';
  Char_Table('в') := '%D0%B2';
  Char_Table('г') := '%D0%B3';
  Char_Table('д') := '%D0%B4';
  Char_Table('е') := '%D0%B5';
  Char_Table('ж') := '%D0%B6';
  Char_Table('з') := '%D0%B7';
  Char_Table('и') := '%D0%B8';
  Char_Table('й') := '%D0%B9';
  Char_Table('к') := '%D0%BA';
  Char_Table('л') := '%D0%BB';
  Char_Table('м') := '%D0%BC';
  Char_Table('н') := '%D0%BD';
  Char_Table('о') := '%D0%BE';
  Char_Table('п') := '%D0%BF';
  Char_Table('р') := '%D1%80';
  Char_Table('с') := '%D1%81';
  Char_Table('т') := '%D1%82';
  Char_Table('у') := '%D1%83';
  Char_Table('ф') := '%D1%84';
  Char_Table('х') := '%D1%85';
  Char_Table('ц') := '%D1%86';
  Char_Table('ч') := '%D1%87';
  Char_Table('ш') := '%D1%88';
  Char_Table('щ') := '%D1%89';
  Char_Table('ъ') := '%D1%8A';
  Char_Table('ь') := '%D1%8C';
  Char_Table('э') := '%D1%8D';
  Char_Table('ю') := '%D1%8E';
  Char_Table('я') := '%D1%8F';
  Char_Table('ё') := '%D1%91';

  Result := '';
  For i In 1 .. Length(In_Str) Loop
    Result := Result || Char_Table(Substr(In_Str, i, 1));
  
  End Loop;
  Return Result;
Exception
  When No_Data_Found Then
    Return 'no exists char';
End;


Пробовал запускать вашу и свою фунцию 10000 раз и получил что то вроде 11 сек против 0,2 сек.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
Declare
 i Pls_Integer;
begin
  For i In 1.. 10000 Loop
  :result := tcyr_to_html_ascii1(in_str => :in_str);
  End Loop;
end;
...
Рейтинг: 0 / 0
06.04.2013, 10:06
    #38215314
non-apexoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
Зачем вам нужна такая функция? Похоже, для того, что называют 'url utf-8 encoding'. Для этого не нужно изобретать велосипед:
Код: plsql
1.
2.
3.
4.
5.
6.
declare
  l_url varchar2(100);
begin
  l_url:= utl_url.escape(url=>'http://www.somesite/АБВ', url_charset =>'AL32UTF8');
  dbms_output.put_line(l_url);
end;


Почитать подробней можно здесь.
...
Рейтинг: 0 / 0
06.04.2013, 12:21
    #38215358
Полено
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
non-apexoidЗачем вам нужна такая функция? Похоже, для того, что называют 'url utf-8 encoding'. Для этого не нужно изобретать велосипед:
Код: plsql
1.
2.
3.
4.
5.
6.
declare
  l_url varchar2(100);
begin
  l_url:= utl_url.escape(url=>'http://www.somesite/АБВ', url_charset =>'AL32UTF8');
  dbms_output.put_line(l_url);
end;


Почитать подробней можно здесь.

Почти что, ф-ция нужна для кодирования имен файлов при скачивании с помощью

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 owa_util.mime_header( nvl(v_mime,'application/octet'), FALSE );
 

 htp.p('Content-Disposition: attachment; filename='||v_file_name);
                  
                owa_util.http_header_close;
             
               wpg_docload.download_file( Lob_loc );



При этом если в v_file_name будет кирилица то IE превращает в набор UTF, в других браузерах все нормально.
Если использовать utl_url.escape(url=>'http://www.somesite/АБВ', url_charset =>'AL32UTF8'); то пробелы записываются как %20
...
Рейтинг: 0 / 0
06.04.2013, 14:27
    #38215398
non-apexoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
Так и должно быть. А вас это не устраивает?
...
Рейтинг: 0 / 0
06.04.2013, 17:49
    #38215534
Полено
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая функция, компилируются, но не работает
non-apexoidТак и должно быть. А вас это не устраивает?
Боюсь пользователей не устроит.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Простая функция, компилируются, но не работает / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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