Просмотр лога и xml для concurrent`а

Для удобного доступа к логу и xml канкарента, можно использовать следующий запрос

SELECT get_log_bfile('l' || x.request_id || '.req') as log_date,
       get_xml_bfile('o' || x.request_id || '.out') as xml_date
FROM fnd_concurrent_requests x
WHERE x.request_id = :p_request_id

Но перед его использованием следует создать директории для доступа к файлам:

create or replace directory CUNCURRENT_XML
 as '/oracle/NAME_INSTANCE/inst/apps/NAME/logs/appl/conc/out';
create or replace directory CUNCURRENT_LOG
 as '/oracle/NAME_INSTANCE/inst/apps/NAME/logs/appl/conc/log';


и сами функции

create or replace function get_log_bfile(p_filename in varchar2) 
 return bfile as
l_bfile bfile := bfilename('CUNCURRENT_LOG',p_filename);
begin
    return l_bfile;
end;
/
create or replace function get_xml_bfile(p_filename in varchar2 ) 
 return bfile as
  l_bfile bfile := bfilename('CUNCURRENT_XML',p_filename);
begin
    return l_bfile;
end;
/

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

31 Март 2010 31 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: ,

Вывод сообщения в лог (для concurrent)

24 Март 2010 2 comments
-- Вывод сообщения в лог
procedure output_log_data(p_log_str in varchar2) is
    g_output_dbms    number := 1; -- Вывод сообщений в dbms_output.put_line
    g_output_oebs    number := 2; -- Вывод сообщений в fnd_file.put_line
    v_output_current number := g_output_oebs;
begin
    if fnd_global.conc_request_id = -1 then
      v_output_current := g_output_dbms;
    end if;
    if v_output_current = g_output_dbms then
      dbms_output.put_line(p_log_str);
    elsif v_output_current = g_output_oebs then
    --fnd_file.put_line(fnd_file.output, p_log_str); --Строка выводится в "Просмотр Результатов"
      fnd_file.put_line(fnd_file.log, p_log_str); --Строка выводится в "Просмотр Журнала"
    end if;
end output_log_data;

OAF Standard CSS Introduction

19 Март 2010 2 comments

OraDataNumber

Пример отображения стиля

OraPromptText

Пример отображения стиля

Читать дальше про “OAF Standard CSS Introduction” »

Categories: OA Framework 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

Создание пользователя

declare
  l_user_id number;

  l_responsibility_key fnd_responsibility.responsibility_key%TYPE
         := 'SYSTEM_ADMINISTRATOR';
  l_application_short_name fnd_application.application_short_name%TYPE
         := 'SYSADMIN';

  l_responsibility_id   number;
  l_application_id      number;
  l_responsibility_name varchar2(200) := 'System Administrator';
  l_security_group_id number := 0;
begin
  l_user_id := fnd_user_pkg.CreateUserId(
      x_user_name            => 'TEST'
    , x_owner                => 'CUST'
    , x_unencrypted_password => '123456'
  );
select application_id into l_application_id
from fnd_application
where application_short_name = l_application_short_name;

select responsibility_id into l_responsibility_id
from fnd_responsibility
where application_id     = l_application_id
and responsibility_key = l_responsibility_key;

  fnd_user_resp_groups_api.insert_assignment(
    user_id                         => l_user_id
    , responsibility_id             => l_responsibility_id
    , responsibility_application_id => l_application_id
    , security_group_id             => l_security_group_id
    , start_date                    => trunc(sysdate)
    , end_date                      => NULL
    , description                   => l_responsibility_name
    );

  fnd_wf_engine.default_event_raise(
     'oracle.apps.fnd.security.user.assignment.change'
     , l_user_id || ':' || l_responsibility_id
     );

  fnd_wf_engine.propagate_user_role(
'FND_USR'
    , l_user_id
    , 'FND_RESP' || l_application_id
    , l_responsibility_id
    , trunc(sysdate)
    , NULL
  );

  -- Added for Function Security Cache Invalidation Project
  fnd_function_security_cache.insert_user_resp(
      l_user_id
    , l_responsibility_id
    , l_application_id
    );
commit;
end;

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

17 Март 2010 6 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 7 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: ,