<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkEDR3w8fCp7ImA9WhRUF0o.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757</id><updated>2012-01-28T19:11:16.274+02:00</updated><category term="processing" /><category term="apex" /><category term="gpg" /><category term="apex 4.0" /><category term="news" /><category term="bug" /><category term="epg" /><category term="built-in" /><category term="ora-00600" /><category term="wtf" /><category term="date" /><category term="enhancement" /><category term="grant" /><category term="upgrade" /><category term="oracle sql developer" /><category term="firefox" /><category term="startup failure" /><category term="link dump" /><category term="оффтоп" /><category term="url syntax" /><category term="link" /><category term="перевод" /><category term="mini" /><category term="greasemonkey" /><category term="xe" /><category term="utility" /><category term="patch" /><category term="show page" /><category term="story" /><category term="idea-dev" /><category term="security" /><category term="not found" /><category term="pl/sql" /><category term="p" /><category term="philosophy" /><category term="multiple operations" /><category term="oracle" /><category term="region" /><category term="consistency" /><category term="jasperreports" /><category term="count click" /><category term="internals" /><category term="qp" /><category term="concepts" /><category term="design" /><category term="fix" /><category term="fun" /><category term="project" /><category term="release" /><category term="syntax highlighter" /><category term="error" /><category term="json" /><category term="challenge" /><category term="javascript" /><category term="16305" /><category term="parsing schema" /><category term="pl/sql challenge" /><category term="pidgin" /><category term="dump" /><category term="tomcat" /><category term="collection" /><category term="new features" /><category term="mview" /><category term="interface" /><category term="blob" /><category term="quick picks" /><category term="plugin" /><category term="download file" /><category term="z" /><category term="script" /><category term="debian" /><category term="longops" /><category term="ora-03113" /><category term="ora-12705" /><category term="off topic" /><category term="404" /><category term="popup key lov" /><category term="monodevelop" /><category term="update" /><category term="atomacity" /><category term="repository" /><category term="diagnostic" /><category term="linux" /><category term="debug" /><category term="data modeler" /><category term="hack" /><category term="translation" /><category term="ajax" /><category term="howto" /><category term="note" /><category term="oracle apex" /><category term="deb" /><category term="blog" /><category term="quiz" /><category term="tip" /><category term="xorg" /><category term="source" /><category term="htmldb_get" /><category term="file browse" /><category term="trick" /><category term="xfce" /><category term="article" /><category term="f" /><category term="fail" /><category term="mono" /><category term="hotkeys" /><title>PPLab</title><subtitle type="html">&lt;i&gt;Здесь я пишу об Oracle DB, Oracle APEX, Linux и обо всём по чуть-чуть. Иногда интересно.&lt;/i&gt;

&lt;b&gt;suPPLer&lt;/b&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://suppler.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/DNhs" /><feedburner:info uri="blogspot/dnhs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0MEQ3s8eSp7ImA9WhRUFU8.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-7111794710634285880</id><published>2012-01-18T01:02:00.000+02:00</published><updated>2012-01-26T00:10:02.571+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T00:10:02.571+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="xfce" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle sql developer" /><category scheme="http://www.blogger.com/atom/ns#" term="xorg" /><category scheme="http://www.blogger.com/atom/ns#" term="hotkeys" /><title>Oracle SQL Developer: проблема с горячими клавишами</title><content type="html">&lt;b&gt;Предыстория:&lt;/b&gt; Не так давно обновил Debian на домашней машине до testing, из-за чего встретился с Gnome 3. Если бы у меня был планшет, наверно, всё было по-другому, однако для настольных ПК это DE недружелюбно. Итогом встречи стал переход на XFCE 4.8, который устроил практически всем. Но...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Проблема:&lt;/b&gt; Oracle SQL Developer отказался распознавать текстовые символы с включёнными модификаторами &lt;tt&gt;Alt&lt;/tt&gt;, &lt;tt&gt;Ctrl&lt;/tt&gt; и любыми их комбинациями. То есть, о горячих клавишах можно было забыть.&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;b&gt;Причина:&lt;/b&gt; Разброд и шатание в настройках клавиатуры.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ход мыслей:&lt;/b&gt; Поначалу я подумал на баги очередного EA, как раз обновил Oracle SQL Developer. Но откат на стабильную версию и удаление настроек (с созданием резервной копии, конечно) ситуацию не изменили. Пришлось внимательнее почитать Сеть. Несколько тем с похожими проблемами натолкнули на мысль, что что-то не так с настройками клавиатуры. И я начал читать про раскладки, X.org, XFCE, udev, evdev и грабли, на которые уже наткнулось прогрессивное человечество.&lt;br /&gt;
&lt;br /&gt;
Развитие X.org server, вначале отказавшегося от хранения настроек в &lt;tt&gt;xorg.conf&lt;/tt&gt; в пользу HAL, а затем — и от HAL в пользу udev, evdev и задания настроек несколькими файлами через &lt;tt&gt;/etc/X11/xorg.conf.d&lt;/tt&gt;, вынудило меня убрать развёвшийся в &lt;tt&gt;xorg.conf&lt;/tt&gt; бардак. Я убрал секции &lt;tt&gt;InputDevice&lt;/tt&gt; для мышки и клавиатуры, убрал ссылки на них в секции &lt;tt&gt;ServerLayout&lt;/tt&gt;. Cоздал файл &lt;tt&gt;/etc/X11/xorg.conf.d/99-keyboard.conf&lt;/tt&gt;, который задаёт для класса устройств типа Keyboard со строкой keyboard в названии драйвер, модель, раскладки и опции:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:text"&gt;Section "InputClass"
  Identifier "evdev keyboard catchall"
  MatchIsKeyboard "on"
  MatchDevicePath "/dev/input/event*"
  MatchProduct "keyboard"
  Driver "evdev"
  Option "XkbModel" "logicd"
  Option "XkbRules" "xorg"
  Option "XkbLayout" "us,ru"
  Option "XkbVariant" ",winkeys"
  Option "XkbOptions" "grp:caps_toggle,compose:rwin,terminate:ctrl_alt_bksp"
EndSection&lt;/pre&gt;&lt;br /&gt;
Также, перезагружая иксы и проглядывая раз за разом &lt;tt&gt;/var/log/Xorg.0.log&lt;/tt&gt;, я удалил не поддерживаемые расширения и модули, ненужные видеорежимы и прочий мусор. В &lt;tt&gt;/etc/default/keyboard&lt;/tt&gt; были внесены те же правила для клавиатуры. Однако &lt;tt&gt;setxkbmap -print -verbose 10&lt;/tt&gt; показывал совсем не то. Оказалось, что &lt;tt&gt;xfce4-xkb-plugin&lt;/tt&gt; отчего-то переопределяет системные настройки, не смотря на соответствующую опцию. За что и был заменён на &lt;tt&gt;xxkb&lt;/tt&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Итог:&lt;/b&gt; Oracle SQL Developer снова работает с горячими клавишами, в настройке устройств ввода наведён небольшой порядок, место индикатора раскладок занял &lt;tt&gt;xxkb&lt;/tt&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-7111794710634285880?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/cYPFwLf4ATo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/7111794710634285880/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2012/01/oracle-sql-developer.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7111794710634285880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7111794710634285880?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/cYPFwLf4ATo/oracle-sql-developer.html" title="Oracle SQL Developer: проблема с горячими клавишами" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2012/01/oracle-sql-developer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMDR3k_fyp7ImA9WhRWE0k.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-2040403971634801577</id><published>2011-12-31T18:20:00.004+02:00</published><updated>2011-12-31T18:21:16.747+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T18:21:16.747+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="оффтоп" /><title>НГ-2012</title><content type="html">Желаю в наступающем Новом году счастья, здоровья, достаточно воображения для задумок и достаточно сил для их воплощения!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-2040403971634801577?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/te6-4g2o7Tg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/2040403971634801577/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/12/2012.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2040403971634801577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2040403971634801577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/te6-4g2o7Tg/2012.html" title="НГ-2012" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/12/2012.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcNSH4_fSp7ImA9WhdbFEk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-7616121108264355192</id><published>2011-10-12T22:18:00.001+03:00</published><updated>2011-10-12T22:18:19.045+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T22:18:19.045+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="startup failure" /><category scheme="http://www.blogger.com/atom/ns#" term="ora-03113" /><category scheme="http://www.blogger.com/atom/ns#" term="16305" /><category scheme="http://www.blogger.com/atom/ns#" term="ora-00600" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle: ORA-00600 [16305] + ORA-03113 при открытии БД</title><content type="html">Обновил в очередной раз Debian на своей домашней машине, запускаю экземпляр Oracle - и что я вижу? ORA-03113 в консоли + ORA-00600 [16305] в alert.log. Порыскав немного по OTN Forums и MOS и попутно заглядывая в трассу PMON, наткнулся на Doc ID &lt;a href="https://supporthtml.oracle.com/ep/faces/secure/km/DocumentDisplay.jspx?id=466056.1&amp;h=Y"&gt;466056.1&lt;/a&gt;. Проверяя кэйс, выполнил &lt;b&gt;ifconfig&lt;/b&gt; - а в выводе нет работающего loopback-интерфейса. В общем, для решения проблемы было достаточно его поднять:
&lt;pre class="brush:bash"&gt;sudo ifup lo&lt;/pre&gt;
И можно смело запускать экземпляр.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-7616121108264355192?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/L7vQtUWel10" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/7616121108264355192/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/10/oracle-ora-00600-16305-ora-03113.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7616121108264355192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7616121108264355192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/L7vQtUWel10/oracle-ora-00600-16305-ora-03113.html" title="Oracle: ORA-00600 [16305] + ORA-03113 при открытии БД" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/10/oracle-ora-00600-16305-ora-03113.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYDQ3o_eSp7ImA9WhdbFEk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-2480680142079329169</id><published>2011-10-12T21:59:00.000+03:00</published><updated>2011-10-12T22:19:32.441+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T22:19:32.441+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="longops" /><category scheme="http://www.blogger.com/atom/ns#" term="multiple operations" /><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle: V$SESSION_LONGOPS и несколько одновременных длинных операций</title><content type="html">Для того, чтобы отразить в &lt;b&gt;V$SESSION_LONGOPS&lt;/b&gt; состояние нескольких одновременных длительных операций - например, общее выполнение процесса и конкретный большой шаг - нужно сохранять значение параметра &lt;b&gt;slno&lt;/b&gt; процедуры &lt;b&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e25788/d_appinf.htm#i996999"&gt;DBMS_APPLICATION_INFO.set_session_longops&lt;/a&gt;&lt;/b&gt;. Используя затем пару значений (&lt;b&gt;rindex&lt;/b&gt;,&lt;b&gt;slno&lt;/b&gt;), можно менять необходимую строку в &lt;b&gt;V$SESSION_LONGOPS&lt;/b&gt;.

