<?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, 20 May 2012 23:07:28 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">161</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/_1cKVZ3uoFU/blog-post.html</link><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Tue, 13 Mar 2012 04:57:24 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-239582511488212195</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Каким же сложным может оказаться для многих решение простейшей задачи: определение наличия подстроки в строке, но в немного нестандартной ситуации.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Задача:&lt;/b&gt; выбрать из таблицы строки, в которых поле попадает в список значений, перечисленных в строке в виде набора значений через запятую.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;
SQL&amp;gt; create table comparison (serialnum varchar2(10), 
                                   name varchar2(50));

SQL&amp;gt; insert into comparison values ('TST0010021','Table 01');

SQL&amp;gt; insert into comparison values ('MON0000001','Monitor');

SQL&amp;gt; insert into comparison values ('COMP000002','Desktop computer');

SQL&amp;gt; insert into comparison values ('COMP000003','Notebook');

SQL&amp;gt; insert into comparison values ('COMP000004','Notebook for travel');

SQL&amp;gt; select * from comparison;

SERIALNUM&amp;nbsp; NAME
---------- --------------------
TST0010021 Table 01
MON0000001 Monitor
COMP000002 Desktop computer
COMP000003 Notebook
COMP000004 Notebook for travel&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
Самое простое решение "в лоб" - искать подстроку в строке, но большинство даже не подумает сделать обратное сравнение: не "serialnum LIKE '%MP%'", а наоборот:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;SQL&amp;gt; var nums varchar2(33)

SQL&amp;gt; exec :nums := 'MON0000001,COMP000004,TST0010021'

PL/SQL procedure successfully completed.

SQL&amp;gt; select * from comparison where :nums like '%'||serialnum||'%';

SERIALNUM&amp;nbsp; NAME
---------- --------------------
TST0010021 Table 01
MON0000001 Monitor
COMP000004 Notebook for travel&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
Не говорите только, что в таком подходе огромное пространство для разработки SQL-инъекций. Это не так, если использовать связанные (bind) переменные. Но в любом случае, данный пример предназначен для демонстрации обратного сравнения.&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-239582511488212195?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/_1cKVZ3uoFU" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-13T15:57:24.251+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2012/03/blog-post.html</feedburner:origLink></item><item><title>Производительность NVL против COALESCE</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/Ew_0ADGWnPA/nvl-coalesce.html</link><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Tue, 20 Mar 2012 05:39:28 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-5027026280067966852</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
На днях, в поисках способа оптимизировать долгоиграющую процедуру расчета одной модели наткнулся в очередной раз на сравнение COALESCE против NVL.&lt;br /&gt;
Для тех, кто не в курсе, у Oracle есть следующие SQL-функции для обработки значений NULL:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;NVL(expr1, expr2) – в случае, если expr1 IS NOT NULL, выводится expr1, в противном случае – expr2&amp;nbsp;&lt;/li&gt;
&lt;li&gt;NVL2 (expr1, expr2, expr3) - в случае, если expr1 IS NOT NULL, выводится expr2, в противном случае – expr3&lt;/li&gt;
&lt;li&gt;COALESCE (expr1, expr2, … exprN) – возвращает первый NOT NULL аргумент, т.е. для трех аргументов аналогично NVL(expr1,NVL(expr2, expr3))&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
По своей сути COALESCE с двумя параметрами полностью аналогичен NVL, однако COALESCE «умнее». NVL обязательно расчитывает оба аргумента перед выдачей результата, а COALESCE расчитывает аргументы в порядке проверки. Смотрим тесты на 10`000`000 проходах.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример 1.&lt;/b&gt; Статичные аргументы:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SQL&amp;gt; 
BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF NVL('y','x')='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 0,562 seconds

BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF COALESCE('y','x')='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 0,156 seconds&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример 2.&lt;/b&gt; Первый аргумент вычисляемый, второй статичен:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SQL&amp;gt; 
BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF NVL(sys_context('USERENV','HOST'),'x')='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 19,484 seconds

BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF COALESCE(sys_context('USERENV','HOST'),'x')='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 18,36 seconds&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример 3.&lt;/b&gt; Оба аргумента вычисляемые:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SQL&amp;gt; 
BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF NVL(sys_context('USERENV','HOST'),sys_context('USERENV','HOST'))='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 36,656 seconds

