<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Oracle. Администрирование и разработка.</title><link>http://oraclemaniacs.blogspot.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/oraclemaniacs" /><description>Администрирование Oracle. Программирование на PL\SQL. А также все что касается лидера разработки корпоративного ПО.</description><language>en</language><managingEditor>noreply@blogger.com (Дмитрий Богомолов)</managingEditor><lastBuildDate>Sun, 27 Nov 2011 16:53:55 PST</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">158</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">25</openSearch:itemsPerPage><feedburner:info uri="oraclemaniacs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nd/3.0/</creativeCommons:license><feedburner:emailServiceId>oraclemaniacs</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Как провести полное обновление матвью на узком канале?</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/iOgMKJTOzVk/blog-post.html</link><category>FAQ</category><category>запомнить</category><category>Oracle</category><category>фишки</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Mon, 07 Nov 2011 04:42:50 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-992593734956644243</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-w0HZxO7CO1M/Sbi1EmKeQQI/AAAAAAAAASc/NCl-TpTWM30/s1600/pl_RS_SQL_NEW_detail_1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ilo-full-src="http://4.bp.blogspot.com/-w0HZxO7CO1M/Sbi1EmKeQQI/AAAAAAAAASc/NCl-TpTWM30/s1600/pl_RS_SQL_NEW_detail_1.png" src="http://4.bp.blogspot.com/-w0HZxO7CO1M/Sbi1EmKeQQI/AAAAAAAAASc/NCl-TpTWM30/s1600/pl_RS_SQL_NEW_detail_1.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Предыстория&lt;/b&gt;&lt;br /&gt;
Мигрировали базу на новый сервер одновременно с обновлением версии Oracle (10.2 -&amp;gt; 11.2). Было решено использовать дамп для переноса, т.к. так уж сложилось, что на исходной базе размер блока был нестандартный (6К) и клонирование было невозможно. Кроме того, клонирование, даже если бы оно работало, занимало лишь на 15 минут меньше времени чем экспорт/импорт, время поджимало, а этими 15 минутами можно было пожертвовать.&lt;br /&gt;
Тестовый перенос данных прошел нормально, но когда совершил реальный переезд на новый сервак, обнаружил страшное (увы, лишь спустя часа два) - данные в снэпшотах не обновляются, основанная на матвью репликация не работает, а вместо самих матвью на новой базе имеются лишь таблицы с теми же именами. Мой прокол, надо решать, перезаливка не помогла, в дампе данные лишь о таблицах, старый сервер уже отключен. Пересоздание 90% материализованных представлений удалось, но оставались 3 таких, которые занимают больше 1Гб, а реплицируются с удаленного сервера по забитому каналу, средняя скорость по которому иногда доходит до 200КБит/с. Нереально...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Задача&lt;/b&gt;&lt;br /&gt;
В итоге стала задача: сделать complete refresh для соответствующих матвью, master table, для которых занимают более 1Гб, а канал узкий до нельзя. Как?&lt;br /&gt;
Для простоты обозначим следующие названия:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;исходная база: master_db&lt;/li&gt;
&lt;li&gt;хост исходной базы: master_host&lt;/li&gt;
&lt;li&gt;целевая база: target_db&lt;/li&gt;
&lt;li&gt;хост целевой базы: target_host&lt;/li&gt;
&lt;li&gt;линк с целевой базы на исходную: repl_link&lt;/li&gt;
&lt;li&gt;таблицы пусть называются passes, acts&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Решение&lt;/b&gt;&lt;br /&gt;
Последовательность следующая:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;i&gt;(&lt;/i&gt;&lt;i&gt;если были матвью)&lt;/i&gt; удалить матвью на целевой базе;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;(&lt;/i&gt;&lt;i&gt;в моем случае либо mview on prebuilt table)&lt;/i&gt; удалить таблицы на целевой базе;&lt;/li&gt;
&lt;li&gt;сделать дамп таблиц на исходной базе;&lt;/li&gt;
&lt;li&gt;сжать дамп, передать на целевой сервер;&lt;/li&gt;
&lt;li&gt;залить таблицы на целевую базу;&lt;/li&gt;
&lt;li&gt;создать матвью на целевой базе;&lt;/li&gt;
&lt;li&gt;обновить с FAST REFRESH.&lt;/li&gt;
&lt;/ul&gt;
Если подробнее, то выглядит это так:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;i&gt;(если были матвью)&lt;/i&gt; Удаление матвью&lt;br /&gt;
&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MASTER_DB SQL&amp;gt; drop materialized view passes;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;
  &lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MASTER_DB SQL&amp;gt; drop materialized view acts;&lt;/span&gt;&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;i&gt;(в моем случае&lt;/i&gt;&lt;i&gt; либо mview on prebuilt table&lt;/i&gt;&lt;i&gt;)&lt;/i&gt; Удаление таблиц &lt;br /&gt;
&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MASTER_DB SQL&amp;gt; drop table passes;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;
  &lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MASTER_DB SQL&amp;gt; drop table acts;&lt;/span&gt;&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Делаем дамп&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MASTER_HOST#&amp;nbsp; expdp username/password directory=data_pump_dir dumpfile=replication.dmp tables=(passes,acts)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Сжатие и передача&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;сжимаем дамп архиватором, неважно каким, в моем случае 1Гб содержал по большей части цифровые и строковые значения, поэтому ужалось до 14Мб&lt;/li&gt;