Вот пример работы с двумя длительными операциями:

&lt;pre class="brush:sql"&gt;declare
  first_row pls_integer := dbms_application_info.set_session_longops_nohint;
  second_row pls_integer := dbms_application_info.set_session_longops_nohint;
  slno1 pls_integer;
  slno2 pls_integer;
begin
  dbms_application_info.set_session_longops(rindex =&gt; first_row
                                            ,slno =&gt; slno1
                                            ,op_name =&gt; '1_op'
                                            ,sofar =&gt; 1
                                            ,totalwork =&gt; 2
                                            ,units =&gt; 'step'
                                           );
  dbms_application_info.set_session_longops(rindex =&gt; second_row
                                            ,slno =&gt; slno2
                                            ,op_name =&gt; '2_op'
                                            ,sofar =&gt; 1
                                            ,totalwork =&gt; 1
                                            ,units =&gt; 'step'
                                           );
  dbms_application_info.set_session_longops(rindex =&gt; first_row
                                            ,slno =&gt; slno1
                                            ,op_name =&gt; '1_op'
                                            ,sofar =&gt; 2
                                            ,totalwork =&gt; 2
                                            ,units =&gt; 'step'
                                           );
 
end;
/

select MESSAGE from v$session_longops where (sid,serial#) =
(select sid,serial# from v$session where audsid = USERENV('SESSIONID'));&lt;/pre&gt;

Тема на &lt;b&gt;SQL.RU&lt;/b&gt;: &lt;a href="http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&amp;tid=872856&amp;msg=11108962"&gt;set_session_longops Можно ли вернуться к предидущей строке?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-2480680142079329169?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/4_TV3TSMvaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/2480680142079329169/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/10/oracle-vsessionlongops.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2480680142079329169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2480680142079329169?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/4_TV3TSMvaE/oracle-vsessionlongops.html" title="Oracle: V$SESSION_LONGOPS и несколько одновременных длинных операций" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/10/oracle-vsessionlongops.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYFQ34-eSp7ImA9WhdRFUk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-4863830513842862882</id><published>2011-08-05T12:22:00.005+03:00</published><updated>2011-08-05T14:18:32.051+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-05T14:18:32.051+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="count click" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="url syntax" /><category scheme="http://www.blogger.com/atom/ns#" term="z" /><category scheme="http://www.blogger.com/atom/ns#" term="built-in" /><title>Oracle APEX: Процедуры в URL - Z</title><content type="html">Последняя из "маленьких" встроенных процедур APEX, которые можно использовать в URL: &lt;b&gt;Z&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;Эта процедура используется для подсчёта кликов по ссылкам. Обёрткой вокруг неё является &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/apirefs.40/e15519/apex_util.htm#CHDBHDFF"&gt;&lt;b&gt;APEX_UTIL.COUNT_CLICK&lt;/b&gt;&lt;/a&gt;, поэтому можно смело ориентироваться на документацию, меняя в примерах &lt;b&gt;APEX_UTIL.COUNT_CLICK&lt;/b&gt; на &lt;b&gt;Z&lt;/b&gt;. У &lt;b&gt;Z&lt;/b&gt; есть следующие параметры:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;p_url&lt;/b&gt; — URL, к которому необходимо перейти.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_cat&lt;/b&gt; — категория, к которой Z причисляет клик. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_id&lt;/b&gt; — вторичный &lt;i&gt;числовой&lt;/i&gt; идентификатор клика. ID приложения, номер страницы — всё то, что поможет Вам в дальнейшем выделить именно эти клики из остальных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_user&lt;/b&gt; — пользователь, который сделал клик.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_company&lt;/b&gt;, &lt;b&gt;p_workspace&lt;/b&gt; — ID рабочего пространства. Если &lt;b&gt;p_company&lt;/b&gt; пустое, то используется &lt;b&gt;p_workspace&lt;/b&gt;. Если оба эти параметра пустые, то &lt;b&gt;Z&lt;/b&gt; не сохраняет информацию о клике, а просто перенаправляет на &lt;b&gt;p_url&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Пример URL с этой процедурой: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:plain"&gt;z?p_url=w3.org&amp;p_cat=w3c&amp;p_company=&amp;WORKSPACE_ID.&lt;/pre&gt;&lt;br /&gt;
Информацию, собранную &lt;b&gt;Z&lt;/b&gt;, можно просмотреть в представлении APEX_WORKSPACE_CLICKS. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сообщения по теме: &lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/07/oracle-apex-url-f.html"&gt;Oracle APEX: Процедуры в URL - F&lt;/a&gt; &lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/08/oracle-apex-url-p.html"&gt;Oracle APEX: Процедуры в URL - P&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-4863830513842862882?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/8hcJlGo9oyY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/4863830513842862882/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/08/oracle-apex-url-z.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/4863830513842862882?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/4863830513842862882?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/8hcJlGo9oyY/oracle-apex-url-z.html" title="Oracle APEX: Процедуры в URL - Z" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/08/oracle-apex-url-z.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDQHs4cCp7ImA9WhdRFUk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-2777181510049747869</id><published>2011-08-04T02:05:00.007+03:00</published><updated>2011-08-05T14:17:51.538+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-05T14:17:51.538+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="url syntax" /><category scheme="http://www.blogger.com/atom/ns#" term="built-in" /><category scheme="http://www.blogger.com/atom/ns#" term="download file" /><category scheme="http://www.blogger.com/atom/ns#" term="p" /><title>Oracle APEX: Процедуры в URL - P</title><content type="html">Ещё одна используемая при создании URL процедура: &lt;b&gt;P&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;Она не завраплена, так что её код можно легко увидеть:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;create or replace
procedure p (
    n       in varchar2 default null,
    p_mime_type in varchar2 default null,
    p_inline    in varchar2 default 'NO')

-- Copyright (c) Oracle Corporation 2001. All Rights Reserved.
--
--    DESCRIPTION
--      View a page given a page ID
--
--    SECURITY
--      Public shortcut
--
--    NOTES
--
--    EXAMPLES:
--

is
begin
     if n is null then
         htp.p(wwv_flow_lang.system_message('p.valid_page_err'));
         return;
     end if;
     --
     wwv_flow_file_mgr.get_file (
        p_id =&gt; n,
        p_mime_type =&gt; p_mime_type,
        p_inline =&gt; p_inline);
end p;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;P&lt;/b&gt; используется, чтобы скачать загруженные файлы, которые можно найти в представлении &lt;b&gt;APEX_APPLICATION_FILES&lt;/b&gt; (aka &lt;b&gt;WWV_FLOW_FILES&lt;/b&gt;, построено на таблице &lt;b&gt;FLOW_FILES.WWV_FLOW_FILE_OBJECTS$&lt;/b&gt;). У этой процедуры не так много параметров:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;n&lt;/b&gt; — ID файла, который необходимо скачать.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_mime_type&lt;/b&gt; — устаревший параметр для указания MIME-типа файла. Сейчас информация берётся из соответствующих столбцов записи в &lt;b&gt;APEX_APPLICATION_FILES&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p_inline&lt;/b&gt; — &lt;i&gt;NO&lt;/i&gt;, чтобы предложить пользователю скачать файл; &lt;i&gt;YES&lt;/i&gt;, чтобы браузер отобразил его.&lt;/li&gt;
&lt;/ul&gt;Пример относительного URL для скачивания файла с ID=1234567891011:  &lt;pre class="brush:plain"&gt;p?n=123456789101112&amp;p_inline=NO&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Сообщения по теме:&lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/07/oracle-apex-url-f.html"&gt;Oracle APEX: Процедуры в URL - F&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/08/oracle-apex-url-z.html"&gt;Oracle APEX: Процедуры в URL - Z&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-2777181510049747869?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/OGTx-WNqzY0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/2777181510049747869/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/08/oracle-apex-url-p.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2777181510049747869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2777181510049747869?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/OGTx-WNqzY0/oracle-apex-url-p.html" title="Oracle APEX: Процедуры в URL - P" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/08/oracle-apex-url-p.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUHSH87cCp7ImA9WhdRFUk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-6896348555658353130</id><published>2011-07-20T08:51:00.009+03:00</published><updated>2011-08-05T14:20:39.108+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-05T14:20:39.108+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="f" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="url syntax" /><category scheme="http://www.blogger.com/atom/ns#" term="show page" /><category scheme="http://www.blogger.com/atom/ns#" term="built-in" /><title>Oracle APEX: Процедуры в URL - F</title><content type="html">В APEX переход по страницам приложения - это обращение к процедурам. И одной из самых используемых процедур является &lt;b&gt;F&lt;/b&gt;. &lt;span class="fullpost"&gt;Чтобы увидеть её, можно просто почаще смотреть в строку адреса во время работы с APEX. Там обнаружится что-то вроде такого:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:plain"&gt;http://work:8080/apex/f?p=4000:1500:434361572702804:::::&lt;/pre&gt;&lt;br /&gt;
С помощью этой процедуры можно создавать ссылки к различным страницам приложений APEX. Я не буду здесь повторять раздел документации &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/concept.htm#BEIFCDGF"&gt;Oracle® Application Express Application Builder User's Guide: 2 Application Builder Concepts - Understanding URL Syntax&lt;/a&gt;. По крайней мере, ту его часть, которая описывает структуру значений параметра &lt;b&gt;P&lt;/b&gt;. Давайте лучше поговорим о том, что упоминается не так часто.&lt;br /&gt;
&lt;br /&gt;
Итак, &lt;b&gt;F&lt;/b&gt; - это своеобразная обёртка для &lt;b&gt;WWV_FLOW.SHOW&lt;/b&gt; (aka &lt;b&gt;APEX_APPLICATION.FLOW&lt;/b&gt;). В этой процедуре устанавливаются различные глобальные переменные, использующиеся для отображения страницы, параметр P разбирается на составляющие, которые передаются в &lt;b&gt;APEX_APPLICATION.FLOW&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме параметра &lt;b&gt;P&lt;/b&gt; у процедуры &lt;b&gt;F&lt;/b&gt; есть ещё параметры. Часть из них описана в документации, часть можно увидеть в URL при работе с приложениями. Вот неполный список:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;p_sep&lt;/b&gt; - разделитель, который используется, чтобы разбить значение параметра P в PL/SQL-коллекцию.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;p_trace&lt;/b&gt; - если равен "YES", apex_application.show будет создавать трассировочный файл. Подробнее в документации: &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/debug.htm#HTMDB10004"&gt;Enabling SQL Tracing and Using TKPROF&lt;/a&gt;.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;c&lt;/b&gt; - workspace_id или название (workspace) рабочего пространства из apex_workspaces. По значению этого параметра выбирается и устанавливается группа безопасности (aka security group ID). Это понадобится, к примеру, при вызове страниц приложения с тем же псевдонимом в другом рабочем пространстве. Упоминается в документации: &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/concept.htm#BCECAIFD"&gt;Calling a Page Using an Application and Page Alias&lt;/a&gt;.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;cs&lt;/b&gt; - контрольная сумма, которой проверяются значения параметров. Первый символ - тип кинтрольной суммы, остальная строка - собственно контрольная сумма.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;success_msg&lt;/b&gt; - текст для отображения сообщения об успешном выполнении.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;notification_msg&lt;/b&gt; - текст для отображения уведомления.&lt;br /&gt;
&lt;li&gt;&lt;b&gt;tz&lt;/b&gt;, &lt;b&gt;p_lang&lt;/b&gt;, &lt;b&gt;p_territory&lt;/b&gt; - NLS-параметры: временная зона, язык и территория. Значением &lt;b&gt;p_lang&lt;/b&gt; можно менять язык сессии, который используется при переводе приложения с настройкой &lt;i&gt;Application Language Derived From&lt;/i&gt; = &lt;i&gt;Session&lt;/i&gt;. &lt;/ul&gt;
&lt;br /&gt;
Сообщения по теме:  &lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/08/oracle-apex-url-p.html"&gt;Oracle APEX: Процедуры в URL - P&lt;/a&gt;  &lt;br /&gt;
&lt;a href="http://suppler.blogspot.com/2011/08/oracle-apex-url-z.html"&gt;Oracle APEX: Процедуры в URL - Z&lt;/a&gt; &lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-6896348555658353130?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/VKTOZNu_3T4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/6896348555658353130/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/07/oracle-apex-url-f.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6896348555658353130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6896348555658353130?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/VKTOZNu_3T4/oracle-apex-url-f.html" title="Oracle APEX: Процедуры в URL - F" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/07/oracle-apex-url-f.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MMQHc_fCp7ImA9WhdSEU4.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-7678533705680484167</id><published>2011-07-08T02:43:00.002+03:00</published><updated>2011-07-20T07:18:01.944+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-20T07:18:01.944+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="internals" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Oracle APEX: Убить Билла</title><content type="html">Как удалить вручную сессию APEX, если известен её ID? Всё довольно просто. &lt;br /&gt;
&lt;br /&gt;
Для начала подумаем, где должна использоваться возможность удаления сессии. Правильно, там где пользователь завершает сеанс в приложении - смотрим на ссылку &lt;b&gt;LOGOUT_URL&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:plain"&gt;http://localhost:8888/apex/wwv_flow_custom_auth_std.logout?p_this_flow=4000&amp;p_next_flow_page_sess=4550:8:8297564516445573&lt;/pre&gt;&lt;br /&gt;
Нужное нам находится в &lt;b&gt;wwv_flow_custom_auth_std.logout&lt;/b&gt;. Давайте глянем ещё на процесс, который выполняется при принудительном удалении сессий администратором экземпляра APEX. Заходим в &lt;i&gt;Administration-&gt;Application Express Internal Administration&lt;/i&gt;, переходим на &lt;i&gt;Manage Instance-&gt;Session State-&gt;Purge Session, by age&lt;/i&gt;. Это страница &lt;b&gt;66&lt;/b&gt; приложения &lt;b&gt;4050&lt;/b&gt;. Посмотрим, что за процессы выполняются при обработке этой страницы:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql; highlight: [8];"&gt;set long 5000
select process_source 
  from apex_application_page_proc 
 where application_id = 4050 and page_id = 66;

PROCESS_SOURCE
--------------------------------------------------------------------------------
wwv_flow_cache.purge_oldest_sessions (
p_num_sessions_to_purge     =&gt; :P66_MAX_SESSIONS,
p_purge_sess_older_then_hrs =&gt; :P66_AGE * 24);&lt;/pre&gt;&lt;br /&gt;
Ещё одна наводка - пакет &lt;b&gt;wwv_flow_cache&lt;/b&gt; с множеством процедур &lt;b&gt;purge_%&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Произведя ритуал Unwrap над этими пакетами, можно увидеть, что удаляется сессия APEX с идентификатором :p_id довольно просто:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;delete apex_040000.wwv_flow_sessions$ where id = :p_id;&lt;/pre&gt;&lt;br /&gt;
Всё, остальные изыски из этих процедур вроде подсчёта удалённых сессий, переноса их в wwv_flow_purged_sessions$ и изменения значения в печеньке на -1 нам не нужны. &lt;br /&gt;
&lt;br /&gt;
Убить &lt;s&gt;Билла&lt;/s&gt; сессию APEX - проще простого. Была бы лицензия на убийство в виде соответствующей привилегии на таблицу &lt;b&gt;apex_040000.wwv_flow_sessions$&lt;/b&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-7678533705680484167?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/vwapcJe9xIE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/7678533705680484167/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/07/oracle-apex.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7678533705680484167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7678533705680484167?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/vwapcJe9xIE/oracle-apex.html" title="Oracle APEX: Убить Билла" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/07/oracle-apex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HRXc8eip7ImA9WhZbE0Q.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-3611021216235077659</id><published>2011-06-18T13:26:00.001+03:00</published><updated>2011-06-18T13:27:14.972+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-18T13:27:14.972+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quiz" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="pl/sql challenge" /><title>PL/SQL Challenge: Now with APEX flavor!</title><content type="html">Сегодня на &lt;a href="http://plsqlchallenge.com/"&gt;PL/SQL Challenge&lt;/a&gt; появилась первая викторина по APEX. Надеюсь, многие захотят поучаствовать: для проверки знаний, из интереса, ради призов и чтобы узнать что-то новое.&lt;br /&gt;
&lt;br /&gt;
Удачи!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-3611021216235077659?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/WKxTZZms9eQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/3611021216235077659/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/06/plsql-challenge-now-with-apex-flavor.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/3611021216235077659?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/3611021216235077659?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/WKxTZZms9eQ/plsql-challenge-now-with-apex-flavor.html" title="PL/SQL Challenge: Now with APEX flavor!" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/06/plsql-challenge-now-with-apex-flavor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8CRn8-fip7ImA9WhZVGEk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-3075582355184920770</id><published>2011-05-28T23:54:00.002+03:00</published><updated>2011-05-31T16:17:47.156+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T16:17:47.156+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><category scheme="http://www.blogger.com/atom/ns#" term="interface" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="apex 4.0" /><title>Oracle APEX 4.0: Небольшой пример плохой реализации</title><content type="html">Сегодня я хотел бы упомянуть о том, как &lt;i&gt;не надо разрабатывать&lt;/i&gt;. И в качестве примера у нас будет... APEX 4.0 Application Builder. &lt;span class="fullpost"&gt;Думаю, все разработчики приложений, использующие эту среду, видели страницу атрибутов элемента, динамического действия или региона. Например, выбираем у элемента &lt;i&gt;Display As&lt;/i&gt;=&lt;i&gt;Select List&lt;/i&gt; - и появляется регион &lt;b&gt;List of Values&lt;/b&gt; с соответствующими настройками. В общем, ту страницу, на которой в зависимости от типа объекта атрибуты и регионы прячутся и показываются в зависимости от выбранных значений. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Отличная цель:&lt;/b&gt; оживить и разгрузить страницу, убирая неподходящие поля с глаз долой. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Плохая реализация:&lt;/b&gt; при загрузке страницы показываются все элементы страницы, а уже потом Dynamic Actions прячут ненужное, запускаясь после полной загрузки страницы. Это здорово, что у динамических действий есть возможность запуска при загрузке страницы (флажок &lt;i&gt;Fire On Page Load&lt;/i&gt;). Но когда пользователь видит мельтешащие поля, которые только что были, а потом куда-то пропали - это ужасно. И с эстетической точки зрения, и с точки зрения здравого смысла. Зачем показывать, а потом тут же (а иногда - и не тут, если страница загружается медленно) скрывать часть интерфейса? Лучше не показывать её вообще.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Как стоило сделать:&lt;/b&gt; воспользоваться возможностью указать соответствующий CSS-стиль в свойствах региона, элемента и в их шаблонах. Скрыть всё то, что показывается динамически в зависимости от каких-либо условий.&lt;br /&gt;
&lt;pre class="brush:sql"&gt;display: none;&lt;/pre&gt;Не отмечать &lt;i&gt;Fire On Page Load&lt;/i&gt; у действий, которые что-либо скрывают. (Потому что они сохраняют старое значение свойства display и потом используют его при показе элемента.) Отмечать &lt;i&gt;Fire On Page Load&lt;/i&gt; у действий, которые что-либо показывают. Как итог, на странице появятся вначале все обязательные настройки, а потом отобразится все доступные для изменения настройки.&lt;br /&gt;
&lt;br /&gt;
Предложенный мной способ более трудоёмкий и требует больше времени от разработчика приложения. Но и приложение не будет "моргать" элементами интерфейса перед пользователем при каждой загрузке страницы. Мне кажется, это того стоит.&lt;br /&gt;
&lt;br /&gt;
PS: Вышеописанный подход, в принципе, касается не только приложений APEX. Чем меньше пользователь видит ненужного, чем меньше зряшной работы выполняет приложение, тем лучше.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-3075582355184920770?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/TR7Y_a0eVpk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/3075582355184920770/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/05/oracle-apex-40.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/3075582355184920770?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/3075582355184920770?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/TR7Y_a0eVpk/oracle-apex-40.html" title="Oracle APEX 4.0: Небольшой пример плохой реализации" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/05/oracle-apex-40.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQARHg4fip7ImA9Wx9UF00.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-8866479558473327486</id><published>2011-02-14T19:59:00.000+02:00</published><updated>2011-02-14T19:59:05.636+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-14T19:59:05.636+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="collection" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle APEX: Collections Debug 2</title><content type="html">Есть более "честный" способ для работы с коллекциями при отладке: можно установить соответствующие значения в переменных окружения APEX, частично "клонировав" интересующую сессию. Я для этого использую простую процедуру:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;create or replace procedure copy_apex_session_env 
  ( p_session_id apex_workspace_sessions.apex_session_id%type
  , p_app_id apex_applications.application_id%type )
as
  l_session apex_workspace_sessions%rowtype;
  l_app_id apex_applications.application_id%type;
begin
  begin
    select * into l_session
      from apex_workspace_sessions s 
     where apex_session_id = p_session_id;
  exception
    when no_data_found then
      raise_application_error(-20001, 'Invalid Session ID!');
  end;
  
  begin
    select application_id into l_app_id
      from apex_applications
     where application_id = p_app_id
       and workspace_id = l_session.workspace_id;
  exception
    when no_data_found then
      raise_application_error(-20002, 'Invalid Application ID!');
  end;  
  
  apex_custom_auth.set_session_id(p_session_id =&gt; l_session.apex_session_id);
  apex_custom_auth.set_user(l_session.user_name);
  wwv_flow_api.set_security_group_id(l_session.workspace_id);
  apex_application.g_flow_id := l_app_id;
end copy_apex_session_env;
/&lt;/pre&gt;&lt;br /&gt;
Она должна создаваться в схеме разбора приложения (без этого не сработает &lt;b&gt;wwv_flow_api.set_security_group_id&lt;/b&gt;). Теперь, чтобы увидеть данные соответствующей коллекции, достаточно вызвать процедуру и выполнить запрос:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;exec copy_apex_session_env(p_session_id =&gt; &amp;session_id, p_app_id =&gt; &amp;app_id);

select * from apex_collections where collection_name = 'YOUR_COLLECTION_NAME';&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-8866479558473327486?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/JImmdhmh80M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/8866479558473327486/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/02/oracle-apex-collections-debug-2.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8866479558473327486?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8866479558473327486?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/JImmdhmh80M/oracle-apex-collections-debug-2.html" title="Oracle APEX: Collections Debug 2" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/02/oracle-apex-collections-debug-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HQngyfip7ImA9Wx9UF00.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-181509796852982521</id><published>2011-02-07T01:20:00.001+02:00</published><updated>2011-02-14T19:35:33.696+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-14T19:35:33.696+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="collection" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><title>Oracle APEX: Collections Debug</title><content type="html">Самый простой, хоть и не очень честный способ отладки при работе с коллекциями APEX - смотреть в таблицы wwv_flow_collections$ и wwv_flow_collection_members$ схемы, в которую установлен APEX. Если, конечно, есть соответствующие права, и известны приложение (FLOW_ID) и сессия (SESSION_ID), работающие с коллекцией.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-181509796852982521?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/2dUGjWAdb5s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/181509796852982521/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2011/02/oracle-apex-collections-debug.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/181509796852982521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/181509796852982521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/2dUGjWAdb5s/oracle-apex-collections-debug.html" title="Oracle APEX: Collections Debug" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2011/02/oracle-apex-collections-debug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYCSHg8eip7ImA9Wx9QFEU.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-5714225225562546885</id><published>2010-12-27T23:59:00.000+02:00</published><updated>2010-12-27T23:59:29.672+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T23:59:29.672+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="trick" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Пара фраз о JSON</title><content type="html">Вначале - о проблеме. Сколько раз сталкиваюсь, что JSON-парсер в Firefox вдруг по какой-то причине спотыкается на казалось бы правильной JSON-строке. Решение довольно простое - завернуть эту строку в обычные скобки:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:jscript"&gt;  var result = JSON.parse("("+json_string+")");
&lt;/pre&gt;&lt;br /&gt;
Теперь - о довольно удобном средстве работы с JSON из PL/SQL. Вам хочется организовать эту работу так?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;declare
  l_json json := json();
begin
  l_json.put('name', 'Taras');
  l_json.put('sons', json_list('["Mykola", "Vasyl"]'));
  htp.p(l_result.to_char);
end;
/
&lt;/pre&gt;&lt;br /&gt;
Тогда обратите своё внимание на проект &lt;a href="http://sourceforge.net/projects/pljson/"&gt;PL/JSON&lt;/a&gt;. Думаю, он облегчит Вам жизнь - особенно, если Вы не поленитесь просмотреть короткие уроки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-5714225225562546885?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/IdYP5-RiZsI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/5714225225562546885/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/12/json.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/5714225225562546885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/5714225225562546885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/IdYP5-RiZsI/json.html" title="Пара фраз о JSON" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/12/json.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YCRXk_eyp7ImA9Wx9SGU4.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-7760487796810849535</id><published>2010-12-10T01:59:00.000+02:00</published><updated>2010-12-10T01:59:24.743+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-10T01:59:24.743+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="bug" /><title>Oracle APEX: Медвежья услуга при копировании страницы</title><content type="html">С прискорбием вынужден сообщить, что как минимум в версиях 3.2.1 и 4.0.1 я наткнулся на неприятный баг. При копировании страницы автоматически заменяются имена старых элементов: &lt;b&gt;PMXXX&lt;/b&gt; заменяется на &lt;b&gt;PNXXX&lt;/b&gt;, где &lt;b&gt;M&lt;/b&gt; и &lt;b&gt;N&lt;/b&gt; - номера оригинальной страницы и копии, соответственно. Проблема в том, что стоило бы заменять &lt;b&gt;&lt;i&gt;PM_&lt;/i&gt;XXX&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Для примера: у нас есть страница 5, которая где-то - в переходах, в значении элемента, в процессах - ссылается на элемент &lt;b&gt;P52_X&lt;/b&gt; страницы 52. Теперь мы решили скопировать страницу 5 с новым номером 60. После копирования новая страница будет ссылаться на несуществующий элемент &lt;b&gt;P602_X&lt;/b&gt;: было 52, стало 602.&lt;br /&gt;
&lt;br /&gt;
Вот такая неприятная штука.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-7760487796810849535?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/GdBt3I4yfaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/7760487796810849535/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/12/oracle-apex.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7760487796810849535?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7760487796810849535?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/GdBt3I4yfaE/oracle-apex.html" title="Oracle APEX: Медвежья услуга при копировании страницы" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/12/oracle-apex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDQ3s-fip7ImA9Wx9SEEk.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-302899912841187232</id><published>2010-11-29T17:27:00.000+02:00</published><updated>2010-11-29T17:27:52.556+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-29T17:27:52.556+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="consistency" /><category scheme="http://www.blogger.com/atom/ns#" term="quiz" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle: Consistency и разминка для ума</title><content type="html">Допустим, что в одной сессии выполнится следующее:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;drop table t7;
create table t7 as select 1 id, 0 val from dual;
insert into t7 values(2, 0);
update t7 set val = 1;
&lt;/pre&gt;&lt;br /&gt;
Затем во второй выполнилось вот это:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;update t7 x set val = (select t.val + 1 from t7 t where t.id = x.id);
commit;
select * from t7;&lt;/pre&gt;&lt;br /&gt;
Что выведется во второй сессии на экран?&lt;br /&gt;
&lt;br /&gt;
Теперь повторим в первой сессии тот же блок, что и вначале, а во второй выполним:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;update t7 x set val = (select x.val + 1 from t7 t where t.id = x.id);
commit;
select * from t7;&lt;/pre&gt;&lt;br /&gt;
Каким будет результат?&lt;br /&gt;
&lt;br /&gt;
PS: Ответы и информацию для размышления опубликую через пару дней.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-302899912841187232?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/aw5mZ4G7S-A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/302899912841187232/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/11/oracle-consistency.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/302899912841187232?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/302899912841187232?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/aw5mZ4G7S-A/oracle-consistency.html" title="Oracle: Consistency и разминка для ума" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/11/oracle-consistency.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYDRHczfSp7ImA9Wx9TEkU.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-5420027941610536761</id><published>2010-11-20T21:08:00.001+02:00</published><updated>2010-11-20T21:09:35.985+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-20T21:09:35.985+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="atomacity" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="processing" /><category scheme="http://www.blogger.com/atom/ns#" term="concepts" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle APEX: Сколько транзакций в фазе Page Processing?</title><content type="html">И правильный ответ... Одна. &lt;br /&gt;
&lt;br /&gt;
Из любопытства я сделал простой тест, чтобы подтвердить, что обработка страницы происходит в одну транзакцию:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;0. Создал таблицу и пакет для лога.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;create table processing_steps (ordr number, msg varchar2(1000 char));

create or replace package proc_stp_pkg
as
  procedure reset;
  procedure add(p_ordr number, p_msg varchar2);
  procedure add_auton(p_ordr number, p_msg varchar2);
end proc_stp_pkg;
/

create or replace package body proc_stp_pkg
as
  procedure reset
  is
    pragma autonomous_transaction;
  begin
    delete processing_steps;
    commit;
  end;
  
  procedure add(p_ordr number, p_msg varchar2)
  is
  begin
    insert into processing_steps(ordr, msg) values (p_ordr, p_msg);
  end;
  
  procedure add_auton(p_ordr number, p_msg varchar2)
  is
    pragma autonomous_transaction;
  begin
    add(p_ordr=&gt;p_ordr, p_msg=&gt;p_msg);
  
    commit;
  exception
    when others then 
      rollback;
      raise;
  end;
end proc_stp_pkg;
/&lt;/pre&gt;&lt;br /&gt;
1. Создал в APEX страницу с процессом перед проверками, вычислением, проверкой и процессом после вычисления. В каждом из них есть строки:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;rollback;
proc_str_pkg.add(..., '...');
proc_str_pkg.add_auton(..., '...');&lt;/pre&gt;&lt;br /&gt;
2. Добавил кнопку и переход на эту же страницу при нажатии.&lt;br /&gt;
3. Запустил страницу и нажал на кнопку.&lt;br /&gt;
4. Выполнил запрос:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;SQL&gt; set pages 9999 line 200
SQL&gt; column msg format a50
SQL&gt; select * from processing_steps
  2  order by ordr;

      ORDR MSG
---------- --------------------------------------------------
         1 Pr: On Submit - Before Computations and Validation
           s - Autonomous Transaction

         3 Computation - Autonomous Transaction
         5 Validation - Autonomous Transaction
         6 Pr: On Submit - After Computations and Validations
         7 Pr: On Submit - After Computations and Validations
            - Autonomous Transaction


SQL&gt;&lt;/pre&gt;&lt;br /&gt;
Пропущенные вставки 0, 2 и 4 откатывались оператором ROLLBACK в последующих блоках обработки. Вставка 6 автоматически зафиксировалась при успешном выполнении последнего блока. Так что будьте осторожней, управляя фиксацией и откатом в Вашем коде - Вы можете повлиять на результаты предыдущих блоков.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-5420027941610536761?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/dGq_wViVa8k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/5420027941610536761/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/11/oracle-apex-page-processing.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/5420027941610536761?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/5420027941610536761?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/dGq_wViVa8k/oracle-apex-page-processing.html" title="Oracle APEX: Сколько транзакций в фазе Page Processing?" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/11/oracle-apex-page-processing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGR3o4eSp7ImA9WhZVFko.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-932845554047302017</id><published>2010-11-15T01:37:00.005+02:00</published><updated>2011-05-29T15:50:26.431+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-29T15:50:26.431+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle sql developer" /><category scheme="http://www.blogger.com/atom/ns#" term="article" /><category scheme="http://www.blogger.com/atom/ns#" term="translation" /><title>Oracle APEX + Oracle SQL Developer = Сила двух</title><content type="html">&lt;div style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Предлагаю вниманию читателей перевод одной статьи.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; Она понравилась мне объяснением возможностей удалённой отладки, и я решил перевести её целиком. Надеюсь, она пригодится... &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Сила двух&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;Дэвид Пик&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;Перевод: Александр Поливаный&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt; (&lt;a href="http://www.oracle.com/technetwork/issue-archive/2008/08-may/o38browser-085023.html"&gt;The Power of Two By David Peake&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
&lt;i&gt;Использование Oracle SQL Developer при разработке в Oracle Application Express.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.oracle.com/technetwork/developer-tools/apex/overview/index.html"&gt;Oracle Application Express&lt;/a&gt; (Oracle APEX) и &lt;a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html"&gt;Oracle SQL Developer&lt;/a&gt; (OSD) — это бесплатные инструменты, оба работающие с Oracle Database версии 9.2 и выше. OSD не только помогает Вам в разработке приложений БД, но также даёт Вам возможности просмотра, экспорта, импорта, внедрения и удалённой отладки Ваших приложений Oracle APEX.&lt;br /&gt;
&lt;br /&gt;
Эта статья покажет, как OSD и Oracle APEX работают вместе, способствуя разработке. Мы увидим, как можно просматривать информацию о приложениях Oracle APEX из OSD. Затем мы пройдёмся по примеру удалённой отладки PL/SQL-кода, выполняющегося в браузерном приложении, из OSD.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;u&gt;&lt;b&gt;Введение&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Используя OSD в связке с Oracle APEX, Вы можете просматривать несколько приложений и страниц и быстро добираться до конкретных данных. К примеру, в Oracle APEX Вам потребуется два браузера, чтобы глядеть&lt;b&gt;*&lt;/b&gt; на код двух списков значений (list of values, LOV) в двух разных приложениях одновременно. В OSD всё, что нужно - развернуть оба приложения в списке подключений (Connections). Также OSD специально для Oracle APEX предоставляет несколько очень полезных и подробных отчётов о приложениях, страницах, схемах и рабочих пространствах (категория Data Dictionary Reports в отчётах).&lt;br /&gt;
&lt;br /&gt;
OSD позволяет Вам экспортировать, импортировать и внедрять приложения во многих рабочих пространствах, экземплярах APEX и базах данных. ПКМ на названии приложения вызывает контекстное меню, при помощи которого можно переносить приложение с его вспомогательными объектами из одного рабочего пространства в другое. Эта возможность особенно полезна при внедрении приложений из разработки в тестирование или производство.&lt;br /&gt;
&lt;br /&gt;
Вы можете копировать SQL-код из Ваших регионов, списков значений и проверок, вставлять их в SQL Worksheet в OSD и выполнять. OSD даст Вам ввести значения для связываемых переменных и запустить EXPLAIN PLAN или AUTOTRACE для запроса, чтобы обнаружить проблемы с производительностью и настроить SQL.&lt;br /&gt;
&lt;br /&gt;
Для примеров в этой статье требуются Oracle APEX 3.0.1 и выше и OSD 1.2.1 и выше. (Обратите внимание, что Вы не сможете выполнить примеры, используя Oracle APEX на apex.oracle.com.) Вам также потребуется рабочее пространство Oracle APEX, связанное со схемой-примером HR, доступной в БД по умолчанию.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;u&gt;&lt;b&gt;Просмотр информации Oracle APEX&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Создайте подключение в OSD к схеме HR. Для пошаговых инструкций по созданию подключений в OSD читайте статью "Making Database Connections" в этом выпуске Oracle Magazine.&lt;b&gt;**&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Когда соединение установится, Вы сможете увидеть пункт Application Express под подключением HR в списке подключений (Connections), как показано на рисунке (под подключением XE Dpeake):&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TOBm8tHZsfI/AAAAAAAAAEc/zbL8tw2U96Q/s1600/1.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TOBm8tHZsfI/AAAAAAAAAEc/zbL8tw2U96Q/s1600/1.gif" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Пункт Application Express в Oracle SQL Developer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь Вы можете просмотреть приложения Oracle APEX пользователя HR, используя закладки с подробной информацией:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/TOBnMe0ywCI/AAAAAAAAAEg/Se7Bpv81W7w/s1600/2.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/TOBnMe0ywCI/AAAAAAAAAEg/Se7Bpv81W7w/s1600/2.gif" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Закладки с подробной информацией о приложении&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Удалённая отладка&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать OSD для удалённой отладки PL/SQL-кода. Эта возможность особенно полезна в случае, когда приложение не прекращает выполнение, но и не даёт результатов, которые Вы ожидали. Чтобы потренироваться, выполните следующие шаги для отладки процедуры в упакованном приложении Oracle APEX "Asset Manager":&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Шаг 1: Получение и установка упакованного приложения.&lt;/b&gt; Скачайте, импортируйте и разверните приложение в Oracle APEX.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Скачайте и сохраните asset_manager_1.0.zip с сайта &lt;a href="http://www.oracle.com/technetwork/developer-tools/apex/application-express/packaged-apps-090453.html#ASSETS"&gt;http://www.oracle.com/technetwork/developer-tools/apex/application-express/packaged-apps-090453.html#ASSETS&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;Разархивируйте файл.&lt;/li&gt;
&lt;li&gt;В OSD подключитесь к схеме HR.&lt;/li&gt;
&lt;li&gt;ПКМ по пункту Application Express под HR в списке подключений, выберите Import Application (Импортировать приложение).&lt;/li&gt;
&lt;li&gt;Найдите и откройте разархивированную папку asset_manager_1.0, выберите файл asset_manager_installer_1.0.sql.&lt;/li&gt;
&lt;li&gt;Нажмите Next (Далее).&lt;/li&gt;
&lt;li&gt;Установите флажок Run Install Script (Запустить установочный скрипт) и нажмите Next.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBnfI4T1QI/AAAAAAAAAEk/STZ321utCYk/s1600/3.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBnfI4T1QI/AAAAAAAAAEk/STZ321utCYk/s1600/3.gif" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Импорт и внедрение приложения&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;
&lt;li&gt;Нажмите Finish (Завершить).&lt;/li&gt;
&lt;li&gt;Нажмите OK в окне, сообщающем об успешной установке.&lt;/li&gt;
&lt;/ol&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Шаг 2: Настройка OSD для удалённой отладки. &lt;/b&gt;Подготовьте OSD для отладки процедуры EBA_ASSET.update_status, выполняемой в приложении, удалённо.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;В OSD подключитесь к базе данных как пользователь с привилегиями DBA.&lt;b&gt;***&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Введите следующий код. Если необходимо, замените PUBLIC на имя пользователя, от имени которого запускается Oracle APEX в mod_plsql. &lt;br /&gt;
&lt;pre class="brush: sql"&gt;grant DEBUG CONNECT SESSION to HR; 
grant DEBUG on HR.EBA_ASSET to PUBLIC;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Нажмите кнопку Run Script (или нажмите F5).&lt;/li&gt;
&lt;li&gt;Подключитесь как HR.&lt;/li&gt;
&lt;li&gt;В Подключениях откройте пункт Packages (Пакеты) и нажмите EBA_ASSET.&lt;/li&gt;
&lt;li&gt;ПКМ по телу пакета EBA_ASSET и выберите Edit (Править).&lt;/li&gt;
&lt;li&gt;ПКМ по левому полю в редакторе кода, выберите Toggle Line Numbers (Отображать номера строк).&lt;/li&gt;
&lt;li&gt;Перейдите вниз, к строке 113, ПКМ по левому полю в редакторе кода, выберите Toggle Breakpoint (Установить точку остановки).&lt;/li&gt;
&lt;li&gt;ПКМ по коду, выберите Compile for Debug (Компилировать для отладки). Заметьте, что выполнение пакета в режиме отладки сильно помешает производительности. Когда тестирование закончится, Вам стоит перекомпилировать пакет без отладочной информации.&lt;/li&gt;
&lt;li&gt;ПКМ по подключению HR в Подключениях, выберите Remote Debug (Удалённая отладка).&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBvR01SSDI/AAAAAAAAAEo/x-gH6JFPQbY/s1600/4.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBvR01SSDI/AAAAAAAAAEo/x-gH6JFPQbY/s1600/4.gif" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Oracle SQL Developer настроен для удалённой отладки&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;
&lt;li&gt;Нажмите OK.&lt;/li&gt;
&lt;/ol&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Шаг 3: Настройка Oracle APEX для отладки. &lt;/b&gt;Подготовьте Oracle APEX к отладке процедуры EBA_ASSET .update_status:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Войдите в Oracle APEX как разработчик соответствующего рабочего пространства - того, в которое Вы установили приложение "Asset Manager".&lt;/li&gt;
&lt;li&gt;Нажмите Application Builder.&lt;/li&gt;
&lt;li&gt;Нажмите Asset Manager 1.0.&lt;/li&gt;
&lt;li&gt;Откройте страницу 11 - Inventory Details.&lt;/li&gt;
&lt;li&gt;В Процессах (Processes) нажмите Update Asset Status.&lt;/li&gt;
&lt;li&gt;В поле Source замените код на следующий:&lt;/li&gt;
&lt;pre class="brush: sql"&gt;IF :DEBUG = 'YES' THEN
     dbms_debug_jdwp.connect_tcp('localhost',4000);
END IF;
eba_asset.update_status(:P11_ASSET_ID);
IF :DEBUG = 'YES' THEN
     dbms_debug_jdwp.disconnect;
END IF;&lt;/pre&gt;Этот код будет срабатывать только тогда, когда страница запущена в режиме отладки. Второй блок IF отключает отладочную сессию.
&lt;li&gt;Нажмите Apply Changes (Применить изменения).&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;Шаг 4: Запуск приложения.&lt;/b&gt; Запустите приложение "Asset Manager" в Oracle APEX, вначале в обычном режиме, а затем - в режиме отладки.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;В Oracle APEX вернитесь назад, к странице 1 и нажмите Run (Запустить).&lt;/li&gt;
&lt;li&gt;Войдите в приложение как HR.&lt;/li&gt;
&lt;li&gt;Выберите Assets.&lt;/li&gt;
&lt;li&gt;Нажмите иконку редактирования для любой записи.&lt;/li&gt;
&lt;li&gt;Нажмите иконку редактирования для записи остатков. Поменяйте значение поля Status (статус).&lt;/li&gt;
&lt;li&gt;Нажмите Apply Changes. Приложение нормально обработает изменения, потому оно запущено не в режиме отладки.&lt;/li&gt;
&lt;li&gt;Нажмите иконку редактирования для той же записи остатков.&lt;/li&gt;
&lt;li&gt;Нажмите Debug (Отладка) на панели инструментов разработчика.&lt;/li&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBvqCmbUtI/AAAAAAAAAEs/SQh3bpixuE4/s1600/5.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZrQNXIKt5Zw/TOBvqCmbUtI/AAAAAAAAAEs/SQh3bpixuE4/s1600/5.gif" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Панель инструментов разработчика в Oracle APEX&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;li&gt;Поменяйте статус и нажмите Apply Changes.&lt;/li&gt;
&lt;li&gt;Теперь OSD должен перехватить фокус ввода. (Если этого не произошло, то приложение будет показывать частично завершённый процесс загрузки страницы, и Вам нужно будет открыть окно OSD самостоятельно.)&lt;/li&gt;
&lt;li&gt;Используйте инструменты OSD, чтобы возобновить выполнение, выполнять отладку пошагово с обходом и со входом в процедуру. Во время отладки процедуры Вы можете видеть изменения значений в переменных и в данных.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Когда процедура закончит выполнение, удалённый отладчик отсоединится.&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать удалённую отладку, чтобы пошагово пройти сквозь сложную PL/SQL обработку, которая не выполняет предназначенное. Наблюдение за значениями переменных и данных во время отладки программы помогает определить ошибку в логике.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;u&gt;&lt;b&gt;Заключение&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать Oracle SQL Developer, чтобы выполнять следующие задачи, когда Вы разрабатываете приложения Oracle Application Express:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Быстрое перемещение между компонентами Ваших приложений.&lt;/li&gt;
&lt;li&gt;Экспорт, импорт и внедрение приложений.&lt;/li&gt;
&lt;li&gt;Настройка SQL.&lt;/li&gt;
&lt;li&gt;Удалённая отладка PL/SQL.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
Сочетание Oracle SQL Developer и Oracle Application Express может дать Вам значительный рост производительности в разработке Web-приложений.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;u&gt;&lt;b&gt;Примечания переводчика&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;*&lt;/b&gt; Дэвид не досказывает либо лукавит, говоря "глядеть" (to view) вместо "работать". Чтобы глядеть, хватит и двух закладок в браузере. Естественно, что все необходимые переменные сессии APEX — рабочее пространство, номер приложения, номер страницы — будут устанавливаться в зависимости от последнего открытого LOV. Кроме того, для одновременной работы с двумя приложениями в одном браузере можно использовать дублирование DNS-имён хоста с APEX. Подробней можно почитать здесь: &lt;a href="http://www.talkapex.com/2009/07/apex-how-to-develop-in-2-browser-tabs.html"&gt;Martin Giffy D'Souza on Oracle APEX - APEX: How to Develop in 2 Browser Tabs&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;**&lt;/b&gt; Или просто нажмите F1 и читайте раздел справки SQL Developer Concepts and Usage-&amp;gt;Database Connections.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;***&lt;/b&gt; Имеется в виду пользователь с правами, достаточными для выдачи привилегий DEBUG CONNECT SESSION и DEBUG HR.EBA_ASSET.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-932845554047302017?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/uGe6ySx1zPg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/932845554047302017/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/11/oracle-apex-oracle-sql-developer.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/932845554047302017?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/932845554047302017?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/uGe6ySx1zPg/oracle-apex-oracle-sql-developer.html" title="Oracle APEX + Oracle SQL Developer = Сила двух" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TOBm8tHZsfI/AAAAAAAAAEc/zbL8tw2U96Q/s72-c/1.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/11/oracle-apex-oracle-sql-developer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0INR3czeyp7ImA9Wx9TEks.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-454700037799908784</id><published>2010-11-12T00:57:00.002+02:00</published><updated>2010-11-20T17:06:36.983+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-20T17:06:36.983+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="patch" /><category scheme="http://www.blogger.com/atom/ns#" term="apex 4.0" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle APEX: 4.0.2 на пороге</title><content type="html">&lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=1119913&amp;messageID=9135835#9135835"&gt;Если я всё верно понял&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Ждём-с!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPD 2010-11-20:&lt;/b&gt; На MOS уже доступен для загрузки патч 10173973.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-454700037799908784?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/-WpLzFHSs28" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/454700037799908784/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/11/oracle-apex-402.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/454700037799908784?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/454700037799908784?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/-WpLzFHSs28/oracle-apex-402.html" title="Oracle APEX: 4.0.2 на пороге" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/11/oracle-apex-402.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AHQXsyfyp7ImA9Wx5bE0o.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-2866012823131508984</id><published>2010-10-29T22:13:00.001+03:00</published><updated>2010-10-29T22:15:30.597+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-29T22:15:30.597+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle sql developer" /><category scheme="http://www.blogger.com/atom/ns#" term="error" /><category scheme="http://www.blogger.com/atom/ns#" term="ora-12705" /><title>Oracle SQL Developer: ORA-12705</title><content type="html">Честно говоря, я лично не сталкивался с этой ошибкой. Под Debian GNU/Linux мне достаточно было указать соответствующие NLS-настройки в Tools-&amp;gt;Preferences-&amp;gt;Database-&amp;gt;NLS:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TMsaoN3-rmI/AAAAAAAAAEY/rDBIlGA-ELs/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-Preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="129" src="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TMsaoN3-rmI/AAAAAAAAAEY/rDBIlGA-ELs/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-Preferences.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
С учётом моей локали, больше ничего не потребовалось.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: bash"&gt;suppler@dark-place:~$ locale
LANG=ru_UA.UTF-8
LC_CTYPE="ru_UA.UTF-8"
LC_NUMERIC="ru_UA.UTF-8"
LC_TIME="ru_UA.UTF-8"
LC_COLLATE="ru_UA.UTF-8"
LC_MONETARY="ru_UA.UTF-8"
LC_MESSAGES="ru_UA.UTF-8"
LC_PAPER="ru_UA.UTF-8"
LC_NAME="ru_UA.UTF-8"
LC_ADDRESS="ru_UA.UTF-8"
LC_TELEPHONE="ru_UA.UTF-8"
LC_MEASUREMENT="ru_UA.UTF-8"
LC_IDENTIFICATION="ru_UA.UTF-8"
LC_ALL=
&lt;/pre&gt;&lt;br /&gt;
Тем не менее, есть один проверенный способ. Необходимо добавить в один из конфигурационных файлов SQL Developer опции с явным указанием языка и страны. Например, в &lt;i&gt;&amp;lt;sqldeveloper_root_dir&amp;gt;/sqldeveloper/bin/sqldeveloper.conf&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: plain"&gt;AddVMOption -Duser.language=en
AddVMOption -Duser.country=US&lt;/pre&gt;&lt;br /&gt;
Надеюсь, эта заметка вместе с &lt;a href="http://suppler.blogspot.com/2010/02/oracle-sql-developerdebian-gnulinux.html"&gt;другой&lt;/a&gt; сэкономит кое-кому время.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-2866012823131508984?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/HNuSTVpwt7w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/2866012823131508984/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/oracle-sql-developer-ora-12705.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2866012823131508984?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/2866012823131508984?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/HNuSTVpwt7w/oracle-sql-developer-ora-12705.html" title="Oracle SQL Developer: ORA-12705" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrQNXIKt5Zw/TMsaoN3-rmI/AAAAAAAAAEY/rDBIlGA-ELs/s72-c/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-Preferences.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/oracle-sql-developer-ora-12705.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YGSH04eCp7ImA9Wx5UFks.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-6134724070522327370</id><published>2010-10-21T14:38:00.000+03:00</published><updated>2010-10-21T14:38:49.330+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-21T14:38:49.330+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grant" /><category scheme="http://www.blogger.com/atom/ns#" term="parsing schema" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle apex" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Oracle APEX: Кому дать привилегии?</title><content type="html">В ситуации, когда приложение работает с несколькими схемами БД, часто возникает вопрос: какому пользователю дать привилегии на запрос/DML/выполнение, чтобы приложение спокойно могло обращаться к объектам этих схем? Ответ прост: дайте привилегии пользователю-владельцу схемы разбора приложения (aka parsing schema). Вы можете узнать имя пользователя, зайдя в Application-&gt;Edit Application Properties и глянув на Name-&gt;Parsing Schema. Также можно выполнить запрос:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;select owner from apex_applications where application_id = :p_your_app_id;&lt;/pre&gt;Это тот пользователь, от имени которого выполняются все операторы и PL/SQL-блоки в Вашем приложении, так что именно ему требуется права на всё, с чем работает приложение. &lt;br /&gt;
&lt;br /&gt;
Кое-кто предпочитает дать привилегии всем, дав их роли PUBLIC, но на мой взгляд, простота часто не стоит безопасности. Лучше пожертвовать временем и дать привилегии тем, кому они действительно нужны, чем пожертвовать безопасностью.&lt;br /&gt;
&lt;br /&gt;
Если кто-то заинтересовался, как же в сессии пользователя ANONYMOUS/APEX_PUBLIC_USER выполняются операторы и PL/SQL-код с правами пользователя-владельца схемы разбора, то можно поискать в Сети информацию про недокументированный пакет DBMS_SYS_SQL.&lt;br /&gt;
&lt;br /&gt;
Надеюсь, что вопрос исчерпан. Удачи!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-6134724070522327370?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/gLSshHzFb8E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/6134724070522327370/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/oracle-apex.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6134724070522327370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6134724070522327370?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/gLSshHzFb8E/oracle-apex.html" title="Oracle APEX: Кому дать привилегии?" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/oracle-apex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04AQnk4eip7ImA9Wx5UE0k.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-70807602279953505</id><published>2010-10-18T00:12:00.000+03:00</published><updated>2010-10-18T00:12:23.732+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-18T00:12:23.732+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax highlighter" /><category scheme="http://www.blogger.com/atom/ns#" term="update" /><title>Небольшое обновление в блоге</title><content type="html">Я обновил &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;Syntax Highlighter&lt;/a&gt; до версии 3.0.83, так что теперь, чтобы выделить текст в блоке с кодом, достаточно двойного щелчка по нему. Спасибо Алексу Горбачёву за этот замечательный проект!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-70807602279953505?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/o016utceUBk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/70807602279953505/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/70807602279953505?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/70807602279953505?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/o016utceUBk/blog-post.html" title="Небольшое обновление в блоге" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYBRXs7cSp7ImA9Wx5UEks.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-8616131105686077197</id><published>2010-10-17T01:29:00.000+03:00</published><updated>2010-10-17T01:29:14.509+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-17T01:29:14.509+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="xe" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle sql developer" /><category scheme="http://www.blogger.com/atom/ns#" term="data modeler" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle: С опозданием о паре вещей...</title><content type="html">0. Oracle SQL Developer 3.0 EA1 вполне себе доступен для &lt;a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/index-rel3-ea1-166825.html"&gt;скачивания&lt;/a&gt;. Список новых возможностей можно посмотреть &lt;a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/rel3-featurelist-ea1-166831.html"&gt;здесь&lt;/a&gt;.&lt;br /&gt;
1. Oracle SQL Developer Data Modeler теперь бесплатен! Версию 3.0 EA1 можно скачать &lt;a href="http://http://www.oracle.com/technetwork/developer-tools/datamodeler/ea1-downloads-176664.html"&gt;здесь&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Я знаю, что это не новости, но тем не менее, вести приятные. Как компенсация - интересный слух с OOW 2010: общественности стало известно, что работы над Oracle XE 11g уже ведутся, и что допустимый объём пользовательских данных поднимут с 4 до 10 ГБ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-8616131105686077197?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/5mo3sX49DfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/8616131105686077197/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/oracle.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8616131105686077197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8616131105686077197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/5mo3sX49DfE/oracle.html" title="Oracle: С опозданием о паре вещей..." /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/oracle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQGRns4eCp7ImA9Wx5UEEU.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-8575277618509492392</id><published>2010-10-14T23:15:00.000+03:00</published><updated>2010-10-14T23:15:27.530+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-14T23:15:27.530+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="error" /><category scheme="http://www.blogger.com/atom/ns#" term="404" /><category scheme="http://www.blogger.com/atom/ns#" term="not found" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Oracle APEX: Почему возникла ошибка 404?</title><content type="html">&lt;blockquote&gt;The requested URL /pls/apex/wwv_flow.accept was not found on this server.&lt;/blockquote&gt;&lt;br /&gt;
Знакомо? Что-то произошло, но что именно - расскажет лог HTTP-сервера. А что, если к нему нет доступа в эти моменты, или нет времени, чтобы добираться к файлу error_log.xxxxx? Не проблема! Всё, что нужно - добавить следующее в dads.conf/marvel.conf в &amp;lt;Location /pls/apex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: html"&gt; ...
 PlsqlErrorStyle  DebugStyle
 ...
&lt;/pre&gt;&lt;br /&gt;
И Вы получите подробное описание ошибки вместо невразумительной Error 404.&lt;br /&gt;
&lt;br /&gt;
А что делать, если Вы используете EPG? Настраивать его DAD через соответствующий пакет, конечно:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;exec dbms_epg.set_dad_attribute('APEX', 'error-style', 'DebugStyle');
&lt;/pre&gt;&lt;br /&gt;
И дело в шляпе.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-8575277618509492392?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/A13L57CocMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/8575277618509492392/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/oracle-apex-404.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8575277618509492392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/8575277618509492392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/A13L57CocMA/oracle-apex-404.html" title="Oracle APEX: Почему возникла ошибка 404?" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/oracle-apex-404.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYHRn8zfCp7ImA9Wx5VEEg.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-6619686361468876968</id><published>2010-10-03T00:15:00.000+03:00</published><updated>2010-10-03T00:15:37.184+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-03T00:15:37.184+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="source" /><category scheme="http://www.blogger.com/atom/ns#" term="utility" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><category scheme="http://www.blogger.com/atom/ns#" term="mview" /><title>Oracle Materialized Views: DBMS_MVIEW.EXPLAIN_MVIEW с человеческим лицом</title><content type="html">Хочу упомянуть одну полезную функцию, которую я нашёл на &lt;a href="http://www.sqlsnippets.com/en/topic-12884.html"&gt;SQL Snippets&lt;/a&gt;. Она автоматизирует весь тот процесс, который обычно выполняется при экспериментах с материализованными представлениями: вызов DBMS_MVIEW.EXPLAIN_MVIEW, вывод информации на экран, очистка MV_CAPABILITIES_TABLE. Теперь достаточно просто вызвать эту функцию в запросе, указав текст или имя материализованного представления:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;SQL&gt; set long 5000
SQL&gt; select my_mv_capabilities(q'[select mgr, count(*) from emp group by mgr]', 'REFRESH') from dual;

MY_MV_CAPABILITIES(Q'[SELECTMGR,COUNT(*)FROMEMPGROUPBYMGR]','REFRESH')
--------------------------------------------------------------------------------

Capable of:

  REFRESH_COMPLETE

Not Capable of:

  REFRESH_FAST

  REFRESH_FAST_AFTER_INSERT
    HES.EMP

MY_MV_CAPABILITIES(Q'[SELECTMGR,COUNT(*)FROMEMPGROUPBYMGR]','REFRESH')
--------------------------------------------------------------------------------
    таблица подробных данных не содержит журнал материализованного
    представления

  REFRESH_FAST_AFTER_ONETAB_DML
    см. причину отключения REFRESH_FAST_AFTER_INSERT

  REFRESH_FAST_AFTER_ANY_DML
    см. причину отключения REFRESH_FAST_AFTER_ONETAB_DML
&lt;/pre&gt;&lt;br /&gt;
Текст самой функции ниже:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;create or replace function my_mv_capabilities
(
  p_mv                       in  varchar2 ,
  p_capability_name_filter   in  varchar2 default '%' ,
  p_include_pct_capabilities in  varchar2 default 'N' ,
  p_linesize                 in  number   default 80
)
  return clob
as
  --------------------------------------------------------------------------------
  -- From http://www.sqlsnippets.com/en/topic-12884.html
  --
  -- Parameters:
  --
  --   p_mv
  --     o this value is passed to DBMS_MVIEW.EXPLAIN_MVIEW's "mv" parameter
  --     o it can contain either a query, CREATE MATERIALIZED VIEW command text,
  --       or a materialized view name
  --
  --   p_capability_name_filter
  --     o use either REFRESH, REWRITE, PCT, or the default
  --
  --   p_include_pct_capabilities
  --     Y - capabilities like REFRESH_FAST_PCT are included in the report
  --     N - capabilities like REFRESH_FAST_PCT are not included in the report
  --
  --   p_linesize
  --     o the maximum size allowed for any line in the report output
  --     o data that is longer than this value will be word wrapped
  --
  -- Typical Usage:
  --
  --   set long 5000
  --   select my_mv_capabilities( 'MV_NAME' ) as mv_report from dual ;
  --
  --   o the value 5000 is arbitraty; any value big enough to contain the
  --     report output will do
  --
  --------------------------------------------------------------------------------

  pragma autonomous_transaction ;

  v_nl constant char(1) := unistr( '\000A' ); -- new line

  v_previous_possible char(1) := 'X' ;

  v_capabilities sys.ExplainMVArrayType ;

  v_output clob ;

begin

  dbms_mview.explain_mview( mv =&gt; p_mv, msg_array =&gt; v_capabilities ) ;

  for v_capability in
  (
    select
      capability_name ,
      possible ,
      related_text ,
      msgtxt
    from
      table( v_capabilities )
    where
      capability_name like '%' || upper( p_capability_name_filter ) || '%' and
      not
        ( capability_name like '%PCT%' and
          upper(p_include_pct_capabilities) = 'N'
        )
    order by
      mvowner ,
      mvname ,
      possible desc ,
      seq
  )
  loop

    ------------------------------------------------------------
    -- print section heading
    ------------------------------------------------------------

    if v_capability.possible &lt;&gt; v_previous_possible then

      v_output :=
        v_output
        || v_nl
        || case v_capability.possible
           when 'T' then 'Capable of: '
           when 'Y' then 'Capable of: '
           when 'F' then 'Not Capable of: '
           when 'N' then 'Not Capable of: '
           else v_capability.possible || ':'
           end
        || v_nl
      ;

    end if;

    v_previous_possible := v_capability.possible ;

    ------------------------------------------------------------
    -- print section body
    ------------------------------------------------------------
    declare

      v_indented_line_size varchar2(3) := to_char( p_linesize - 5 );

    begin

      -- print capability name indented 2 spaces

      v_output :=
        v_output
        || v_nl
        || '  '
        || v_capability.capability_name
        || v_nl
      ;

      -- print related text indented 4 spaces and word wrapped

      if v_capability.related_text is not null then

        v_output :=
          v_output
          || regexp_replace
             ( v_capability.related_text || ' '
             , '(.{1,'
                 || v_indented_line_size || '} |.{1,'
                 || v_indented_line_size || '})'
             , '    \1' || v_nl
             )
        ;

      end if;

      -- print message text indented 4 spaces and word wrapped

      if v_capability.msgtxt is not null then

        v_output :=
          v_output
          || regexp_replace
             ( v_capability.msgtxt || ' '
             , '(.{1,'
                 || v_indented_line_size || '} |.{1,'
                 || v_indented_line_size || '})'
             , '    \1' || v_nl
             )
        ;

      end if;

    end;

  end loop;

  commit ;

  return( v_output );

end;
/&lt;/pre&gt;Большое спасибо автору этой функции! Она упрощает жизнь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-6619686361468876968?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/S8s532SgJrM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/6619686361468876968/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/oracle-materialized-views.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6619686361468876968?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/6619686361468876968?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/S8s532SgJrM/oracle-materialized-views.html" title="Oracle Materialized Views: DBMS_MVIEW.EXPLAIN_MVIEW с человеческим лицом" /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/oracle-materialized-views.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQGSHg4fyp7ImA9Wx5WGUo.&quot;"><id>tag:blogger.com,1999:blog-1048968608851202757.post-7115539214134664789</id><published>2010-10-02T02:54:00.001+03:00</published><updated>2010-10-02T02:55:29.637+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-02T02:55:29.637+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="trick" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><category scheme="http://www.blogger.com/atom/ns#" term="mview" /><title>Nested Materialized Views: Must contain joins or aggregates. No exclusions...</title><content type="html">&lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e16579/basicmv.htm#DWHSG8184"&gt;Data Warehousing Guide&lt;/a&gt; говорит нам:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;You can create a nested materialized view on materialized views, but all parent and base materialized views must contain joins or aggregates. If the defining queries for a materialized view do not contain joins or aggregates, it cannot be nested.&lt;/blockquote&gt;&lt;br /&gt;
Как по мне, это условие насчёт обязательности агрегатов или соединения иногда только мешает. Например&lt;span class="fullpost"&gt;, у нас есть материализованное представление, необходимо на его основе сделать ещё одно, использующее детерминированные пользовательские функции для расчёта значений столбцов и быстро обновляющееся при фиксации изменений (REFRESH FAST ON COMMIT). Попробуйте этого добиться без агрегатов и соединений в запросе материализованного представления - у Вас ничего не выйдет, как бы Вы не ухищрялись с текстом запроса и журналом материализованного представления!&lt;br /&gt;
&lt;br /&gt;
Решение простое: добавьте соединение с тем же самым материализованным представлением, используя rowid в качестве столбца-соединителя, выполните требования к материализованным представлениям с соединением для быстрого обновления - вуаля! Всё работает.&lt;br /&gt;
&lt;br /&gt;
Тест-кейс:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;create materialized view log on emp
  with rowid (empno, mgr, sal)
  including new values;
  
create materialized view mv$sub_sal
  refresh fast on commit
  as
select nvl(mgr, empno) mgr, sum(sal) sal, count(sal) sal_cnt, count(*) row_cnt
  from emp
 group by nvl(mgr, empno);
 
create function test_fu(p_mgr number, p_sal number)
  return number
  deterministic
as
begin
  return p_sal * case when p_sal &gt; 5000 or p_mgr = 7788 then 1.2 else 1 end;
end;
/

alter table mv$sub_sal add constraint mv$sub_sal_pk primary key(mgr);

create materialized view log on mv$sub_sal
  with rowid;
  
create materialized view mv$calc_sub_sal
  refresh fast on commit
  as
select m1.mgr, test_fu(m1.mgr, m1.sal) calc_sal, m1.rowid m1_row_id, m2.rowid m2_row_id
  from mv$sub_sal m1, mv$sub_sal m2
 where m1.rowid = m2.rowid;&lt;/pre&gt;&lt;br /&gt;
Удаление:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;drop materialized view mv$calc_sub_sal;
drop materialized view log on mv$sub_sal;
drop function test_fu;
drop materialized view mv$sub_sal;
drop materialized view log on emp;
&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1048968608851202757-7115539214134664789?l=suppler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/DNhs/~4/43WQQlyyEjM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://suppler.blogspot.com/feeds/7115539214134664789/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://suppler.blogspot.com/2010/10/nested-materialized-views-must-contain.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7115539214134664789?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1048968608851202757/posts/default/7115539214134664789?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/DNhs/~3/43WQQlyyEjM/nested-materialized-views-must-contain.html" title="Nested Materialized Views: Must contain joins or aggregates. No exclusions..." /><author><name>suPPLer</name><uri>http://www.blogger.com/profile/01186200400558858674</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_ZrQNXIKt5Zw/SeeDAPNvn_I/AAAAAAAAAAM/CotZMeRUBUg/S220/v.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://suppler.blogspot.com/2010/10/nested-materialized-views-must-contain.html</feedburner:origLink></entry></feed>

