Workflow: Ошибка при попытке коннекта к базе (1300)

7 Сентябрь 2010 Нет комментариев

symptom: Error when loading workflow from the database
symptom: 1300: Could not load.
symptom: 1114: Could not load from database.
symptom: 1101: Could not load item types from database. FILTER=%
symptom: 333: Could not set item type properties for ‘FNDCMSTD’.
symptom: 333: Could not set item type properties for ‘FNDCMSTD’.
symptom: 306: Invalid display name ‘Hintergrundmanager — Funktionen ‘.
symptom: 203:Value contains leading or trailing spaces
symptom: Trailing spaces exist in table WF_ITEM_TYPES_TL

Решение

1) Проверить таблицу WF_ITEM_TYPES_TL на существование замыкающих пробелов в столцах DISPLAY_NAME и DESCRIPTION
2) Если пробелы присутствуют выполнить update

   update WF_ITEM_TYPES_TL
   set DISPLAY_NAME = RTRIM(DISPLAY_NAME);

   update WF_ITEM_TYPES_TL
   set DESCRIPTION = RTRIM(DESCRIPTION);

Функция PERCENTILE_DISC

3 Сентябрь 2010 Нет комментариев

Функция принимает на вход процентное значение (P) и условие сортировки, возвращает элемент из набора — наименьшее значение функции CUME_DIST, которое больше или равно значению P.

PERCENTILE_DISC(expr) WITHIN GROUP
   (ORDER BY expr [ DESC | ASC ])
   [ OVER (query_partition_clause) ]

Пример

with t as
(select 1 id, 10 val  from dual
  union all
 select 2 id, 20 val  from dual
  union all
 select 3 id, 30 val  from dual
  union all
 select 4 id, 50 val  from dual
  union all
 select 5 id, 70 val  from dual
)
select  id,
        val,
        cume_dist() over (order by val) "Cume_Dist",
        percentile_disc(0.50) within group (order by val) over() "percentile_disc"
from t
order by val;

        ID        VAL  Cume_Dist percentile_disc
---------- ---------- ---------- ---------------
         1         10        0,2              30
         2         20        0,4              30
         3         30        0,6              30
         4         50        0,8              30
         5         70          1              30
Categories: SQL Tags: ,

Функция CUME_DIST

3 Сентябрь 2010 Нет комментариев

Аналитический вариант

CUME_DIST( ) OVER ( [ query_partition_clause ] order_by_clause )

Функция CUME_DIST рассчитывает кумулятивное распределение значения в наборе данных. Возвращаемое значение находится в диапазоне от 0 до 1. Функция на вход принимает числовой тип данных, или тип данных, который может неявно преобразовать в числовой.

Читать дальше про “Функция CUME_DIST” »

Определение строк со смешанными языками (русские и английские буквы)

2 Сентябрь 2010 Нет комментариев

Вытаскиваем записи, у которых есть хотя бы одна нерусская буква

with t as
(
 select 1 id, 'Сидоров' s from dual
  union all
 select 2, 'Cидoров' from dual
  union all
 select 3, 'Пирогов' from dual
)
select * from t t0
where soundex(t0.s) is not null;

        ID S
---------- -------
         2 Cидoров

Предположительные совпадения (Пирогов добавлен для показательности неточности подхода)

with t as
(
 select 1 id, 'Сидоров' s from dual
  union all
 select 2, 'Cидoров' from dual
  union all
 select 3, 'Пирогов' from dual
)
select * from t t0, t t1
where UTL_MATCH.JARO_WINKLER_SIMILARITY(t0.s,t1.s)>=70
      and soundex(t0.s) is null
      and soundex(t1.s) is not null
      and t0.id<>t1.id;

        ID S               ID S
---------- ------- ---------- -------
         1 Сидоров          2 Cидoров
         3 Пирогов          2 Cидoров

Простой translate для вытаскивания совпадающих написаний

with t as
(
 select 1 id, 'Сидоров' s from dual
  union all
 select 2, 'Cидoров' from dual
  union all
 select 3, 'Пирогов' from dual
)
select * from t t0, t t1
where translate(t1.s,'AaBbCcEegHKkMmOoPpTuXxy','АаВьСсЕедНКкМтОоРрТиХху')=t0.s
      and t0.id<>t1.id;

        ID S               ID S
---------- ------- ---------- -------
         1 Сидоров          2 Cидoров

Вывести данные в одном языке (латиница или кирилица) + цифры и знак подчёрка:

with t as
(
 select 'Сидоров' val from dual
  union all
 select 'Cидoров' from dual
  union all
 select 'Пирогов' from dual
  union all
 select 'ASD_1' from dual 
  union all
 select 'ASD_1Я' from dual  
)
select val from t
where regexp_like(val, '^([A-z]|[0-9]|_)+$') or regexp_like(val, '^([А-я]|[0-9]|_)+$')
/

VAL
-------
Сидоров
Пирогов
ASD_1

Объединение интервалов дат

31 Август 2010 Нет комментариев
with t as (
select to_date ('01.01.2009', 'dd.mm.yyyy') beg_date,
       to_date ('10.01.2009', 'dd.mm.yyyy') end_date
 from dual
union all
select to_date ('03.01.2009', 'dd.mm.yyyy') beg_date,
       to_date ('05.01.2009', 'dd.mm.yyyy') end_date
 from dual
union all
select to_date ('10.01.2009', 'dd.mm.yyyy') beg_date,
       to_date ('12.01.2009', 'dd.mm.yyyy') end_date
 from dual
union all
select to_date ('13.01.2009', 'dd.mm.yyyy') beg_date,
       to_date ('20.01.2009', 'dd.mm.yyyy') end_date
 from dual
union all
select to_date ('01.02.2009', 'dd.mm.yyyy') beg_date,
       to_date ('10.02.2009', 'dd.mm.yyyy') end_date
 from dual
)
--
select min (beg_date) as beg_date,
       max (end_date) as end_date