&lt;li&gt;передаем на target_host обычным копированием и складываем в директорию, куда указывает DATA_PUMP_DIR в TARGET_DB&lt;/li&gt;
&lt;li&gt;распаковываем архив на целевом сервере&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Заливка дампа (необходимо залить только таблицы и, возможно, индексы, т.к. триггеры и констрейнты нам тут не нужны)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TARGET_HOST#&amp;nbsp; impdp username/password directory=data_pump_dir dumpfile=replication.dmp tables=(passes,acts) include=TABLE,INDEX&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Создание матвью&lt;/li&gt;
&lt;ul style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;li&gt;TARGET_DB SQL&amp;gt;&amp;nbsp; create materialized view acts on prebuilt table refresh fast on demand as select * from acts@repl_link;&lt;/li&gt;
&lt;li&gt;TARGET_DB SQL&amp;gt;&amp;nbsp; create materialized view passes on prebuilt table refresh fast on demand as select * from passes@repl_link;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Обновление матвью&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exec dbms_mview.refresh('acts,passes','fast');&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
В итоге мы получаем полностью обновленные MATERIALIZED VIEW на целевой базе, а траффика на это ушло примерно в 100 раз меньше чем при обновлении COMPLETE REFRESH.&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span style="color: #660000;"&gt;&lt;b&gt;Уместное замечание от SergINI:&lt;/b&gt; можно опустить пункт "сжатие" при использовании Advanced Compression, т.к. в этом случае появляется возможность использовать DataPump с параметром COMPRESSION в значениях DATA_ONLY либо ALL, что позволит сжать дамп средствами Oracle. Кроме того, весь этот процесс значительно упрощается при использовании DataPump через DBLink&lt;/span&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;-- &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;P.S: что касается новых шаблонов, вернулся к старому виду, и проще и статистику по просмотрам будет реальную показывать, да и виджеты вернутся на место.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-992593734956644243?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/iOgMKJTOzVk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-07T16:42:50.608+04:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-w0HZxO7CO1M/Sbi1EmKeQQI/AAAAAAAAASc/NCl-TpTWM30/s72-c/pl_RS_SQL_NEW_detail_1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/10/blog-post.html</feedburner:origLink></item><item><title>Новый интерфейс для блогов на Blogspot</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/-Yy5qbmk5Wo/blogspot.html</link><category>Blogger</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Fri, 28 Oct 2011 01:19:31 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-5562136995198353390</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Попробуем новый интерфейс Blogspot. На первый взгляд совсем необычно, но попробую, может оказаться интересным.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-5562136995198353390?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/-Yy5qbmk5Wo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-28T12:19:31.316+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/10/blogspot.html</feedburner:origLink></item><item><title>Oracle Gateway 11.2 для Oracle Database 10.2 для WinX64</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/SF50dW9h_zY/oracle-gateway-112-oracle-database-102.html</link><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 21 Sep 2011 02:38:25 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-5439207955819086970</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
&lt;img height="225" src="https://lh5.googleusercontent.com/-sCR7aL9RuvA/TniD6YYP9JI/AAAAAAAAAzU/oypLTT5amxo/w335-h236-k/image1.png" width="320" /&gt; &lt;/div&gt;
Многие из тех, кому по той или иной причине приходится администрировать СУБД Oracle на платформе Windows Server, кто переехал на 64-битную платформу, были неприятно удивлены, что такая простая штука как hsodbc теперь не работает (касается версий Oracle выше 9.2).&lt;br /&gt;
&lt;br /&gt;
Весьма неприятное известие для тех, кто собирает данные из множества сторонних баз, MS SQL Server, DB2 и даже, если у вас кто-то предоставляет данные в виде регулярно обновляемого Excel-файла или базы в Access или dBase, было проще всего организовать ODBC-коннект через HSODBC. Но халява кончилась...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Итак, какие у нас есть возможности решения данной проблемы:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;рядом с Oracle Database 10.1-11.2 для Windows x64 поставить 32-битную версию Oracle Database, настроить в ней hsodbc, настроить Listener на нестандартный порт;&lt;/li&gt;
&lt;li&gt;извращаться с инициацией передачи данных со стороны источника;&lt;/li&gt;
&lt;li&gt;установить Oracle Database Gateway 11.2 и организовать коннект через него.&lt;/li&gt;
&lt;/ul&gt;
Сейчас речь пойдет о последнем варианте как наиболее правильном. Хотя то, что этот вариант наиболее правильный, не значит, что с ним не будет проблем.&lt;br /&gt;
&lt;br /&gt;
Последовательность действий следующая:&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Качаем дистрибутив Oracle Database Gateway 11.2 отсюда: &lt;a href="http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html"&gt;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Устанавливаем Gateway &lt;b&gt;в отдельный Oracle Home&lt;/b&gt;, назовем его OraGtw_home. При установке обязательно выбираем Gateway for ODBC и Net Listener.&lt;/li&gt;
&lt;li&gt;Правим системную переменную PATH так, чтобы путь к OraGtw_home\bin находился после пути к bin от основной базы. &lt;/li&gt;
&lt;li&gt;Настраиваем ODBC-коннектор для 64-битной системы: &lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Настраиваем системный DSN через классическую админку ODBC.&lt;/li&gt;
&lt;li&gt;Запускаем regedit и ищем ключ созданного DSN, пусть это будет MSDB, находиться он будет примерно по такому пути: HKLM\SOFTWARE\Wow6432Node\ODBC\ODBC.INI\MSDB&lt;/li&gt;
&lt;li&gt;Экспортируем этот ключ и редактируем полученный файл и убираем из пути ключа Wow6432Node чтобы путь получился примерно следующим: HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\MSDB&lt;/li&gt;
&lt;li&gt;Теперь необходимо этот ключ импортировать, но не делайте это по привычке двойным щелчком на reg-файле, он запихнет ключ на исходное место в Wow6432Node, делать это надо через File-&amp;gt;Import в regedit.&lt;/li&gt;
&lt;li&gt;ODBC-коннектор готов.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Настраиваем гетерогенный сервис: &lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Идем в OraGtw_home\hs\admin и создаем файл initmsdb.ora с одной лишь строкой:&lt;br /&gt;&lt;blockquote class=""&gt;
HS_FDS_CONNECT_INFO=MSDB&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Настраиваем Listener (тут нет разницы, какой использовать, из Oracle Home от БД или из OraGtw_home, я использовал от БД) как при классической гетерогенке:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Имя листенера должно отличаться от основного, скажем LISTENERGTW&lt;/li&gt;
&lt;li&gt;HOST=&amp;lt;имя хоста с гейтом&amp;gt; &lt;/li&gt;
&lt;li&gt;PORT=&amp;lt;отличный от порта основного слушателя, например 1522&amp;gt;&lt;/li&gt;
&lt;li&gt;SID_NAME=MSDB&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;В итоге у нас должен получиться такой конфиг (либо его часть при использовании уже существующего):&lt;br /&gt;&lt;blockquote&gt;
&lt;span style="color: red;"&gt;# Заменить выделенное на свои значения &lt;/span&gt;&lt;br /&gt;
LISTENERGTW =&lt;br /&gt;
&amp;nbsp; (DESCRIPTION_LIST =&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (DESCRIPTION =&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = &lt;span style="color: red;"&gt;&amp;lt;имя хоста&amp;gt;&lt;/span&gt;)(PORT = &lt;span style="color: red;"&gt;&amp;lt;порт&amp;gt;&lt;/span&gt;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;
&amp;nbsp; )&lt;br /&gt;
&lt;br /&gt;
SID_LIST_LISTENERGTW=&lt;br /&gt;
&amp;nbsp; (SID_LIST=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SID_DESC=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SID_NAME=&lt;span style="color: red;"&gt;msdb&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ORACLE_HOME=&lt;span style="color: red;"&gt;&amp;lt;OraGtw_home&amp;gt;&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROGRAM=&lt;span style="color: red;"&gt;&amp;lt;OraGtw_home&amp;gt;&lt;/span&gt;\bin\dg4odbc.exe )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;
&amp;nbsp; )&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;lsnrctl start LISTENERGTW &lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Настраиваем подключение из Oracle Database:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Делаем запись в TNSNAMES.ORA в Oracle Home базы данных:&lt;br /&gt;&lt;blockquote&gt;
MSDB.CPCPIPE.RU =&lt;br /&gt;
&amp;nbsp; (DESCRIPTION =&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = &lt;span style="color: red;"&gt;&amp;lt;имя хоста&amp;gt;&lt;/span&gt;)(PORT = &lt;span style="color: red;"&gt;&amp;lt;порт&amp;gt;&lt;/span&gt;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (CONNECT_DATA =&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SID = &lt;span style="color: red;"&gt;msdb&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (HS = OK)&lt;br /&gt;
&amp;nbsp; )&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt; Создаем Database Link:&lt;br /&gt;&lt;blockquote&gt;
CREATE DATABASE LINK &lt;span style="color: red;"&gt;msdb_link&lt;/span&gt; CONNECT TO&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;msuser &lt;/span&gt;IDENTIFIED BY &lt;span style="color: red;"&gt;mspass&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USING '&lt;span style="color: red;"&gt;msdb&lt;/span&gt;';&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Проверяем:&lt;br /&gt;SQL&amp;gt; select * from dual@&lt;span style="color: red;"&gt;msdb_link&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;DUMMY&lt;br /&gt;-----&lt;br /&gt;X&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Возможные проблемы&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ситуация 1&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Ошибка: &lt;br /&gt;
ORA-28513: internal error in heterogeneous remote agent&lt;br /&gt;
ORA-02063: preceding line from MSDB_LINK&lt;/li&gt;
&lt;li&gt;Источник проблемы в неправильной настройке гетерогенного сервиса, как правило, это означает, что:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;в OraGtw_home\hs отсутствует файл init&amp;lt;SID&amp;gt;.ora, т.е. в нашем примере initmsdb.ora;&lt;/li&gt;
&lt;li&gt;либо в этом файле указан неверный DSN;&lt;/li&gt;
&lt;li&gt;либо DSN отсутствует в настройках ODBC для 64-битных приложений.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Детали проблемы прекрасно видны в логах listenergtw.log.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Ситуация 2&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Ошибка: &lt;br /&gt;
ORA-28546: connection initialization failed, probable Net8 admin error&lt;br /&gt;ORA-02063: preceding line from TEST_NAVI&lt;/li&gt;
&lt;li&gt;Источник проблемы где-то в TNSNAMES, скорее всего просто нужно пересчитать скобки в конфигурационном файле и перепроверить положение записи (HS=OK).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;/ol&gt;
&lt;i style="color: #cc0000;"&gt;Если кто знает способ редактирования ODBC для 64-битных программ без возни с реестром, пожалуйста, подскажите.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Буду рад, если это поможет кому-нибудь безболезненно переехать с HSODBC на Database Gateway for ODBC.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-5439207955819086970?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/SF50dW9h_zY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-21T13:38:25.053+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/09/oracle-gateway-112-oracle-database-102.html</feedburner:origLink></item><item><title>Деление на ноль? Легко!</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/-y89qAyH7js/blog-post.html</link><category>Oracle</category><category>Just for Fun</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 01 Jun 2011 04:07:42 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-7613242689454173906</guid><description>Q: can oracle divide by zero?&lt;br /&gt;
A: no&lt;br /&gt;
Q: are you absolutely sure?&lt;br /&gt;
A: yes&lt;br /&gt;
Q: then why does this work?&lt;br /&gt;
select 1 from dual where exists (select 1/0 from dual)&lt;br /&gt;
A: ????&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://laurentschneider.com/wordpress/2007/07/oracle-certified-sql-expert.html"&gt;Отсюда&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
P.S: реально работает и я действительно не понимаю, почему, вернее догадываюсь, но...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-7613242689454173906?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/-y89qAyH7js" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-01T15:07:42.305+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/06/blog-post.html</feedburner:origLink></item><item><title>ROWNUM в разных ситуациях</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/SBn2DGcwGGw/rownum.html</link><category>запомнить</category><category>Oracle</category><category>Just for Fun</category><category>фишки</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Mon, 18 Apr 2011 07:08:04 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-6901789854736125597</guid><description>А знаете ли вы что... функция &lt;b&gt;ROWNUM &lt;/b&gt;в разных ситуациях ведет себя по-разному. Так вот, не так давно наткнулись на интересный момент, о котором расскажу ниже.&lt;br /&gt;
&lt;br /&gt;
Все, кто хоть раз пытался использовать &lt;b&gt;ROWNUM &lt;/b&gt;вместе с сортировкой выборки, прекрасно себе представляет, какая каша выдается в итоге. Большинство прекрасно понимает, а Oracle об этом прямо заявляет, что указанная функция не гарантирует верную нумерацию при проведении сортировки.&lt;br /&gt;
На всякий случай показываю, как оно бывает:&lt;br /&gt;
&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SQL&amp;gt; SELECT rownum, t.employee_id, t.first_name, t.last_name&lt;br /&gt;
&amp;nbsp; 2&amp;nbsp; from hr.employees t&lt;br /&gt;
&amp;nbsp; 3&amp;nbsp; order by last_name;&lt;br /&gt;
&lt;br /&gt;
ROWNUM EMPLOYEE_ID FIRST_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LAST_NAME&lt;br /&gt;
------ ----------- --------------- ------------&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 75&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 174 Ellen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Abel&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 67&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166 Sundar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ande&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 130 Mozhe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Atkinson&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 105 David&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Austin&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 105&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 204 Hermann&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Baer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 116 Shelli&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Baida&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 68&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 167 Amit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Banda&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 73&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 172 Elizabeth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bates&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 93&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192 Sarah&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bell&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 52&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 151 David&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bernstein&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 129 Laura&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bissot&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;107 rows selected.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Execution Plan&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;----------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=107 Bytes=2&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;461)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; SORT (ORDER BY) (Cost=4 Card=107 Bytes=2461)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COUNT&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=3 Car&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d=107 Bytes=2461)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
В данном случае можно увидеть по плану, что ROWNUM считается до сортировки (да, COUNT - оно самое), в итоге получаем ту самую кашу.&lt;br /&gt;
А теперь эксперимент, сделаем "ложную" деревянную выборку одного уровня:&lt;br /&gt;
&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;SQL&amp;gt; SELECT rownum, t.employee_id, t.first_name, t.last_name&lt;br /&gt;
&amp;nbsp; 2&amp;nbsp; from hr.employees t&lt;br /&gt;
&amp;nbsp; 3&amp;nbsp; connect by 1=2&lt;br /&gt;
&amp;nbsp; 4&amp;nbsp; order siblings by last_name;&lt;br /&gt;
&lt;br /&gt;
ROWNUM EMPLOYEE_ID FIRST_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LAST_NAME&lt;br /&gt;
------ ----------- --------------- ------------&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 174 Ellen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Abel&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166 Sundar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ande&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 130 Mozhe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Atkinson&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 105 David&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Austin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 204 Hermann&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Baer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 116 Shelli&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Baida&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 167 Amit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Banda&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 172 Elizabeth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bates&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192 Sarah&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bell&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 151 David&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bernstein&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 129 Laura&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bissot&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;107 rows selected.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Execution Plan&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;----------------------------------------------------------&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=107 Bytes=2&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;461)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; COUNT&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONNECT BY (WITHOUT FILTERING)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=3 Car&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d=107 Bytes=2461)&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Забавно, но имея деревянный запрос, дающий такую же выборку (дерево никогда не получит второго уровня по условию 1=2), при &lt;b&gt;ORDER SIBLINGS BY&lt;/b&gt; мы получаем корректные значения &lt;b&gt;ROWNUM&lt;/b&gt;. Кроме того, в случае деревянной выборки сортировка производится как бы без сортировки (где-то в CONNECT BY (WITHOUT FILTERING) или еще где, надо трейсы смотреть), а ROWNUM (все тот же COUNT) выполняется последним перед выдачей клиенту. В результате мы получаем правильную нумерацию.&lt;br /&gt;
&lt;br /&gt;
Обращаю внимание на то, что проход все также один и стоимость запроса остается неизменной.&lt;br /&gt;
&lt;br /&gt;
Но это не более чем эксперименты, показывающие на разницу в работе одних и тех же функций в разных ситуациях, и заставляющие задуматься над некоторыми вещами.&lt;br /&gt;
&lt;br /&gt;
P.S: По факту правильней использовать функцию из аналитики: &lt;b&gt;ROW_NUMBER() OVER (ORDER BY column_name)&lt;/b&gt;, которая гарантированно даст нужный порядок.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-6901789854736125597?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/SBn2DGcwGGw" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-18T18:08:04.850+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/04/rownum.html</feedburner:origLink></item><item><title>Deadlock vs Resource Busy</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/g1oMqMv4XcY/deadlock-vs-resource-busy.html</link><category>Tom Kyte</category><category>Oracle</category><category>фишки</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 14 Apr 2011 08:08:06 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-7744079407791647114</guid><description>В феврале 2010 года в Москву приезжал знаменитый Томас Кайт. Многие это помнят, но не многие запомнили один вопрос Тому в конце встречи, вопрос, на который он не смог ответить.&lt;br /&gt;
Вопрос заключался в ошибке, когда возникает deadlock в одной сессии внутри автономной транзакции, а именно почему при "select .. for update wait N" в случае N&amp;lt;6 возникает ошибка ORA-30006, а при N&amp;gt;=6 - ORA-00060. Тогда Томас был озадачен прилично, в итоге заявив только, что "it is feature".&lt;br /&gt;
В апреле 2010 он &lt;a href="http://tkyte.blogspot.com/2010/04/what-will-happen-if.html"&gt;опубликовал эту ситуевину в своем блоге&lt;/a&gt; и среди возгласов поклонников, пораженных наличием пробелов в знаниях Тома, проскочило несколько комментариев по теме.&lt;br /&gt;
&lt;br /&gt;
Итак... тест (версия 11.2.0.1):&lt;br /&gt;
&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SQL&amp;gt; create table t (x number);&lt;br /&gt;
SQL&amp;gt; insert into t values (1);&lt;br /&gt;
SQL&amp;gt; insert into t values (2);&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; update t set x = x+1;&lt;br /&gt;
&lt;br /&gt;
2 rows updated.&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; declare&lt;br /&gt;
&amp;nbsp; pragma autonomous_transaction;&lt;br /&gt;
&amp;nbsp; l_rec&amp;nbsp; t%rowtype;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; select * into l_rec from t for update wait 5;&lt;br /&gt;
&amp;nbsp; commit;&lt;br /&gt;
end;&lt;br /&gt;
/&lt;br /&gt;
declare&lt;br /&gt;
*&lt;br /&gt;
ERROR at line 1:&lt;br /&gt;
ORA-30006: resource busy; acquire with WAIT timeout expired&lt;br /&gt;
ORA-06512: at line 5&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; declare&lt;br /&gt;
&amp;nbsp; pragma autonomous_transaction;&lt;br /&gt;
&amp;nbsp; l_rec&amp;nbsp; t%rowtype;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; select * into l_rec from t for update wait 7;&lt;br /&gt;
&amp;nbsp; commit;&lt;br /&gt;
end;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/&lt;br /&gt;
declare&lt;br /&gt;
*&lt;br /&gt;
ERROR at line 1:&lt;br /&gt;
ORA-00060: deadlock detected while waiting for resource&lt;br /&gt;
ORA-06512: at line 5&lt;/blockquote&gt;&lt;br /&gt;
Интересно? Не то слово. Но вот что было в комментариях?&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Порядок обнаружения deadlocks продолжает срабатывать каждые 3 секунды (после таймаута), но он не активируется в случае запроса в параметре WAIT значения меньше либо равном 5 секундам. &lt;br /&gt;
&lt;br /&gt;
Этот момент управляется скрытым параметром:&lt;br /&gt;
&lt;br /&gt;
_enqueue_deadlock_time_sec   "requests with timeout &amp;lt;= this will not have deadlock detection", этот параметр по-умолчанию имеет значение 5 секунд.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если WAIT установлен в значение более этого параметра, то проверка наличия неразрешаемых блокировок активируется и срабатывает каждые 3 секунды.&lt;/blockquote&gt;&lt;br /&gt;
То есть, не магические 5 секунд управляют типом ошибки, а именно скрытый параметр, которого, кстати, как бы и нет, но можно установить и в 11.2. Логика, кстати, вполне понятна: блокировку ресурса определить значительно проще, чем запускать процесс обнаружения неразрешаемых взаимных блокировок, т.е. deadlocks. Будете искать параметр - не ищите, ни в v$parameter, ни в memory Вы его не найдете, но вполне срабатывает&lt;br /&gt;
&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;alter system set "_enqueue_deadlock_time_sec"=15 scope=spfile;&lt;/blockquote&gt;... с последующим перезапуском инстанса. Но напоминаю, что не стоит без крайней необходимости скрытые параметры, ведь неспроста они скрыты.&lt;br /&gt;
&lt;br /&gt;
P.S: почему я описал это спустя год? Изучаем 11.2, проверяли взаимные блокировки, вспомнился тот случай. Итог: в случае двух разных сессий всегда ORA-00054, а автономная транзакция обрабатывается все также. &lt;br /&gt;
&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/21381265-7744079407791647114?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/g1oMqMv4XcY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T19:08:06.848+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/04/deadlock-vs-resource-busy.html</feedburner:origLink></item><item><title>SecureLOB?</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/8k7QmCHP4w4/securelob.html</link><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 13 Apr 2011 00:04:22 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-5249752760087940836</guid><description>Сегодня при изучении SecureFiles у одного товарища возник вопрос: "Вот мы можем указывать способы хранения LOB'ов через&lt;br /&gt;
&lt;b&gt;LOB (col_name) STORE AS [SECUREFILE | BASICFILE]&lt;/b&gt;,&lt;br /&gt;
где поведение очевидно, но можно указать &lt;b&gt;SECURELOB&lt;/b&gt;. Что мы получим в результате?"&lt;br /&gt;
&lt;br /&gt;
А в результате мы получим все тот же &lt;b&gt;BASICFILE&lt;/b&gt;. Разработчики Oracle не сильно заморачивались со строгостью новых фишек в DDL и в коде, похоже, поставили "&lt;b&gt;IF SECUREFILE THEN .. ELSE .. END;&lt;/b&gt;". В результате, вместо &lt;b&gt;BASICFILE&lt;/b&gt; можно указывать все, чего душа пожелает, и любое значение кроме &lt;b&gt;SECUREFILE&lt;/b&gt; будет указывать на &lt;b&gt;BASICFILE&lt;/b&gt;.&lt;br /&gt;
&lt;div style="color: red;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;span style="color: red;"&gt;FAIL:&lt;/span&gt;&lt;/b&gt; в комментах ткнули пальцем в доку, а именно в то место, где говорится про segment_name в STORE AS. Таким образом мы можем именовать сегменты (вместо названий типа SYS_LOB0000093350C00023$$), выделяемые под LOB'ы. А именно:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;SQL&amp;gt; create table tttt(a number, cl clob) lob (cl) store as fg;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;SQL&amp;gt; insert into tttt values (1,'sdfsd fas dfasdff');&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;SQL&amp;gt; insert into tttt values (2,'sdfsssssssdfsd fas dfasdff');&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SQL&amp;gt; select segment_name, segment_type from dba_segments where owner='OE' and segment_name='FG';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SEGMENT_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEGMENT_TYPE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;------------------------------ --------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOBSEGMENT&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-5249752760087940836?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/8k7QmCHP4w4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T11:04:22.835+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2011/04/securelob.html</feedburner:origLink></item><item><title>AskTom in Moscow</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/U1tfmX0wdkI/asktom-in-moscow.html</link><category>о жизни</category><category>Tom Kyte</category><category>Oracle</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Fri, 26 Feb 2010 23:07:06 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-4405150646467095804</guid><description>&lt;div style="text-align: justify;"&gt;&lt;img src="http://4.bp.blogspot.com/_-uHoBYhx-1U/S4duB11_a7I/AAAAAAAAAXo/RQpG8xE8Bhk/s320/Tom.png" style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 290px;" src="http://4.bp.blogspot.com/_-uHoBYhx-1U/S4duB11_a7I/AAAAAAAAAXo/RQpG8xE8Bhk/s320/Tom.png" alt="" id="BLOGGER_PHOTO_ID_5442439652612991922" border="0" /&gt;Вернулся с данного мероприятия, наконец добрался до блога.&lt;br /&gt;&lt;br /&gt;Сразу хотел бы выразить благодарность &lt;a href="http://dsvolk.blogspot.com/"&gt;Дмитрию&lt;/a&gt; и Сергею за организацию мероприятия такого уровня. Огромное спасибо также &lt;a href="http://asktom.oracle.com/"&gt;Тому&lt;/a&gt; &lt;a href="http://tkyte.blogspot.com/"&gt;Кайту&lt;/a&gt; за то, что приехал. Если не вспоминать про синхронный перевод, то организация была на высшем уровне.&lt;br /&gt;&lt;br /&gt;О чем рассказывал Том? Worst&amp;amp;Best Practics. Говорил о приятных вещах версии 11.2. Ну и конечно же отвечал на вопросы.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Том оказался удивительным оратором, так умело удерживать внимание в течение 8 часов надо уметь. Интересная факты, юмор, активная жестикуляция, все это привлекает взгляд и заставляет слушать.&lt;br /&gt;&lt;br /&gt;Из неожиданного: почему-то очень долго считал, что AskTom ведется группой специалистов, но Том убедил, что это все он :)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Увы, уже очень давно не удается писать в блог. Банально не хватает времени. Могу лишь надеяться на то, что его будет больше.&lt;br /&gt;&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/21381265-4405150646467095804?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/U1tfmX0wdkI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-27T10:07:06.980+03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-uHoBYhx-1U/S4duB11_a7I/AAAAAAAAAXo/RQpG8xE8Bhk/s72-c/Tom.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2010/02/asktom-in-moscow.html</feedburner:origLink></item><item><title>ГАС "Правосудие" и Краевой суд - 2</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/-dUOpf0mUTU/2.html</link><category>о жизни</category><category>Oracle</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Tue, 07 Jul 2009 04:41:30 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-2088544268098409947</guid><description>Была у меня когда-то заметочка на тему подъема БД в Краевом Суде:&lt;br /&gt;&lt;a href="http://oraclemaniacs.blogspot.com/2007/11/blog-post.html"&gt;Неспящие админы на службе у Краевого Суда&lt;/a&gt;. Но все дело в том, что история не то чтобы повторилась, но восстанавливать базу пришлось там же. Теперь уже была версия 9.2.0.6 в режиме noarchivelog, без бэкапов, вырубился свет, повредились редо-логи и была ругань на system01.dbf.&lt;br /&gt;&lt;br /&gt;Короче если рассказывать, пропуская массу всего веселого, то шаги типа:&lt;br /&gt;- подмена мертвого редо вновь созданным&lt;br /&gt;- пересоздание контрол-файла&lt;br /&gt;- создание pfile и внесение туда пары недокументированных параметров&lt;br /&gt;- поднятие с модифицированным pfile&lt;br /&gt;- рекавери&lt;br /&gt;- open resetlogs&lt;br /&gt;- попытка экспорта&lt;br /&gt;- решение проблем с недостающими объектами&lt;br /&gt;- экспорт (триггеры не экспортнулись, увы...)&lt;br /&gt;- создание новой базы, выключение мертвой&lt;br /&gt;- инициализация ГАС "Правосудие"&lt;br /&gt;- отключение всех триггеров и внешних ключей&lt;br /&gt;- удаление данных&lt;br /&gt;- импорт схемы с IGNORE=y&lt;br /&gt;- включение внешних ключей и триггеров&lt;br /&gt;&lt;br /&gt;В подробностях все было гораздо веселее.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;P.S: &lt;/span&gt;Не используйте в Production базы, на которых даже архивлоги выключены, они могут умереть в любой момент!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;P.P.S:&lt;/span&gt; База, поднятая исключительно за счет недокументированных параметров Oracle - не есть база Oracle, никто не гарантирует её стабильную работу. Не продолжайте её использование, переносите данные, которые можно выдернуть.&lt;br /&gt;&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/21381265-2088544268098409947?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/-dUOpf0mUTU" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T15:41:30.965+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2009/07/2.html</feedburner:origLink></item><item><title>Oracle PL\SQL Fundamentals на Brainbench</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/RcgMS2LHFh4/oracle-plsql-fundamentals-brainbench.html</link><category>о жизни</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 21 May 2009 02:44:45 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-6995461489604363221</guid><description>&lt;div style="text-align: center;"&gt;&lt;div style="text-align: justify;"&gt;Теперь проверял знания Oracle PL\SQL Fundamentals.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;img src="http://www.brainbench.com/images/certlogo/color/mastercert/oracleplsqlfundamentals.gif" style="max-width: 800px;" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt; &lt;/div&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="3"&gt;&lt;tbody&gt;&lt;tr class="rowheader"&gt;&lt;td class="headerFont"&gt;&lt;p&gt;&lt;b&gt;Your Criteria:&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;                &lt;/tr&gt;                &lt;tr&gt;                    &lt;td class="body"&gt;&lt;ol class="body"&gt;&lt;li&gt;Test Module: Oracle PL/SQL Fundamentals&lt;/li&gt;&lt;li&gt;Score: 4.26&lt;/li&gt;&lt;/ol&gt;&lt;/td&gt;                &lt;/tr&gt;                            &lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" border="0" cellpadding="3" cellspacing="3"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td class="headerFont"&gt;&lt;b&gt;Your Ranking Information:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Total Tests Completed:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;10245&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="body"&gt;&lt;b&gt;Your Rank (1 = top):&lt;/b&gt;&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="body"&gt;&lt;b&gt;Your Percentile (99 = top): &lt;/b&gt;&lt;/td&gt;&lt;td&gt;99%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Первый раз статус MASTER! И как назло, я помню пару вопросов, на которые мог но не дал правильного ответа, мало времени было, в некоторых вопросах фразы закручены так, что было тяжко понять, чего от тебя хотят.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-6995461489604363221?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/RcgMS2LHFh4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-21T13:44:45.490+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2009/05/oracle-plsql-fundamentals-brainbench.html</feedburner:origLink></item><item><title>Oracle покупает компанию Sun!</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/ca0AlxnAMXk/oracle-sun.html</link><category>News</category><category>Oracle</category><category>Покупки и продажи</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Mon, 20 Apr 2009 06:38:55 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-59073572291658107</guid><description>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.sun.com/featured-articles/2009-0403/feature/images/zot_sun_s_oracle_b.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 195px; height: 98px;" src="http://www.sun.com/featured-articles/2009-0403/feature/images/zot_sun_s_oracle_b.gif" alt="" border="0" /&gt;&lt;/a&gt;Случилось то, чего мало кто ждал, Oracle покупает Sun Microsystems за $7.4 миллиарда! Интересно то, что эту же цену ($9.50 за акцию) предлагала IBM, но Sun запросила больше ($9.55).&lt;br /&gt;&lt;/div&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div style="text-align: justify;"&gt;"Oracle и Sun являются пионерами в индустрии и тесными партнерами в течение более 20 лет", говорит президент Sun, Скотт Макнили (Scott McNealy). "Это объединение является естественным продолжением наших взаимоотношений и оно станет определяющим событием в индустрии".&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Больше информации в новости на &lt;a href="http://www.sun.com/third-party/global/oracle/index.jsp"&gt;сайте Sun&lt;/a&gt; и на &lt;a href="http://www.oracle.com/sun/index.html"&gt;сайте Oracle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Поговаривают, что IBM в одностороннем порядке отказалась от дальнейших переговоров с Sun потому, что получила неофициальные данные о том, что антимонопольные коммитеты США и Европы потребуют дополнительной проверки по данной сделке, что займет 6-8 месяцев.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-59073572291658107?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/ca0AlxnAMXk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T17:38:55.087+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2009/04/oracle-sun.html</feedburner:origLink></item><item><title>Использование неявных курсоров при DML-операциях</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/k_TnHwyAPQc/dml.html</link><category>FAQ</category><category>Oracle</category><category>фишки</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 12 Mar 2009 23:10:01 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-8454971097265447224</guid><description>&lt;div style="text-align: justify;"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 133px; height: 133px;" src="http://3.bp.blogspot.com/_-uHoBYhx-1U/Sbi1EmKeQQI/AAAAAAAAASc/7FwEsk0OaBM/s320/pl_RS_SQL_NEW_detail_1.png" alt="" id="BLOGGER_PHOTO_ID_5312194851052077314" border="0" /&gt;Наверняка у многих возникала необходимость внутри PL\SQL блока проверить, сколько строк было вставлено, удалено или обновлено последней DML-операцией. Все знают, что где-то оно должно быть, но не все представляют где. В SQL*Plus да и в различных оболочках для работы с БД мы видим надписи&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;SQL&amp;gt; UPDATE test_tab t SET t.col1=1;&lt;br /&gt;&lt;br /&gt;3 rows updated&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Но как проверить результат выполнения в коде?&lt;br /&gt;Для подобных целей в СУБД Oracle предусмотрен неявный курсор, который позволяет читать информацию о последнем отработавшем курсоре. Удивительно, но имя ему SQL!&lt;br /&gt;Данный неявный курсор имеет следующие атрибуты: %FOUND, %ISOPEN, %NOTFOUND, и %ROWCOUNT.&lt;br /&gt;&lt;b&gt;%FOUND&lt;/b&gt; показывает, было ли изменение строк.&lt;br /&gt;&lt;b&gt;%NOTFOUND&lt;/b&gt; - DML-операция не смогла изменить строки.&lt;br /&gt;&lt;b&gt;%ROWCOUNT&lt;/b&gt; - на какое количество строк распространялась DML-операция.&lt;br /&gt;&lt;b&gt;%ISOPEN&lt;/b&gt; - всегда FALSE, т.к. СУБД закрывает все курсоры, связанные с SQL-выражением, сразу после завершения DML-операции.&lt;br /&gt;&lt;br /&gt;Пример из официальной документации:&lt;br /&gt;&lt;pre&gt;&lt;code class="sql"&gt;CREATE TABLE employees_temp AS SELECT * FROM employees;&lt;br /&gt;BEGIN&lt;br /&gt;  UPDATE employees_temp &lt;br /&gt;     SET salary = salary * 1.05 &lt;br /&gt;   WHERE salary &amp;lt; 5000;&lt;br /&gt;&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || &lt;br /&gt;                       ' salaries.');&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;Решил попробовать прицепить подсветку синтаксиса от &lt;a href="http://softwaremaniacs.org/"&gt;Ивана Салагаева&lt;/a&gt;. Посмотрим как там чего.&lt;br /&gt;UPD: не получается...&lt;br /&gt;UPD: получилось!&lt;br /&gt;&lt;br /&gt;С уважением,&lt;br /&gt;Дмитрий Богомолов&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-8454971097265447224?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/k_TnHwyAPQc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T09:10:01.440+03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_-uHoBYhx-1U/Sbi1EmKeQQI/AAAAAAAAASc/7FwEsk0OaBM/s72-c/pl_RS_SQL_NEW_detail_1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2009/03/dml.html</feedburner:origLink></item><item><title>[напоминалка] Ошибка в скрипте создания базы с помощью DBCA</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/YSwKaNkuRJo/dbca.html</link><category>FAQ</category><category>запомнить</category><category>bug</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 23 Oct 2008 03:39:33 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-6531130701439800174</guid><description>&lt;p&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_-uHoBYhx-1U/SLZZjxlqtPI/AAAAAAAAAN0/OSlIHTD-PDA/s1600/warning.png" border="0" /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;В некоторых случаях Oracle Database Configuration Assistant (DBCA) при формировании скрипта по созданию базы создает некорректный батник [sid_name.bat]. Я натыкался на эту ошибку и в версии 8.1.7 и в различных 9.2.0.х. Две строки имеют вид:&lt;/p&gt;&lt;p&gt;[Ljava.lang.String;@2a369f&lt;br /&gt;[Ljava.lang.String;@2a36d7&lt;br /&gt;&lt;/p&gt;&lt;p&gt;При этом коды ошибок могут отличаться, что затрудняет поиск быстрого решения (по крайней мере в первый раз).&lt;/p&gt;&lt;p&gt;На самом деле все просто до безобразия... Вот эти строки:&lt;/p&gt;&lt;p&gt;oradim.exe -new  -sid [sid_name] -startmode m&lt;br /&gt;oradim.exe -edit  -sid [sid_name] -startmode a&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Само собой разумеется, что вместо [sid_name] везде необходимо подставить имя базы, которую Вы создаете.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-6531130701439800174?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/YSwKaNkuRJo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-23T14:39:33.630+04:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-uHoBYhx-1U/SLZZjxlqtPI/AAAAAAAAAN0/OSlIHTD-PDA/s72-c/warning.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/10/dbca.html</feedburner:origLink></item><item><title>[Напоминалка] Materialized View и Database Link</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/7xQkNoPmrWM/materialized-view-database-link.html</link><category>запомнить</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 15 Oct 2008 00:11:45 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-4166132487844032570</guid><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dailygalaxy.com/photos/uncategorized/2007/09/18/human_brain_neuron_2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 234px; height: 175px;" src="http://www.dailygalaxy.com/photos/uncategorized/2007/09/18/human_brain_neuron_2.jpg" alt="" border="0" /&gt;&lt;/a&gt;Необходимо запомнить такой момент:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;При создании Materialized View из выборки, в которой используется обращение к удаленной базе через DBLink (неважно, непосредственно или через синоним), необходимо использовать ключ "WITH ROWID" либо "WITH PRIMARY KEY" иначе получаем ORA-00942. Почему эту ошибку, объяснения не вижу даже на горизонте, но... В общем надо принять как данность.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-4166132487844032570?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/7xQkNoPmrWM" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-15T11:11:45.821+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/10/materialized-view-database-link.html</feedburner:origLink></item><item><title>[напоминалка] Перевод строки в Oracle</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/FwYDaP9uMj4/oracle.html</link><category>запомнить</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 15 Oct 2008 00:12:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-6840901727287756148</guid><description>&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_-uHoBYhx-1U/SLZZjxlqtPI/AAAAAAAAAN0/OSlIHTD-PDA/s1600/warning.png" border="0" /&gt;&lt;span style="font-weight: bold;"&gt;Надо запомнить!!!&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Перевод строки в Oracle выполняется лишь 10м символом, независимо от платформы! А ведь промучался с динамическим PL\SQL-кодом 3 дня! Думал сначала на права, потом на свои руки, потом на индусов, потом опять на свои руки, а вот в результате оказалось, что вместо chr(13)||chr(10) надо было ставить просто chr(10). И все, джобы с динамически сформированным кодом заработали.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-6840901727287756148?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/FwYDaP9uMj4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-15T11:12:11.712+04:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_-uHoBYhx-1U/SLZZjxlqtPI/AAAAAAAAAN0/OSlIHTD-PDA/s72-c/warning.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/08/oracle.html</feedburner:origLink></item><item><title>Oracle Metalink меняет пользовательский интерфейс</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/gcNGTcUq_Ew/oracle-metalink.html</link><author>noreply@blogger.com (Igogo)</author><pubDate>Thu, 16 Oct 2008 03:16:59 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-6090858980329257657</guid><description>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-uHoBYhx-1U/SPcUWD82O1I/AAAAAAAAAQY/uYx7yAA_obc/s1600-h/database_clr.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: top; cursor: pointer;" src="http://4.bp.blogspot.com/_-uHoBYhx-1U/SPcUWD82O1I/AAAAAAAAAQY/uYx7yAA_obc/s320/database_clr.gif" alt="" id="BLOGGER_PHOTO_ID_5257693459228539730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="entry"&gt; &lt;p&gt;Сегодня тест-драйв &lt;img src="http://www.gorovoy.org.ua/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; &lt;a href="http://csm.oracle.com/"&gt;http://csm.oracle.com/&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Хорошая новость(имхо, старый приелся уже да и не очень удобно раньше был продуман).&lt;/p&gt; &lt;p&gt;Новый - удобен, красиво сделано.&lt;/p&gt; &lt;p&gt;В общем приятное впечатление. Ждем выхода в народ. &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-6090858980329257657?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/gcNGTcUq_Ew" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-16T14:16:59.468+04:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_-uHoBYhx-1U/SPcUWD82O1I/AAAAAAAAAQY/uYx7yAA_obc/s72-c/database_clr.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/07/oracle-metalink.html</feedburner:origLink></item><item><title>Генерация DDL объектов базы данных</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/QDcTBpIrYN0/ddl.html</link><category>FAQ</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 12 Mar 2009 05:43:33 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-8527508241188430754</guid><description>&lt;div style="text-align: justify;"&gt;Можете кидать в меня тухлыми яйцами, но я только полчаса назад открыл для себя встроенную процедуру генерации DDL.&lt;br /&gt;Для тех, кто вместе со мной тщетно пытается догнать парозов прогресса, в первом вагоне которого сидит Ларри Эллисон, прилагаю запрос, который генерирует DDL всех таблиц необходимой Вам схемы:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;SELECT DBMS_METADATA.GET_DDL(object_type, object_name, owner)&lt;br /&gt;  FROM DBA_OBJECTS t&lt;br /&gt; WHERE t.object_type = 'TABLE'&lt;br /&gt;   AND OWNER = 'DAD'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;P.S: Извиняюсь за большую задержку с заметками про различные IDE для дизайна баз данных, на этих выходных заканчиваю переезд на новую квартиру и обязательно найду немного времени для того, чтобы откопать дипломный проект любимой жены в которой мы совместно проводили сравнительный анализ BP/ERwin, Rational Rose, ARIS, JDeveloper и еще чего-то там. Работе уже 3 года, но б&lt;span style="font-weight: bold; font-style: italic;"&gt;о&lt;/span&gt;льшую часть можно выложить.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-8527508241188430754?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/QDcTBpIrYN0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T15:43:33.796+03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/05/ddl.html</feedburner:origLink></item><item><title>Не удается удалить бэкапы?</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/k72Pw0jy8QM/blog-post.html</link><category>rman</category><category>bug</category><category>Oracle</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 21 May 2008 05:06:33 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-9126160498887699104</guid><description>Всем доброго дня!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Сегодня столкнулся с такой проблемой, не удаляются старые, вернее даже устаревшие, бэкапы. Топаю в RMAN, набираю "DELETE OBSOLETE;" и получаю...&lt;br /&gt;&lt;br /&gt;RMAN-03002: failure of delete command at 21/05/2008 10:37:34&lt;br /&gt;RMAN-00600: internal error, arguments [8225] [INVALID] [] [] []&lt;br /&gt;&lt;br /&gt;Думал, Google мне чего-нибудь подскажет, но он усиленно молчал на счет этой проблемы. Тогда полез на &lt;a href="http://metalink.oracle.com/"&gt;Metalink&lt;/a&gt; и обнаружил что &lt;s&gt;у нас снова появился к нему доступ&lt;/s&gt; к этой проблеме есть workaround. Проблема оказалась в архивах редо логов.&lt;br /&gt;&lt;br /&gt;В наличии имеется баг &lt;a href="https://metalink.oracle.com/metalink/plsql/showdoc?db=Bug&amp;amp;id=4612903"&gt;Bug 4612903&lt;/a&gt; и следующее &lt;a href="https://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=NOT&amp;amp;p_id=343731.1"&gt;решение&lt;/a&gt; (надеюсь, не нанесу компании Oracle грандиозного урона перепечаткой двух команд):&lt;br /&gt;&lt;/div&gt;1. Бэкапим все архивлоги с опцией delete input, смысл в том, чтобы.&lt;br /&gt;2. Удаляем устаревшие (obsolete), можно с опцией noprompt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-9126160498887699104?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/k72Pw0jy8QM" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T16:06:33.074+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/05/blog-post.html</feedburner:origLink></item><item><title>Проектирование: CA ERwin Data Modeler</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/42HYcQzj9qY/ca-erwin-data-modeler.html</link><category>проектирование</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 21 May 2008 05:07:06 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-1842196606779804250</guid><description>Всем доброго дня!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Сегодня хотелось бы обратиться не непосредственно к программированию в Oracle, а к средам проектирования баз данных и не только. Ведь дизайн БД напрямую зависит от архитектуры, дизайна (забудем пока про пользовательский интерфейс) самой разрабатываемой системы. Понятное дело, что у нас, в России, до сих пор большинство систем пишется "на коленке" с проектированием лишь в мыслях. Однако многие переходят либо уже перешли к полноценному проектированию. Начну серию записей о CASE-средствах. Итак...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CA ERwin Data Modeler&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ca.com/images/global/logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.ca.com/images/global/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;Очень удобная штуковина, особенно в случаях, когда процесс проектирования информационной системы начинается с анализа бизнес-процессов.&lt;br /&gt;На первом этапе анализа/проектирования используется CA ERwin Process Modeler. Если была введена достаточная информация о данных, которыми обмениваются бизнес-процессы, то ERwin Data Modeler сможет создать "почти готовую к использованию" логическую модель данных. Логическая модель будет представлять собой денормализованную структуру.&lt;br /&gt;На основе логической модели данных формируется физическая модель данных. Данная среда сама произведет частичную нормализацию структуры (избавится от отношений многие-ко-многим и т.п.), предположит, какие типы данных лучше &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/en/thumb/7/73/ERWin_4.1.4.3643_on_Windows_2000_screenshot.png/730px-ERWin_4.1.4.3643_on_Windows_2000_screenshot.png"&gt;&lt;img style="margin: 10pt 0px 0px 10pt; float: right; cursor: pointer; width: 150px; height: 122px;" src="http://upload.wikimedia.org/wikipedia/en/thumb/7/73/ERWin_4.1.4.3643_on_Windows_2000_screenshot.png/730px-ERWin_4.1.4.3643_on_Windows_2000_screenshot.png" alt="" border="0" /&gt;&lt;/a&gt;использовать в соответствии с используемой СУБД, расставит индексы и многое многое другое... Можно указывать даже способы физического размещения в соответствии с используемыми опциями.&lt;br /&gt;Возможна синхронизация со структурой в существующей базе данных, имеется обратная взаимосвязь между физической и логической структурой, возможен подход с обратным инжинирингом.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Недостатки и проблемы в использовании?&lt;/span&gt;&lt;br /&gt;Эстетические: некрасивые имена для констрейнтов, индексов и прочего, что создается автоматом, никакого соответствия с именем объекта.&lt;br /&gt;Практические: создается очень много констрейнтов, поэтому надо подходить к проектированию аккуратно дабы потом не отключать пару десяткой уникальных индексов, проверок, и прочих бонусов, обеспечивающих целостность данных.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Сайт разработчика:&lt;/span&gt; &lt;a href="http://www.ca.com/us/database-design.aspx"&gt;CA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Далее:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rational Rose&lt;/li&gt;&lt;li&gt;Enterprise Architect&lt;/li&gt;&lt;li&gt;Oracle JDeveloper&lt;/li&gt;&lt;li&gt;Oracle Designer&lt;/li&gt;&lt;li&gt;Sybase PowerDesigner&lt;/li&gt;&lt;li&gt;DeZign от Datanamic&lt;/li&gt;&lt;li&gt;Embarcadero ER/Studio&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;А что используете вы?&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-1842196606779804250?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/42HYcQzj9qY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T16:07:06.924+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/ca-erwin-data-modeler.html</feedburner:origLink></item><item><title>Расчет разницы между датами</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/gEJ2bXYLNqo/blog-post_25.html</link><category>FAQ</category><category>Oracle</category><category>фишки</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 12 Mar 2009 05:44:39 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-2900667790037584874</guid><description>&lt;div style="text-align: justify;"&gt;Наткнулся сегодня на заметку на &lt;a href="http://oracletipstricks.blogspot.com/2008/04/computing-date-differences.html"&gt;Oracle Tips &amp;amp; Tricks&lt;/a&gt; со схожим названием. В заметке рассматривается забавный нюанс работы с типом Date в СУБД Oracle. Рассмотрим этот нюанс, так сказать, на русском.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Банальность.&lt;/span&gt;&lt;br /&gt;Как многие помнят, большинство сред хранит дату как разницу между этой самой датой и некой опорной датой, в виде числа. Таким образом &lt;span style="font-weight: bold;"&gt;01.04.2008-3.111&lt;/span&gt; будет представляться пользователю, конечно, как &lt;span style="font-weight: bold;"&gt;28.03.2008 21:20:10&lt;/span&gt;, однако храниться дата будет с большей точностью. Т.е. при выполнении действия &lt;span style="font-weight: bold;"&gt;01.04.2008-3.111-&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;01.04.2008&lt;/span&gt; мы получим &lt;span style="font-weight: bold;"&gt;-3.111&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Особенности.&lt;/span&gt;&lt;br /&gt;При работе в СУБД Oracle необходимо отметить такие нюансы:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Числовые типы данных хранятся в десятичном формате.&lt;/li&gt;&lt;li&gt;Точности большей чем до секунд добиться при использовании типа DATE в СУБД Oracle невозможно.&lt;/li&gt;&lt;/ol&gt;Вернемся к примеру, описанному выше.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Пример.&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;SQL&gt; select to_date('01.04.2008')-3.111 from dual;&lt;br /&gt;&lt;br /&gt;TO_DATE('01.04.2008')-3.111&lt;br /&gt;---------------------------&lt;br /&gt;28.03.2008 21:20:10&lt;br /&gt;&lt;br /&gt;SQL&gt; select to_date('01.04.2008')-3.111-to_date('01.04.2008') from dual;&lt;br /&gt;&lt;br /&gt;TO_DATE('01.04.2008')-3.111-TO&lt;br /&gt;------------------------------&lt;br /&gt;          -3,11099537037037&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Проблема? Нет, особенность!&lt;/span&gt;&lt;br /&gt;Рассмотрим 3.111 в виде дельты между датами. Что мы получим?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;3.111*24*60*60 = 3 дня 2 часа 39 минут 50&lt;/span&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;.4&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; секунды&lt;br /&gt;&lt;/span&gt;При преобразовании к дате мы теряем те самые 0.4 секунды и получаем дельту&lt;span style="font-style: italic;"&gt;3 дня 2 часа 39 минут 50&lt;/span&gt;&lt;span style="font-style: italic;"&gt; секунды&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.  &lt;/span&gt;Соответственно при обратном пересчете мы получим ((50/60+39)/60+2)/24+3 =  3.11099537037037. Так что вот так.&lt;br /&gt;&lt;br /&gt;Будьте аккуратны с неявным преобразованием данных!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-2900667790037584874?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/gEJ2bXYLNqo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T15:44:39.230+03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/blog-post_25.html</feedburner:origLink></item><item><title>Toad for Oracle 9.6</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/QEyRXtiDUZ0/toad-for-oracle-96.html</link><author>noreply@blogger.com (Igogo)</author><pubDate>Wed, 12 Nov 2008 22:52:21 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-3237150993895778556</guid><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_v8fhjlwwt40/SA9m-jPDfyI/AAAAAAAAAAU/qbOuTWlNYQA/s1600-h/1202212381_toad_9.5.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_v8fhjlwwt40/SA9m-jPDfyI/AAAAAAAAAAU/qbOuTWlNYQA/s320/1202212381_toad_9.5.jpg" alt="" id="BLOGGER_PHOTO_ID_5192482120177778466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Обнаружил, что на подходе (&lt;a href="http://www.quest.com/events/listdetails.aspx?contentid=7231&amp;amp;technology=&amp;amp;prod=&amp;amp;prodfamily=&amp;amp;loc="&gt;7 мая 2008 США&lt;/a&gt; ) версия 9.6 сего замечательного инструмента.&lt;br /&gt;&lt;br /&gt;Кстати, вопрос: - Кто, какими инструментами пользуется в работе с любимой СУБД?&lt;br /&gt;&lt;br /&gt;Что используют администраторы базы которые живут в линуксе?&lt;br /&gt;&lt;br /&gt;Поправка -  не считая родных решений Оракла.&lt;br /&gt;&lt;br /&gt;Для 10-ки есть браузерная версия Enterprise Manager для 9-ки - нет, зато у каждого админа есть  куча скриптов, помогающих в жизни. Захотелось не обычного типа ЕМ для 9.&lt;br /&gt;&lt;br /&gt;Погуглил я в поиске ответа на вопрос: "Какие инструменты для администрирования есть на просторах Open source"?&lt;br /&gt;&lt;br /&gt;Нашел ряд проектов 2/3 из которых уже не жильцы. phpOraAdmin - довольно скудный набор функций.  Для мониторинга есть ZABOra от  &lt;a href="http://www.zabbix.com/forum/showthread.php?t=5003"&gt;Zabbix&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Неужели никому не интересно иметь под рукой настраиваемый под свои нужды "тонкий" клиент Оракла?  Или уже все ушли в 10 и 11 версии?&lt;br /&gt;&lt;br /&gt;Я занялся изучением PHP и Ajax  и захотелось сделать что-то аналогичное.&lt;br /&gt;&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/21381265-3237150993895778556?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/QEyRXtiDUZ0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T09:52:21.804+03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_v8fhjlwwt40/SA9m-jPDfyI/AAAAAAAAAAU/qbOuTWlNYQA/s72-c/1202212381_toad_9.5.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/toad-for-oracle-96.html</feedburner:origLink></item><item><title>Oracle залатала четыре десятка дыр в своих продуктах</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/OQie1SPOcV0/oracle_20.html</link><category>Oracle</category><author>noreply@blogger.com (Dinka)</author><pubDate>Mon, 21 Apr 2008 12:01:14 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-28795991831623125</guid><description>На сайте Oracle &lt;a href="http://www.oracle.com/technology/deploy/security/critical-patch-updates/cpuapr2008.html"&gt;опубликован&lt;/a&gt; очередной бюллетень Critical Patch Update с информацией о новых уязвимостях, обнаруженных в программных продуктах компании.&lt;br /&gt;На этот раз Oracle устранила около четырех десятков дыр в различных пакетах. Уязвимости, в частности, выявлены в сервере приложений Oracle Application Server, СУБД Oracle Database, в комплексе бизнес-приложений Oracle E-Business Suite, CRM-продукте Oracle Siebel Enterprise Suite, а также в комплексе средств для централизованного управления системами Oracle Enterprise Manager.&lt;br /&gt;Наиболее опасные дыры найдены в сервере Oracle Application Server и пакете Oracle E-Business Suite. Эти уязвимости теоретически могут использоваться злоумышленниками с целью получения несанкционированного доступа к системе жертвы. Кроме того, дыры, допускающие удаленный доступ к ПК без аутентификации, устранены в продукте Oracle Siebel Enterprise.&lt;br /&gt;В состав пакета обновлений, помимо заплаток, включены ряд апдейтов, не связанных с безопасностью. Дополнительную информацию об устраненных уязвимостях можно найти &lt;a href="http://www.oracle.com/technology/deploy/security/critical-patch-updates/cpuapr2008.html#PIN"&gt;здесь&lt;/a&gt;. Следующая порция патчей, согласно графику Oracle, должна быть выпущена 15 июля 2008г.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-28795991831623125?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/OQie1SPOcV0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-21T23:01:14.312+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/oracle_20.html</feedburner:origLink></item><item><title>Пользовательские функции аггрегации</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/GP0kwO30roI/blog-post_15.html</link><category>FAQ</category><category>Oracle</category><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 12 Mar 2009 05:47:41 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-1298003518984484087</guid><description>&lt;div style="text-align: justify;"&gt;Встретил сегодня вопрос на &lt;a href="http://www.sql.ru/forum/actualthread.aspx?bid=3&amp;amp;tid=547222"&gt;SQL.RU "Как запросом получить произведение значений всех предыдущих строк?"&lt;/a&gt;, и решил попробовать создать собственную функцию аггрегации. Задача на самом деле проще простого, но редко когда решаемая. Итак...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Вступление.&lt;/span&gt;&lt;br /&gt;Все используют функции аггрегации, такие как MAX, MIN, AVG, SUM и прочие, которые выполняют действие над некоторым массивом данных. Однако время от времени возникает необходимость, скажем, не сложить, а перемножить все значения поля в выборке. В данном случае нам на помощь приходит интерфейс ODCIAggregate.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Краткое описание.&lt;/span&gt;&lt;br /&gt;Интерфейс ODCIAggregate имеет 4 метода:&lt;br /&gt;&lt;ul&gt;&lt;li class="LB1" type="disc"&gt;Initialize&lt;/li&gt;&lt;li class="LB1" type="disc"&gt;&lt;a name="1004619"&gt;&lt;/a&gt;Iterate&lt;/li&gt;&lt;li class="LB1" type="disc"&gt;&lt;a name="1004620"&gt;&lt;/a&gt;Merge&lt;/li&gt;&lt;li class="LB1" type="disc"&gt;&lt;a name="1004621"&gt;&lt;/a&gt;Terminate&lt;/li&gt;&lt;/ul&gt;Чем же они занимаются? По порядку:&lt;br /&gt;1. Initialize. Данный метод выполняет определенные действия перед началом вычислений.&lt;br /&gt;2. Iterate. Собственно метод, выполняющий операцию над очередным значением из массива.&lt;br /&gt;3. Merge. Метод, необходимый в случае распараллеливания выполнения расчета, когда весь массив бьется на части, а потом расчитанные по отдельности они объединяются. Так вот этот метод выполняет объединение пары результатов.&lt;br /&gt;4. Terminate. Метод, заканчивающий расчеты и выдающий результат.&lt;br /&gt;&lt;br /&gt;Кроме того необходимо объявить функцию, которая будет вызывать расчет аггрегатной функции.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Пример.&lt;/span&gt;&lt;br /&gt;Рассмотрим случай, когда нам жизненно необходима функция, перемножающая все значения поля в выборке.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;-- Создаем тип для вычислений&lt;br /&gt;create type MultiImpl as object&lt;br /&gt;(&lt;br /&gt;multires NUMBER, -- результат&lt;br /&gt;static function ODCIAggregateInitialize(sctx IN OUT MultiImpl)&lt;br /&gt; return number,&lt;br /&gt;member function ODCIAggregateIterate(self IN OUT MultiImpl,&lt;br /&gt; value IN number) return number,&lt;br /&gt;member function ODCIAggregateTerminate(self IN MultiImpl,&lt;br /&gt; returnValue OUT number, flags IN number) return number,&lt;br /&gt;member function ODCIAggregateMerge(self IN OUT MultiImpl,&lt;br /&gt; ctx2 IN MultiImpl) return number&lt;br /&gt;);&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;-- Создаем тело типа&lt;br /&gt;&lt;br /&gt;create or replace type body MultiImpl is&lt;br /&gt;-- Функция, выполняющая инициализацию объекта&lt;br /&gt;static function ODCIAggregateInitialize(sctx IN OUT MultiImpl)&lt;br /&gt;return number is&lt;br /&gt;begin&lt;br /&gt;sctx := MultiImpl(1);&lt;br /&gt;return ODCIConst.Success;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;-- Функция, выполняющая расчет&lt;br /&gt;member function ODCIAggregateIterate(self IN OUT MultiImpl, value IN number)&lt;br /&gt;return number is&lt;br /&gt;begin&lt;br /&gt;  -- умножаем текущий результат на очередное значение&lt;br /&gt;  self.multires := self.multires*value;&lt;br /&gt;  return ODCIConst.Success;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;-- Функция, заканчивающая расчет&lt;br /&gt;member function ODCIAggregateTerminate(self IN MultiImpl, returnValue OUT&lt;br /&gt;number, flags IN number) return number is&lt;br /&gt;begin&lt;br /&gt;  returnValue := self.multires; -- Передаем результат в выходной параметр&lt;br /&gt;  return ODCIConst.Success;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;-- На случай распараллеливания&lt;br /&gt;member function ODCIAggregateMerge(self IN OUT MultiImpl, ctx2 IN MultiImpl) return number IS&lt;br /&gt;begin&lt;br /&gt;  -- Просто перемножаем результаты&lt;br /&gt;  self.multires := self.multires*ctx2.multires;&lt;br /&gt;  return ODCIConst.Success;&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;-- Ну и создаем функцию, которая будет вызывать аггрегацию&lt;br /&gt;CREATE FUNCTION Multi (input NUMBER) RETURN NUMBER&lt;br /&gt;PARALLEL_ENABLE AGGREGATE USING MultiImpl;&lt;br /&gt;/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Итог.&lt;/span&gt;&lt;br /&gt;Теперь пробуем использовать то, что получилось:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;SQL&gt; SELECT multi(col)&lt;br /&gt;2    FROM (SELECT 2 AS col&lt;br /&gt;3            FROM dual&lt;br /&gt;4          UNION ALL&lt;br /&gt;5          SELECT 3 AS col&lt;br /&gt;6            FROM dual&lt;br /&gt;7          UNION ALL&lt;br /&gt;8          SELECT 4 AS col&lt;br /&gt;9            FROM dual&lt;br /&gt;10          UNION ALL&lt;br /&gt;11          SELECT NULL AS col&lt;br /&gt;12            FROM dual&lt;br /&gt;13          UNION ALL&lt;br /&gt;14          SELECT 7 AS col&lt;br /&gt;15            FROM dual&lt;br /&gt;16          UNION ALL&lt;br /&gt;17          SELECT 8 AS col FROM dual) t;&lt;br /&gt;&lt;br /&gt;MULTI(COL)&lt;br /&gt;----------&lt;br /&gt;1344&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;пасибо &lt;a href="http://www.blogger.com/profile/18329670133370986067"&gt;Apex&lt;/a&gt; за поправки.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-1298003518984484087?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/GP0kwO30roI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T15:47:41.173+03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/blog-post_15.html</feedburner:origLink></item><item><title>Вставка в несколько таблиц</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/rREz0z6fmMY/blog-post.html</link><category>FAQ</category><category>Oracle</category><category>фишки</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Thu, 12 Mar 2009 06:10:14 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-8930703674945723604</guid><description>"Multi table insert" или вставка одним запросом в несколько таблиц. Наверняка многим не хватало такой фишки, кто как реализовывал ее, но не знали, что это можно реализовать средствами Oracle.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Сегодня встретил заметку в блоге &lt;a href="http://decipherinfosys.wordpress.com/"&gt;"System Engineering and RDBMS"&lt;/a&gt;, в которой &lt;a href="http://decipherinfosys.wordpress.com/2008/04/03/multi-table-insert-in-oracle/"&gt;описывались&lt;/a&gt; конструкции, позволяющие делать вставки в несколько таблиц одним запросом. Сразу скажу, что все это возможно для версий 9i и выше.&lt;br /&gt;Пример:&lt;pre&gt;&lt;code&gt;create table TAB1 (COL1 NUMBER(30), COL2 NUMBER(30) );&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;create table TAB2 (COL3 NUMBER(30), COL4 DATE);&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;CREATE SEQUENCE TEST_SEQ INCREMENT BY 1;&lt;br /&gt;&lt;br /&gt;Sequence created.&lt;br /&gt;&lt;br /&gt;insert&lt;br /&gt;when mod( object_id, 2 ) = 1 then&lt;br /&gt;into TAB1 ( COL1, COL2 ) values ( test_seq.nextval, object_id )&lt;br /&gt;when mod( object_id, 2 ) = 0 then&lt;br /&gt;into TAB2 ( COL3, COL4 ) values ( test_seq.nextval, created )&lt;br /&gt;select object_id, created from all_objects&lt;br /&gt;/&lt;/code&gt;&lt;/pre&gt;Т.е. между INSERT и запросом с исходными данными у нас идет конструкция:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/img/multi_table_insert.gif"&gt; &lt;img src="http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/img/conditional_insert_clause.gif" alt="Description of conditional_insert_clause.gif follows" title="Description of conditional_insert_clause.gif follows" width="669" height="175" /&gt;&lt;/a&gt;&lt;br /&gt;Двумя словами можно описать следующим образом (для тех, у кого плохо с чтением подобных карт):&lt;br /&gt;По некому условию (в качестве параметров условия можно брать значения из исходного запроса) мы делим вставку на несколько, т.е. в зависимости от исходных данных формируем отдельные вставки в разные таблицы либо в одну таблицу но, допустим, в разном формате. Кроме того, мы можем по одному условию делать вставки в несколько таблиц:&lt;pre&gt;&lt;code&gt;...&lt;br /&gt;INTO sales (prod_id, cust_id, time_id, amount)&lt;br /&gt;VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)&lt;br /&gt;INTO sales (prod_id, cust_id, time_id, amount)&lt;br /&gt;VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)&lt;br /&gt;INTO sales (prod_id, cust_id, time_id, amount)&lt;br /&gt;VALUES (product_id, customer_id, weekly_start_date+3, sales_wed)&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;(из примера в документации)&lt;br /&gt;Еще один важный момент, сразу после INSERT указывается ALL (по-умолчанию) либо FIRST, в первом случае все условия проверяются и выполняются все вставки, результат вычисления значений у которых TRUE, во втором варианте проверяются все условия в порядке их указания в запросе до первого FALSE. Вставка, указанная в ELSE, будет выполнена если не выполнено ни одно условие.&lt;br /&gt;Еще несколько примеров из доки:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;INSERT ALL&lt;br /&gt;  WHEN order_total &amp;lt;&amp;gt; 1000000 AND order_total &amp;lt;&amp;gt; 2000000 THEN&lt;br /&gt;     INTO large_orders&lt;br /&gt;  SELECT order_id, order_total, sales_rep_id, customer_id&lt;br /&gt;     FROM orders;&lt;/code&gt;&lt;/pre&gt;Выполняет то же самое что и&lt;br /&gt;&lt;pre&gt;&lt;code&gt;INSERT ALL&lt;br /&gt;  WHEN order_total &amp;lt;&amp;gt; 1000000 AND order_total &amp;lt; 2000000 THEN&lt;br /&gt;      INTO medium_orders&lt;br /&gt;   ELSE&lt;br /&gt;      INTO large_orders&lt;br /&gt;   SELECT order_id, order_total, sales_rep_id, customer_id&lt;br /&gt;      FROM orders;&lt;/code&gt;&lt;/pre&gt;А следующий пример вставляет заказы больше 2900000 в таблицу special_orders, но не вставляет в large_orders:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;INSERT FIRST&lt;br /&gt;  WHEN ottl &amp;lt;&amp;gt; 1000000 and ottl &amp;lt;&amp;gt; 2900000 THEN&lt;br /&gt;     INTO special_orders&lt;br /&gt;  WHEN ottl &amp;gt; 2000000 THEN&lt;br /&gt;     INTO large_orders&lt;br /&gt;        VALUES(oid, ottl, sid, cid)&lt;br /&gt;  SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,&lt;br /&gt;     o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem&lt;br /&gt;     FROM orders o, customers c&lt;br /&gt;     WHERE o.customer_id = c.customer_id;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-8930703674945723604?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/rREz0z6fmMY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T16:10:14.384+03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/blog-post.html</feedburner:origLink></item><item><title>Изменения в пакете FTP</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/iT6tzCYBiqI/ftp.html</link><category>разное</category><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Wed, 21 May 2008 05:09:01 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-1218371983577967050</guid><description>&lt;div style="text-align: justify;"&gt;Сегодня вдруг вспомнил и решил посмотреть, был ли эффект от письма &lt;a href="http://oraclemaniacs.blogspot.com/2008/01/ftp-utltcp.html"&gt;по поводу истории с таймаутами&lt;/a&gt; в пакете &lt;a href="http://www.oracle-base.com/dba/miscellaneous/ftp.pkb"&gt;FTP, предложенном Тимом Холлом&lt;/a&gt;. И заметил, что мои поправочки включены в выложенный на www.oracle-base.com вариант.&lt;br /&gt;&lt;br /&gt;P.S: немного разгреб дела, скоро сделаю парочку технических заметок. Ожидайте.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-1218371983577967050?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/iT6tzCYBiqI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T16:09:01.344+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2008/04/ftp.html</feedburner:origLink></item></channel></rss>