BEGIN
&amp;nbsp;&amp;nbsp;FOR i IN 1..10000000 LOOP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF COALESCE(sys_context('USERENV','HOST'),sys_context('USERENV','HOST'))='x' THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;END IF;
&amp;nbsp;&amp;nbsp;END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 18 seconds&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
Цифры лучше любых слов показывают разницу.&lt;br /&gt;
&lt;br /&gt;
Но стоп! Почему только PL\SQL? Забыли про SQL?&lt;br /&gt;
&lt;br /&gt;
Нет, далее смотрим разные варианты при использовании запросов. В тестовой таблице 10`000`000 записей, в поле val1 25% значений NULL.&lt;br /&gt;
Для любителей использовать DECODE (ну не правильно это делать, неправильно!) вместо NVL или COALESCE примеры тоже добавлены. Кроме того для полной картины добавлен и вариант с CASE:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;-- Статические параметры

SELECT MAX(nvl(val1, val2)) AS RESULT FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 13,297 seconds

SELECT MAX(coalesce(val1, val2)) AS RESULT FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 13,312 seconds

SELECT MAX(decode(val1, NULL, val2, val1)) AS RESULT FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 15,703 seconds

SELECT MAX(CASE 
             WHEN val1 IS NULL THEN
              val2
             ELSE
              val1
             END) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 8,766 seconds

-- Второй параметр вычисляемый

SELECT MAX(nvl(val1, dbms_random.value)) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 34,031 seconds

SELECT MAX(coalesce(val1, dbms_random.value)) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 16,828 seconds

SELECT MAX(decode(val1, NULL, dbms_random.value, val1)) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 19,688 seconds

SELECT MAX(CASE 
             WHEN val1 IS NULL THEN
              dbms_random.value
             ELSE
              val1
             END) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         4
 
Executed in 15,062 seconds

-- Оба параметра вычисляемые

SELECT MAX(nvl(nullif(round(dbms_random.value * 5), 3),
               dbms_random.value)) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         5
 
Executed in 91,313 seconds

SELECT MAX(coalesce(nullif(round(dbms_random.value * 5), 3),
                    dbms_random.value)) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         5
 
Executed in 72,016 seconds

SELECT MAX(decode(nullif(round(dbms_random.value * 5), 3),
                  NULL,
                  dbms_random.value,
                  nullif(round(dbms_random.value * 5), 3))) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         5
 
Executed in 123,844 seconds

SELECT MAX(CASE
             WHEN nullif(round(dbms_random.value * 5), 3) IS NULL THEN
              dbms_random.value
             ELSE
              nullif(round(dbms_random.value * 5), 3)
             END) AS RESULT
  FROM test_performance;
 
    RESULT
----------
         5
 
Executed in 121,797 seconds &lt;br /&gt;
&lt;/pre&gt;

&lt;b&gt;UPDATE:&lt;/b&gt;
Спасибо &lt;a href="https://profiles.google.com/117556985715321189607"&gt;+Sayan Malakshinov&lt;/a&gt; за комментарии и &lt;a href="http://www.xt-r.com/2012/03/nvl-coalesce-concatenation.html"&gt;отдельное сообщение с разъяснениями касательно бонусов NVL по сравнению с COALESCE&lt;/a&gt;. Основной смысл в том, что оптимизатор Oracle при построении плана запроса умеет разворачивать выполнение функции в конкатенацию с фильтрацией по каждому аргументу.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-5027026280067966852?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/Ew_0ADGWnPA" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-20T16:39:28.391+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2012/03/nvl-coalesce.html</feedburner:origLink></item><item><title>СРОЧНО! Oracle вводит аналог TOP и LIMIT</title><link>http://feedproxy.google.com/~r/oraclemaniacs/~3/bCUoTokGN5o/oracle-top-limit.html</link><author>noreply@blogger.com (Дмитрий Богомолов)</author><pubDate>Sat, 10 Mar 2012 23:52:24 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-21381265.post-3656220640182374837</guid><description>Невероятно, но, проскочила информация о том, что Oracle в версии СУБД 12c введет конструкцию для ограничения выдачи, являющуюся аналогом TOP в MS SQL Server или LIMIT в MySQL:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
In Database 12c, to limit the number of rows in a query can be 
simplified by ANSI fetch first/offset keyword via Oracle SQL row 
limiting clause.&lt;br /&gt;
&lt;br /&gt;
For example, fetch the top 3 "oldest" employees:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;&amp;nbsp;select *&lt;br /&gt;
&amp;nbsp;from employees&lt;br /&gt;
&amp;nbsp;order by hire_date&lt;br /&gt;
&amp;nbsp;fetch first 3 rows only;&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
And, keep the ties:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;&amp;nbsp;select *&lt;br /&gt;
&amp;nbsp;from employees&lt;br /&gt;
&amp;nbsp;order by hire_date&lt;br /&gt;
&amp;nbsp;fetch first 3 rows with ties;&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Or skip the first 3 employees, what we need is rank 4 to 6:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;&amp;nbsp;select *&lt;br /&gt;
&amp;nbsp;from employees&lt;br /&gt;
&amp;nbsp;order by hire_date&lt;br /&gt;
&amp;nbsp;offset 3 rows&lt;br /&gt;
&amp;nbsp;fetch next 3 rows only;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
May be limiting row count is way too precise, percentage style is preferred sometime =)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;&amp;nbsp;select * &lt;br /&gt;
&amp;nbsp;from employees&lt;br /&gt;
&amp;nbsp;order by hire_date&lt;br /&gt;
&amp;nbsp;fetch first 10 percent rows only;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;
 
  &amp;nbsp;Todd&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
