Архив

Архив раздела ‘SQL’

Model

7 Май 2010 2 comments
Categories: SQL Tags: ,

Разбить строку на строчки по 100 символов, не разбивая слова

2 Апрель 2010 4 comments
with t as (
select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
           || 'Но слова разбивать нельзя, переносить нужно по '
           ||rpad('qwerty',110,'o')||'абвгд' as s from dual
)
select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level))
from t
CONNECT BY
 regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps

SQL> with t as (
  2      select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
  3              || 'Но слова разбивать нельзя, переносить нужно по '
  4        ||rpad('qwerty',110,'o')||'абвгд' as s from dual
  5  )
  6  select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level)) as str
  7  from t
  8  CONNECT BY
  9   regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;

STR
--------------------------------------------------------------------------------
есть длинная строка - которую нужно разбить на строчки по сто символов.Но слова
переносить нужно по
qwertyoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooабвгд

Заменить подстроку, но только если перед ней пробел или запятая

2 Апрель 2010 5 comments

Для строки «asdfdasf,abs@dev, sdfasdf» надо найти вхождение «abs@» и заменить на «abs@fn», но только в том случае, если перед вхождением запятая или пробел.

select regexp_replace(str, '([, ]abs@)', '\1fn') as val
from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual)
--
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps

SQL> select regexp_replace(str, '([, ]abs@)', '\1fn') as val
  2    from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual);

VAL
--------------------------------------
aabs@sdfdasf,abs@fndev, sd abs@fnfasdf

SQL>

Регулярные выражения Oracle (regular expression)

31 Март 2010 21 comments


Регулярные выражения произошли из теорий автоматов и формальных языков, поэтому поначалу производят устрашающее впечатление. Однако, их базовые понятия являются простыми и в то же время мощными.
Начиная с версии Oracle 10g регулярные выражения можно использовать напрямую в SQL запросах.

Шаблон регулярных выражений выражается в виде строки, содержащей следующие конструкции:

  • Литеральные символы. Фактические символы, которые следует искать (Например, шаблон xyz соответствует только вхождению «xyz»)
  • Метасимволы. Операции, определяющие алгоритмы, которые должны применяться во время поиска (Например, шаблон ^xyz соответсвует только строке, начинающейся с «xyz» — другие вхождения не учитываются)

Читать дальше про “Регулярные выражения Oracle (regular expression)” »

Сгенерировать строки с числами

29 Март 2010 1 комментарий

select column_value from TABLE (sys.odcinumberlist(1,2,3,4,5));

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps

SQL> select column_value as val from TABLE (sys.odcinumberlist(1,2,3,4,5));

       VAL
----------
         1
         2
         3
         4
         5

SQL>
Categories: SQL Tags: ,

Добавление отчета в меню

declare
  vr_Form_name   VARCHAR2(100) := 'XX_NAME';
  vr_Description VARCHAR2(200) := 'XX_DESCRIPTION';
begin
  -- Регистрация функции формы
  fnd_form_functions_pkg.load_row
  (
    x_function_name           => vr_Form_name
  , x_application_short_name  => 'FND'
  , x_form_name               => 'FNDRSRUN'
  , x_parameters              => 'CONCURRENT_PROGRAM_NAME="'||vr_Form_name
                                 ||'" PROGRAM_APPL_SHORT_NAME="'||'XX'
                                 ||'" TITLE="'||vr_Description||'"'
  , x_type                    => 'FORM'
  , x_web_host_name           => NULL
  , x_web_agent_name          => NULL
  , x_web_html_call           => NULL
  , x_web_encrypt_parameters  => NULL
  , x_web_secured             => NULL
  , x_web_icon                => NULL
  , x_object_name             => NULL
  , x_region_application_name => NULL
  , x_region_code             => NULL
  , x_user_function_name      => vr_Description
  , x_description             => vr_Description
  , x_owner                   => 'INITIAL SETUP'
  , x_custom_mode             => 'FORCE'
  );
-- Регистрация пункта меню
  fnd_menu_entries_pkg.load_row
  (
    x_mode          => 'REPLACE'
  , x_ent_sequence  => 910
  , x_menu_name     => 'MENU_NAME'
  , x_sub_menu_name => NULL
  , x_function_name => vr_Form_name
  , x_grant_flag    => 'Y'
  , x_prompt        => vr_Description
  , x_description   => vr_Description
  , x_owner         => USER
  );
--
COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(substr('Error: ' || SQLERRM, 1, 255));
ROLLBACK;
end;
/
SHOW ERRORS

Замена кратных пробелов на один

