вторник, 27 января 2015 г.

Кодировка в sqlplus

При запуске утилиты sqlplus в коммандной строке имеется проблема с кодировкой.



Для того чтобы русские символы отображались читабельно, необходимо определить переменную окружения NLS_LANG. В командной стркое это делается так:

set NLS_LANG=russian_cis.ru8pc866

В итоге получаем читаемые русские символы


Чтобы не производить эту операцию при каждом запуске sqlplus, необходимов добавить в реестр следующие записи:

hkey_local_machine/software/oracle/nls_lang=RUSSIAN_CIS.CL8MSWIN1251
hkey_local_machine/software/oracle/home/nls_lang=RUSSIAN_CIS.CL8MSWIN1251



Начало и конец месяца в oracle sql

Запрос для поиска начала и окончания текущего периода

 
  select   sysdate
        ,trunc(sysdate,'MM') per_beg
        ,trunc (last_day (sysdate)) + 1 - 1/24/59/59 per_end
  from   dual


Объясню что обозначают цифры которые прибавляются к дате. Это зделано для того, чтобы получить время - 23:59:59.Как известно, в oracle прибавляемое к дате число считается за количество дней. Мы прибавляем к дате один день и вычитаем число, равно одной секунде. Для того чтобы вычислить секунду мы 1 день делим на 24 часа, потом делим на 59 минут, и в заключении делим на 59 секунд.

воскресенье, 18 января 2015 г.

Установка языка сессии oracle

Для просмотра параметов сессии необходимо выполнить запрос к таблице  nls_session_parameters. В данном случае нас интересует параметр языка сессии.
 Выполним следующий запрос для того чтобы узнать параметр языка:

select   value
  from   nls_session_parameters
 where   parameter = 'NLS_LANGUAGE'


Затем при помощи пакета DBMS_SESSION устанавливаем требуемый нам язык. (в данном примере русский)
CALL DBMS_SESSION.set_nls ('NLS_LANGUAGE', 'RUSSIAN');

пятница, 16 января 2015 г.

regexp_replace. заменяем текст по маске


with tbl as (select 'select c001, TO_CHAR(c002) from dual' s from dual)
select s, regexp_replace(s,'[c]{1}[[:digit:]]{3}','NULL') from tbl


Из записи можем наблюдать, что существует текст который имеет переменные C001, C002 и.т.д. Переменных может быть 999 соответственно. Заменим их на NULL

regexp_substr. Ищем имя периода прописью


with tbl as (select 'Статистика по Scala : C123U за  Ноябрь 2014 года' s from dual)
         select s, regexp_substr(s,'[[:alpha:]]{1,10}[[:space:]]{1,10}[2010-2040]{4}') from tbl

regexp_instr. Ищем цифру в строке начиная с десятого знака

    with tbl as  (select 'as1234 a5 asasa67 asasasas890' full_number from dual)  
    select regexp_instr(full_number,'[[:digit:]]',10,1) num from tbl


Без комментариев :)

regexp_replace. Заменяем много пробелов одним

with t as (select   'Ноябрь        2014  ' dt from dual)
select   dt, regexp_replace (trim (dt), '  *', ' ')  from   t

понедельник, 12 января 2015 г.

Экранирование спецсимволов в строке VARCHAR

При использовании запросов в духе
select 'Компания 'Клаус'' from dual
мы получим ошибку:
ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось
Это вполне логично, текст представляется командному процессору в виде двух строк типа VARCHAR2: строки 'Компания ' и пустой строки ''. При этом слово Клаус командный процессор воспримет как команду, а не как текст, что и приведет к ошибке.
Для избежания подобных ошибок спецсимволы необходимо экранировать, чтобы командный процессор воспринимал их как текст.
для экранирования используем q.
select q'(Компания 'Клаус')' from dual

При экранировании конкретно одинарных кавычек еще можно использовать две одинарных кавычки подряд:
select 'Компания ''Клаус''' from dual

Результирующий текст в обоих случаях будет Компания 'Клаус'