Источник: &lt;a href="https://blogs.oracle.com/toddbao/entry/oracle_database_12c_row_limiting"&gt;https://blogs.oracle.com/toddbao/entry/oracle_database_12c_row_limiting&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21381265-3656220640182374837?l=oraclemaniacs.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/oraclemaniacs/~4/bCUoTokGN5o" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-11T11:52:24.379+04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://oraclemaniacs.blogspot.com/2012/03/oracle-top-limit.html</feedburner:origLink></item><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>Sat, 10 Mar 2012 23:22:33 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;pre class="brush:sql"&gt;MASTER_DB SQL&amp;gt; drop materialized view passes;&lt;/pre&gt;
  &lt;/li&gt;
&lt;li&gt;&lt;pre class="brush:sql"&gt;MASTER_DB SQL&amp;gt; drop materialized view acts;&lt;/pre&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;pre class="brush:sql"&gt;MASTER_DB SQL&amp;gt; drop table passes;&lt;/pre&gt;
  &lt;/li&gt;
&lt;li&gt;&lt;pre class="brush:sql"&gt;MASTER_DB SQL&amp;gt; drop table acts;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Делаем дамп&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre class="brush:bash"&gt;MASTER_HOST#&amp;nbsp; expdp username/password directory=data_pump_dir dumpfile=replication.dmp tables=(passes,acts)&lt;/pre&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;pre class="brush:bash"&gt;TARGET_HOST#&amp;nbsp; impdp username/password directory=data_pump_dir dumpfile=replication.dmp tables=(passes,acts) include=TABLE,INDEX&lt;/pre&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;&lt;pre class="brush:sql"&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;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;pre class="brush:sql"&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;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Обновление матвью&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre class="brush:sql"&gt;exec dbms_mview.refresh('acts,passes','fast');&lt;/pre&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">2012-03-11T11:22:33.632+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, 04 Apr 2012 23:25:42 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" ilo-full-src="https://lh5.googleusercontent.com/-sCR7aL9RuvA/TniD6YYP9JI/AAAAAAAAAzU/oypLTT5amxo/w335-h236-k/image1.png" 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">2012-04-05T10:25:42.404+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>Sat, 10 Mar 2012 23:37:37 PST</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;pre class="brush:sql"&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;br /&gt;...&lt;br /&gt;
107 rows selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Execution Plan&lt;br /&gt;
----------------------------------------------------------&lt;br /&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=2461)
&lt;br /&gt;
&lt;br /&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;br /&gt;
&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COUNT&lt;br /&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 Card=107 Bytes=2461)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;
В данном случае можно увидеть по плану, что ROWNUM считается до сортировки (да, COUNT - оно самое), в итоге получаем ту самую кашу.&lt;br /&gt;
А теперь эксперимент, сделаем "ложную" деревянную выборку одного уровня:&lt;br /&gt;
&lt;pre class="brush:sql"&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;br /&gt;
...&lt;br /&gt;
107 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
Execution Plan&lt;br /&gt;
----------------------------------------------------------
&lt;br /&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=2461)&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; COUNT&lt;br /&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;br /&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 Card=107 Bytes=2461)&lt;br /&gt;&lt;/pre&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">2012-03-11T11:37:37.954+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></channel></rss>