17 Март 2010 4 comments
with t as (
  select 1 id, 'a s        sfd' info from dual
   union all
  select 2 id, 'a        b; g;g ;g  f' info from dual
   union all
  select 3 id, 'a     ' info from dual
   union all
  select 4 id, '     ' info from dual
)
SELECT id, REGEXP_REPLACE(TRIM(info), '  *', ' ') AS info_new FROM t
ORDER BY id;

Пример:

        ID INFO_NEW
---------- --------------------------------------------------------------------------------
         1 a s sfd
         2 a b; g;g ;g f
         3 a
         4

Извлечь подстроки используя разделители

17 Март 2010 5 comments

Для того чтобы разбить строку на подстроки, используя разделитель «;», можно воспользоваться следующим запросом.
Разделитель, конечно, может быть разный.

SQL> SELECT regexp_substr(str, '[^;]+', 1, level) str
  2  FROM (
  3        SELECT ' 1; 2; test1.' str FROM dual     ) t
  4  CONNECT BY instr(str, ';', 1, level - 1) > 0
  5  ;

STR
-------------
 1
 2
 test1.

Если хотим разбить на слова используя в виде разделителя пробел, то можно использовать perl синтаксис:

SQL> SELECT regexp_substr(str, '\S+', 1, level) str
  2  FROM (
  3        SELECT ' 1 2 test1.' str FROM dual     ) t
  4  connect by regexp_substr(str,'\S+',1,level) is not null
  5  ;

STR
-----------
1
2
test1.

Другие примеры…

Читать дальше про “Извлечь подстроки используя разделители” »

Сбор статистики

17 Март 2010 1 комментарий

Для сбора статистики используем процедуру

dbms_stats.gather_table_stats('SCOTT','EMP');

Если в базе данных имеются таблицы, которые часто обновляются, то частый сбор статистики может негативно повлиять на производительность базы данных. Для того, чтоб исключить объекты из автоматического или любого другого сбора статистики можно «закрепить» ее статистику:

begin
  dbms_stats.gather_table_stats('SCOTT','EMP');
  dbms_stats.lock_table_stats('SCOTT','EMP');
end;

Теперь, по этой таблице невозможно будет собрать статистику ни автоматически, ни вручную:

SQL>exec dbms_stats.gather_table_stats('SCOTT','EMP');

begin dbms_stats.gather_table_stats('SCOTT','EMP'); end;
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 13182
ORA-06512: at "SYS.DBMS_STATS", line 13202
ORA-06512: at line 2

Снять блокировку статистики:

dbms_stats.unlock_table_stats('SCOTT','EMP');



Посмотреть данные о сборе статистики можно в таблице DBA_TAB_STATISTICS

select * from DBA_TAB_STATISTICS t where t.table_name = :name_table


Собрать статистику для индекса

begin
  dbms_stats.gather_index_stats('OWNER', 'INDEX_NAME');
end;

Статистика на секцию

begin
  dbms_stats.gather_table_stats(ownname => p_owner, tabname => p_table_name, partname => p_partition_name, degree=> 4, no_invalidate=>true );
end;
Categories: SQL Tags: ,

Узнать является ли строка числом

17 Март 2010 3 comments

Запрос для вывода только числовых значений, используем REGEXP.

При необходимости, оставляем только точку или запятую ‘^-?[[:digit:].]*$‘ или ‘^-?[[:digit:],]*$‘.
Или только целые числа ‘^-?[[:digit:]]*$

with t as (
  select '56456456' str from dual
  union all
  select '4 5' str from dual
  union all
  select 'sds5' str from dual
  union all
  select '-1,5' str from dual  
  union all
  select '-1.5' str from dual  
  )
  select * FROM t 
	where regexp_like(str, '^-?[[:digit:].,]*$');

STR
--------
56456456
-1,5
-1.5

Ну и более простой вариант, который тоже подходит в некоторых случаях:

select case when length(TRIM(TRANSLATE('45', ' 0123456789', ' '))) is null then 'ЧИСЛО'
            else 'СТРОКА'
       end res from dual
union all
select case when length(TRIM(TRANSLATE('a4', ' 0123456789', ' '))) is null then 'ЧИСЛО'
            else 'СТРОКА'
       end res from dual

Вывести строки, которые начинаются на цифру

with t as (
  select '56456456' str from dual
  union all
  select '4 5' str from dual
  union all
  select 'sds5' str from dual
  union all
  select '-1,5' str from dual  
  union all
  select '-1.5' str from dual  
  )
  select * FROM t 
	where regexp_like(str, '^\d');

STR
--------
56456456
4 5