from (
      select beg_date,
             end_date,
             sum(strt_grp) over (order by beg_date, end_date ) grp_num
      from (
             select  beg_date,
                     end_date,
                     case when beg_date > 1 + max(end_date) over (order by beg_date, end_date rows between unbounded preceding and 1 preceding) then 1 end strt_grp
             from t
           )
     )
group by grp_num
order by beg_date;

BEG_DATE    END_DATE
----------- -----------
01-01-2009  20-01-2009
01-02-2009  10-02-2009

Процедура SLEEP

30 Август 2010 Нет комментариев

Процедура SLEEP останавливает процесс на указанное время.

DBMS_LOCK.SLEEP(seconds  IN NUMBER);

где seconds — время в секундах (и долей секунд) на которое надо остановить процесс.

Categories: SQL Tags: , ,

Модуль ONT — Связь в заказах между складской и операционной организацией

18 Август 2010 Нет комментариев
select h.order_number,
       -- операционная единица
       h.org_id                 as operate_org_id,
       -- складская организация
       pla.organization_id      as inventory_org_id,
       l.header_id,
       l.line_id,
       l.ordered_quantity       as qty,
       l.request_date
       --
  from oe_order_headers_all         h,
       oe_order_lines_all           l,
       po_location_associations_all pla,
       mtl_system_items_b           msi
 where 1=1
       and h.header_id = l.header_id
       and h.sold_to_org_id = pla.customer_id
       -- msi
       and msi.inventory_item_id  = l.inventory_item_id
       and msi.organization_id    = pla.organization_id;

Создание URL для доступа к форме OEBS

16 Август 2010 2 comments

Используем стандартный API для генерации URL

declare
  url varchar2(32767);
begin
  url:= fnd_run_function.get_run_function_url (
             p_function_id       =>1043600,
             p_resp_appl_id      =>-1,
             p_resp_id           =>-1,
             p_security_group_id =>0,
             p_parameters        =>'TEST_ID=182'||' '||'TEST_ID2=548',
             p_encryptParameters =>true ) ;
  dbms_output.put_line(url);
end;

В результате получаем URL:

http://<host>:<port>/OA_HTML/RF.jsp?function_id=<function_id_or_name>
http://.../OA_HTML/RF.jsp?function_id=1043600&resp_id=-1&resp_appl_id=-1&security_group_id=0&lang_code=RU&params=QU2-OJtLRJHeJif-a9I4tPUdx3zMf-CX4yR8feCtDVM

Регистрация приложения

1 Создать структуру каталогов
2 Изменить файл (по умолчанию defaults.env) настроек переменных окружения для сервера форм. Его имя хранится в переменной окружения envFile в файле appsweb.cfg, имя и путь к которому в свою очередь хранятся в переменной окружения  FORMS_WEB_CONFIG_FILE, добавив строку с установкой значения переменной окружения <префикс приложения (ЗАГЛАВНЫМИ)>_TOP. Тем самым будет определён каталог, в котором сервер Oracle Forms сможет найти файлы приложения
3 В файл $APPL_TOP/custom<имя инстанса>.env следует добавить инициализацию тех же переменных с последующим их экспортом (это необходимо для выполнения системных процедур и вызова параллельных запросов) и проверить наличие вызова это файла из $APPL_TOP/APPS<имя инстанса>.env. При наличии в составе приложения исполняемых операционной системой программ также следует добавлять <префикс приложения (ЗАГЛАВНЫМИ)>_TOP/bin к переменной окружения PATH (если используется)
4 Остановить менеджер параллельных программ (concurrent manager)
$ADMIN_SCRIPTS_HOME/adcmctl.sh stop apps/apps
5 Выполнить файл, замещающий APPLSYS.env
. / $APPL_TOP/APPS<имя инстанса>.env
6 Перезапустить concurrent manager
$ADMIN_SCRIPTS_HOME/adcmctl.sh start apps/apps
7 Войдите в систему с полномочиями Разработчик приложений (Application Developer) и зарегистрируйте приложение
8 Войдите в систему с полномочиями System Administrator и добавьте приложение в группу данных (раздел меню «Security : ORACLE», пункт «Группа данных»)

Разбить период на месяца

5 Август 2010 8 comments
with t as (
  select to_date('03-05-2010','dd-mm-yyyy') d1,
         to_date('26-08-2010','dd-mm-yyyy') d2
  from dual
)
--
select decode(level,1,d1,trunc(add_months(d1,level-1),'mm')) as date_from,
       case when add_months(trunc(d1,'mm'),level)>d2 then d2
            else last_day(add_months(d1,level-1))
       end date_to
from t
connect by add_months(trunc(d1,'mm'),level-1) < d2;


DATE_FROM   DATE_TO
----------- -----------
03.05.2010  31.05.2010
01.06.2010  30.06.2010
01.07.2010  31.07.2010
01.08.2010  26.08.2010

Если хотим, чтобы в период входил 1 день последнего месяца, то :

with t as (
  select to_date('03-05-2010','dd-mm-yyyy') d1,
         to_date('01-08-2010','dd-mm-yyyy') d2
  from dual
)
--
select decode(level,1,d1,trunc(add_months(d1,level-1),'mm')) as date_from,
       case when add_months(trunc(d1,'mm'),level)>d2 then d2
            else last_day(add_months(d1,level-1))
       end date_to
from t
connect by add_months(trunc(d1,'mm'),level-1) <= d2;

DATE_FROM   DATE_TO
----------- -----------
03.05.2010  31.05.2010
01.06.2010  30.06.2010
01.07.2010  31.07.2010
01.08.2010  01.08.2010