<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>С кодом по жизни &#187; Oracle</title>
	<atom:link href="http://mphome.dp.ua/topics/bazy-dannyx/oracle-bazy-dannyx/feed/" rel="self" type="application/rss+xml" />
	<link>http://mphome.dp.ua</link>
	<description>О разработке программного обеспечения, и не только.</description>
	<lastBuildDate>Wed, 03 Aug 2011 12:43:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>COALESCE &#8220;умнее&#8221; чем NVL.</title>
		<link>http://mphome.dp.ua/coalesce-umnee-chem-nvl/</link>
		<comments>http://mphome.dp.ua/coalesce-umnee-chem-nvl/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 09:20:18 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://mphome.dp.ua/coalesce-umnee-chem-nvl/</guid>
		<description><![CDATA[Век живи &#8212; век учись. NVL вычисляет второй аргумент, даже если если первый аргумент не NULL. NVL2 поступает также:&#160; “вычисляет” оба аргумента, хотя по идее должна вычислять только один. Подробности и детали: Short-circuit Evaluations &#8212; moving away from NVL. Конечно для случаев NVL(Field, DefaultValue) или NVL2(Field, NotNullDefaultValue, NullDefaultValue) это ничего не даст, но если для [...]]]></description>
			<content:encoded><![CDATA[<p>Век живи &#8212; век учись. NVL вычисляет второй аргумент, даже если если первый аргумент не NULL. NVL2 поступает также:&#160; “вычисляет” оба аргумента, хотя по идее должна вычислять только один. Подробности и детали: <a href="http://triangle-circle-square.blogspot.com/2010/02/short-circuit-evaluations-moving-away.html">Short-circuit Evaluations &#8212; moving away from NVL</a>.</p>
<p>Конечно для случаев NVL(Field, DefaultValue) или NVL2(Field, NotNullDefaultValue, NullDefaultValue) это ничего не даст, но если для расчета значения по умолчанию используется функция (и еще через одно место написанная), то могут быть варианты.</p>
<p>В Oracle “умными” оказались только DECODE, CASE и COALESCE.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/coalesce-umnee-chem-nvl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle recycle bin</title>
		<link>http://mphome.dp.ua/oracle-recycle-bin/</link>
		<comments>http://mphome.dp.ua/oracle-recycle-bin/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 10:11:45 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/oracle-recycle-bin/</guid>
		<description><![CDATA[В Oracle 10 появилась новая фича Recycle Bin, когда вы удаляете таблицу – она вначале попадает в корзину (нафига это надо?!). Самое дурацкое &#8212; что таблица просто переименовывается и естественно занимает тоже место что и до исполнения DROP TABLE. Причем ложится туда вместе с индексами. Отключить навсегда: ALTER SYSTEM SET &#34;recyclebin&#34;=OFF SCOPE = BOTH; Почистить [...]]]></description>
			<content:encoded><![CDATA[<p>В Oracle 10 появилась новая фича Recycle Bin, когда вы удаляете таблицу – она вначале попадает в корзину (нафига это надо?!). Самое дурацкое &#8212; что таблица просто переименовывается и естественно занимает тоже место что и до исполнения DROP TABLE. Причем ложится туда вместе с индексами.</p>
<p>Отключить навсегда:</p>
<p><strong>ALTER SYSTEM SET &quot;recyclebin&quot;=OFF SCOPE = BOTH;</strong></p>
<p>Почистить для всех схем:</p>
<p><strong>PURGE dba_recyclebin;</strong></p>
<p>Зачем эта возможность добавлена, я так и не понял.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-recycle-bin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сюрпризы Oracle &#8211; foreign keys and indexes</title>
		<link>http://mphome.dp.ua/syurprizy-oracle-foreign-keys-and-indexes/</link>
		<comments>http://mphome.dp.ua/syurprizy-oracle-foreign-keys-and-indexes/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 16:12:31 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/syurprizy-oracle-foreign-keys-and-indexes/</guid>
		<description><![CDATA[Oracle 10 не перестает удивлять. Я так и не понял как можно было загрузить дамп в котором в дочерней таблице были references на несуществующие записи в master таблице, при том что после загрузки данных он спокойно создал и соотвествующие constraints и индексы. Deferrable constraints нигде нет. Да и не пользовали никогда. Вообщем – случилось и [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 10 не перестает удивлять. Я так и не понял как можно было загрузить дамп в котором в дочерней таблице были references на несуществующие записи в master таблице, при том что после загрузки данных он спокойно создал и соотвествующие constraints и индексы.</p>
<p>Deferrable constraints нигде нет. Да и не пользовали никогда. Вообщем – случилось и случилось.</p>
<p>Пришлось написать скрипт который ловит такие записи. Что с ними делать потом решать Вам. Все результаты сохраняются в таблице Exceptions.</p>
<p>&#160;</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span>
&nbsp;
  QuantityTemp <span style="color: #993333; font-weight: bold;">NUMBER</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">23</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
   <span style="color: #993333; font-weight: bold;">BEGIN</span> 
        <span style="color: #993333; font-weight: bold;">EXECUTE</span> IMMEDIATE <span style="color: #ff0000;">'DROP TABLE  EXCEPTIONS CASCADE CONSTRAINTS'</span>;
   EXCEPTION
        <span style="color: #993333; font-weight: bold;">WHEN</span> OTHERS <span style="color: #993333; font-weight: bold;">THEN</span>
          <span style="color: #993333; font-weight: bold;">NULL</span>;
   <span style="color: #993333; font-weight: bold;">END</span>;  
&nbsp;
   <span style="color: #993333; font-weight: bold;">BEGIN</span> 
        <span style="color: #993333; font-weight: bold;">EXECUTE</span> IMMEDIATE <span style="color: #ff0000;">'create table exceptions(row_id rowid, owner varchar2(30), table_name varchar2(30),  constraint varchar2(30))'</span>;
   EXCEPTION
        <span style="color: #993333; font-weight: bold;">WHEN</span> OTHERS <span style="color: #993333; font-weight: bold;">THEN</span>
          <span style="color: #993333; font-weight: bold;">NULL</span>;
   <span style="color: #993333; font-weight: bold;">END</span>;  
&nbsp;
   <span style="color: #993333; font-weight: bold;">FOR</span> X <span style="color: #993333; font-weight: bold;">IN</span> 
   <span style="color: #66cc66;">&#40;</span>
      <span style="color: #993333; font-weight: bold;">SELECT</span> Constraint_name<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #993333; font-weight: bold;">FROM</span> user_constraints
   <span style="color: #66cc66;">&#41;</span>
   LOOP
      <span style="color: #993333; font-weight: bold;">EXECUTE</span> IMMEDIATE <span style="color: #ff0000;">'DELETE FROM Exceptions'</span>;
      <span style="color: #993333; font-weight: bold;">BEGIN</span>
        <span style="color: #993333; font-weight: bold;">EXECUTE</span> IMMEDIATE <span style="color: #ff0000;">'ALTER TABLE '</span> <span style="color: #66cc66;">||</span> x<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #66cc66;">||</span>  <span style="color: #ff0000;">' MODIFY CONSTRAINT '</span> <span style="color: #66cc66;">||</span> x<span style="color: #66cc66;">.</span>Constraint_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' VALIDATE EXCEPTIONS INTO EXCEPTIONS '</span>;
      EXCEPTION
         <span style="color: #993333; font-weight: bold;">WHEN</span> OTHERS <span style="color: #993333; font-weight: bold;">THEN</span>
            <span style="color: #993333; font-weight: bold;">NULL</span>;
      <span style="color: #993333; font-weight: bold;">END</span>;  
&nbsp;
      <span style="color: #993333; font-weight: bold;">EXECUTE</span> IMMEDIATE <span style="color: #ff0000;">'SELECT Count(*)  FROM Exceptions '</span> <span style="color: #993333; font-weight: bold;">INTO</span> quantityTemp;
      <span style="color: #993333; font-weight: bold;">IF</span> QuantityTemp &amp;lt;&amp;gt; <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">THEN</span>
         dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Table '</span> <span style="color: #66cc66;">||</span> x<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' CONSTRAINT: '</span> <span style="color: #66cc66;">||</span> x<span style="color: #66cc66;">.</span>Constraint_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' HAVE '</span> <span style="color: #66cc66;">||</span> QuantityTemp <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' problems. '</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;   
&nbsp;
   <span style="color: #993333; font-weight: bold;">END</span> LOOP;
<span style="color: #993333; font-weight: bold;">END</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/syurprizy-oracle-foreign-keys-and-indexes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сюрпризы oracle &#8211; обфускация пакетов</title>
		<link>http://mphome.dp.ua/syurprizy-oracle-obfuskaciya-paketov/</link>
		<comments>http://mphome.dp.ua/syurprizy-oracle-obfuskaciya-paketov/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 14:08:57 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[obfuscation]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[wrap]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/syurprizy-oracle-obfuskaciya-paketov/</guid>
		<description><![CDATA[Все нижеследующее справедливо для 9-ки (Oracle 9.2.x.x) Вероятно Вам приходилось обфусцировать plsql пакеты Oracle. Вероятно также что однажды утилита wrap не смогла это сделать. И Вы получили примерно такую ошибку: kgefec: fatal error 0 kgepop: no error frame to pop to for error 603 или другую ошибку подобную ошибку. И Вам приходилось рыскать в интернете [...]]]></description>
			<content:encoded><![CDATA[<p>Все нижеследующее справедливо для 9-ки (Oracle 9.2.x.x)</p>
<p>Вероятно Вам приходилось обфусцировать plsql пакеты Oracle. Вероятно также что однажды утилита wrap не смогла это сделать. И Вы получили примерно такую ошибку:</p>
<p><em>kgefec: fatal error 0      <br />kgepop: no error frame to pop to for error 603</em></p>
</p>
<p>или другую ошибку подобную ошибку. И Вам приходилось рыскать в интернете – что же это такое, почему оно происходит, как с этим бороться и т.д.</p>
<p>Вы разбивали пакет на несколько пакетов, включали опцию /3Gb, обфусцирование делали где памяти немерянно, и т.д.</p>
<p>Всё это делали и мы, пока не оказалось, что вначале достаточно убрать лидирущие пробелы в коде (не руками конечно) перед обсуцированием.</p>
<p>Оказалось размер текста (не кода) критичен для обфускации и простым удалением лидирующих пробелов можно уменьшить текст процентов на 10-15%</p>
<p>И о чудо, гигабайта RAM достаточно для обфускации пакета размером в мегабайт. (Почему при этом используется 2.5GB RAM для меня загадка)</p>
<p>К счастью wrap в десятке делает все по уму, быстро и без излишнего использования памяти</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/syurprizy-oracle-obfuskaciya-paketov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Таблица dual и connect by</title>
		<link>http://mphome.dp.ua/oracle-tablica-dual-i-connect-by/</link>
		<comments>http://mphome.dp.ua/oracle-tablica-dual-i-connect-by/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 10:38:51 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[connectby]]></category>
		<category><![CDATA[dual]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/oracle-tablica-dual-i-connect-by/</guid>
		<description><![CDATA[Oracle не перестает удивлять. Oracle 9. Select Level from dual connect by Level &#60; 200 Вернет строго 100 записей. Select Max(Level) from dual connect by Level &#60; 200 Вернет 199. Приятно. Но это еще не всё. :) Select Max(LevelNo) from ( Select Level as LevelNo from dual connect by Level &#60; 200 ) Тоже вернет [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle не перестает удивлять.</p>
<p>Oracle 9.</p>
<p><strong>Select Level from dual connect by Level &lt; 200</strong></p>
<p>Вернет строго 100 записей.</p>
<p><strong>Select Max(Level) from dual connect by Level &lt; 200</strong></p>
<p>Вернет 199.</p>
<p>Приятно.</p>
<p>Но это еще не всё. :)</p>
<p><strong>Select Max(LevelNo)      <br />from       <br />(       <br />Select Level as LevelNo from dual connect by Level &lt; 200       <br />)</strong></p>
<p>Тоже вернет 199</p>
<p>На Oracle 10 всё в порядке.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-tablica-dual-i-connect-by/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle Views. Сюрпризы.</title>
		<link>http://mphome.dp.ua/oracle-views-syurprizy/</link>
		<comments>http://mphome.dp.ua/oracle-views-syurprizy/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 11:32:47 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[views]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/oracle-views-syurprizy/</guid>
		<description><![CDATA[Создаем обычную вьюшку. create view TestView as Select Level as N from dual connect by Level &#60; 10 Три следующих запроса работают нормально: Select * from TestView; Select N from TestView; Select n from TestView; Select "N" from TestView; Не понравилось нам название колонки – N, меняем вьюшку create or replace view TestView as Select [...]]]></description>
			<content:encoded><![CDATA[<p>Создаем обычную вьюшку.</p>
</p>
<div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3a6af8f9-8903-4975-82be-d6edc2cd9111" class="wlWriterSmartContent">
<pre name="code" class="sql">create view TestView as
Select Level as N from dual connect by Level &lt; 10</pre>
</div>
<p>Три следующих запроса работают нормально:</p>
</p>
<div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0d898e07-dbd7-4b7a-9046-1c50ef140a65" class="wlWriterSmartContent">
<pre name="code" class="sql">Select * from TestView;
Select N from TestView;
Select n from TestView;
Select "N" from TestView;
</pre>
</div>
<p>Не понравилось нам название колонки – N, меняем вьюшку</p>
</p>
<div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:11fdbf1c-f89a-4e1f-98fb-6ca0f37d2b6f" class="wlWriterSmartContent">
<pre name="code" class="sql">create or replace view TestView as
Select Level as "Test_Column"
from dual connect by Level &lt; 10</pre>
</div>
<p>Первые три запросы вернут ошибку ORA-00904. Последний четвертый выполнится без проблем.</p>
</p>
<div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7e1f6913-842a-4953-ae6c-7c099035b9df" class="wlWriterSmartContent">
<pre name="code" class="sql">Select Test_Column from TestView
Select test_column from TestView
Select "test_column" from TestView
Select "Test_Column" from TestView</pre>
</div>
<p>Поначалу я решил что всё что заключено в двойные кавычки будет case-sensitive и надо обрамлять имя колонки в двойные кавычки и писать имя букву в букву с учётом регистра. Следующий пример это опровергает. Никаких проблем нет.</p>
</p>
<div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6cc49be8-1a54-49de-93d4-36ab0497415d" class="wlWriterSmartContent">
<pre name="code" class="sql">create or replace view TestView as
Select Level as "N"
from dual connect by Level &lt; 10

Select * from TestView;
Select N from TestView;
Select n from TestView;
Select "N" from TestView;</pre>
</div>
<p>Оказалось всё гораздно проще.</p>
<p>Если имя колонки заключенно в двойные кавычки, то при запросах его точно также и надо писать с учётом регистра.</p>
<p>Если в запросе вы обрамляете название поле двойными кавычками, то его надо писать в верхнем регистре, если конечно в определении view вы не использовали двойные кавычки.</p>
<p>Ну где у Оракла логика?!</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-views-syurprizy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Оператор LIKE. Escape character.</title>
		<link>http://mphome.dp.ua/oracle-operator-like-escape-character/</link>
		<comments>http://mphome.dp.ua/oracle-operator-like-escape-character/#comments</comments>
		<pubDate>Mon, 19 May 2008 15:54:54 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[oracle like]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/oracle-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80-like-escape-character/</guid>
		<description><![CDATA[LIKE &#8212; простой условной оператор для сравнения по маске.  С двумя символами: % &#8212; всё что угодно _ &#8212; один символ Я всё время считал, что escape character в Oracle это тот же процент (%). До тех пор пока не пришлось искать в строках этот процент и подчеркивание. После первого же запроса понял, что одновременно [...]]]></description>
			<content:encoded><![CDATA[<p>LIKE &#8212; простой условной оператор для сравнения по маске.  С двумя символами:</p>
<p>% &#8212; всё что угодно</p>
<p>_ &#8212; один символ</p>
<p>Я всё время считал, что escape character в Oracle это тот же процент (%). До тех пор пока не пришлось искать в строках этот процент и подчеркивание. После первого же запроса понял, что одновременно интерпретировать один символ как &laquo;всё что угодно&raquo; и escape symbol как-то несподручно.</p>
<p><em>select * from something where like field like &#8216;%%%%&#8217;;</em></p>
<p>Бесмысленный запрос получается, с escape &#8212; тем более :)</p>
<p><em>select * from something where like field like &#8216;%%%%&#8217; escape &#8216;%&#8217;;</em></p>
<p>Это эквивалент field = &#8216;%%&#8217;</p>
<p>Но вот не пойму, им что, было сложно сделать back-slash escape символом :(, что бы не писать каждый раз escape &#8216;\&#8217;</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-operator-like-escape-character/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. OraOleDb, FetchSize и dotnet</title>
		<link>http://mphome.dp.ua/oracle-oraoledb-fetchsize-i-dotnet/</link>
		<comments>http://mphome.dp.ua/oracle-oraoledb-fetchsize-i-dotnet/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 13:40:58 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[fetchsize]]></category>
		<category><![CDATA[oledb]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/oracle-oraoledb-fetchsize-%d0%b8-dotnet/</guid>
		<description><![CDATA[Простой запрос, три поля из трех таблиц, все строки VARCHAR2. Dotnet framework 2.0. OleDbDataReader. Первые сто строк вычитываются нормально, потом все идет крокозяблами. Думал поседею. Четыре разных сервера, три девятки, одна десятка, проявляется только на одном. Проблемы оказалась в параметре FetchSize (сколько строк возращать за одну вычитку), первый раз все вычитается правильно, все последующие вернут [...]]]></description>
			<content:encoded><![CDATA[<p>Простой запрос, три поля из трех таблиц, все строки VARCHAR2.</p>
<p>Dotnet framework 2.0.</p>
<p>OleDbDataReader.</p>
<p>Первые сто строк вычитываются нормально, потом все идет крокозяблами. Думал поседею.</p>
<p>Четыре разных сервера, три девятки, одна десятка, проявляется только на одном.</p>
<p>Проблемы оказалась в параметре FetchSize (сколько строк возращать за одну вычитку), первый раз все вычитается правильно, все последующие вернут мусор.</p>
<p>Пришлось ставить FetchSize = 100000</p>
<p>Нашел описание проблемы <a href="http://www.pcreview.co.uk/forums/thread-1209724.php">здесь</a>. А вот решения кроме вышепредложенного пока нет.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-oraoledb-fetchsize-i-dotnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&quot;Горизонтальные&quot; функции в Oracle.</title>
		<link>http://mphome.dp.ua/gorizontalnye-funkcii-v-oracle/</link>
		<comments>http://mphome.dp.ua/gorizontalnye-funkcii-v-oracle/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 16:02:30 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[built-in-functions]]></category>
		<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/2008/01/11/%d0%b3%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%bd%d1%82%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8-%d0%b2-oracle/</guid>
		<description><![CDATA[Сегодня обнаружил в коде функцию Coalesce. Ни разу не пользовался. Дословно – объединять. Почему объединять ума не приложу. Функция возвращает первое not null значение из списка, заменитель вложенных NVL функций. И теперь вместо: NVL(NVL(NVL(ColumnA, ColumnB) , ColumnC), ColumnD) можно написать: COALESCE(ColumnA, ColumnB, ColumnC, ColumnD) Функция «горизонтальная». « Горизонтальная» функция, потому что оперирует колонками (или n [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня обнаружил в коде функцию Coalesce. Ни разу не пользовался. Дословно – объединять. Почему объединять ума не приложу. Функция возвращает первое not null значение из списка, заменитель вложенных NVL функций. И теперь вместо:</p>
<p>NVL(NVL(NVL(ColumnA, ColumnB) , ColumnC), ColumnD)</p>
<p>можно написать:</p>
<p>COALESCE(ColumnA, ColumnB, ColumnC, ColumnD)</p>
<p>Функция «горизонтальная». « Горизонтальная» функция, потому что оперирует колонками (или n параметрами, и количество их конечно, к сожалению, и всегда должно быть задано), а не записями.</p>
<p>Max функция – «вертикальная», потому что оперирует со записями – берет максимально возможное значения поля из n-записей.</p>
<p>Аналог Max функции в «горизонтальном» исполнении Greatest, для Min функции – функция Least, а для Avg нет аналогичной функции. Почему? Редко используется?</p>
<p>Для Coalesce нет аналога «вертикальной» функции, впрочем, аналог был бы бессмысленным.</p>
<p>Вообще Oracle после функции DECODE могли все эти «горизонтальные» функции и не создавать. Она настолько универсальная.</p>
<p>GREATEST реализовывался «простой» конструкцией (для трех полей попробуйте написать сами – получится очень удобная и читаемая конструкция):</p>
<p>DECODE(Sign(ColumnA-ColumnB), 1, ColumnA, -1, ColumnB, ColumnA)</p>
<p>Больше built-in функций – меньше кода, читаемость лучше, да и понятливость тоже.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/gorizontalnye-funkcii-v-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle bad practice &#8212; комментарии.</title>
		<link>http://mphome.dp.ua/oracle-bad-practice-kommentarii/</link>
		<comments>http://mphome.dp.ua/oracle-bad-practice-kommentarii/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 15:30:08 +0000</pubDate>
		<dc:creator>Михаил</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[bad-practice]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[plsql]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.mphome.dp.ua/2007/12/21/oracle-bad-practice-%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/</guid>
		<description><![CDATA[Gojko Adzic составил очень любопытный документ Oracle SQL and PL/SQL Bad Practices. А я позволил себе немного его прокомментировать. Сколько людей &#8212; столько мнений. Однозначно разделить на bad и best practice не выйдет.   Using non-deterministic functions directly in conditions. +1 Использование функций в условиях (WHERE) &#8212; зло и жестоко бьет по производительности. Catch-all error handling. [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Gojko Adzic" href="http://gojko.net">Gojko Adzic</a> <a href="http://gojko.net/effective-oracle/">составил</a> очень любопытный документ <a title="Oracle SQL and PL/SQL Bad Practices" href="http://gojko.net/oracle/oraclebadprac.pdf">Oracle SQL and PL/SQL Bad Practices</a>. А я позволил себе немного его прокомментировать.</p>
<p>Сколько людей &#8212; столько мнений. Однозначно разделить на bad и best practice не выйдет.</p>
<p> </p>
<p><strong>Using non-deterministic functions directly in conditions</strong>. +1 Использование функций в условиях (WHERE) &#8212; зло и жестоко бьет по производительности.<br />
<strong><br />
</strong><strong>Catch-all </strong><strong>error</strong><strong> </strong><strong>handling</strong><strong>. </strong>0 &#8212; Зависит от выбранного Вами способа обработки ошибок. Будет ли логирование уже на DB уровне или все ошибки наверху обрабатывать.</p>
<p><strong>Client access as object owner. </strong>+1. Для внешних приложений должно быть определенно API, на каком уровне его делать это другая задача, но пускать &laquo;козлов в огород&raquo; не стоит.</p>
<p><strong>Client access to tables. </strong>+1. Меньше знаешь &#8212; лучше спишь, про write можно вообще забыть, читать позволить можно лучше через views либо через API. <strong></strong></p>
<p><strong>Embedding complex SQL code into PL/SQL. </strong>-1. Не понял, что же здесь плохого.</p>
<p><strong>Error handling with magic numbers. </strong>0 &#8212; &laquo;it’s depend&raquo;. Все зависит от способа обработок ошибок, &#8212; какой из них лучший или правильный, или более удобный решать Вам.</p>
<p><strong>Error handling with output parameters.</strong> +1. Несмотря на предыдущий пункт. Процедура с REF CURSOR OUT и OUT переменой индицирующий успешный вызов или нет &#8212; откроет Вам глаза на проблему.</p>
<p><strong>Formatting data in views. </strong>+1. Конвертация типа Date в строку &#8212; типичная проблема. Зачем это делать? (А ведь делают.)</p>
<p><strong>Hardcoding local Varchar2 variable size </strong>+1. Только это относится ко всем типам, а не только к VARCHAR2, Случаи использования для переменных NUMBER(5) и присваивать туда значение из поля с типом NUMBER(12), а еще лучше NUMBER(24,8), довольно частые.</p>
<p><strong>Ignoring exceptions. </strong>+1. Только здесь речь идет не об игнорировании &#8212; речь идет о &laquo;сокрытии&raquo; ошибок.</p>
<p>begin<br />
&#8230;<br />
Exception<br />
   When others then<br />
        NULL;<br />
end;</p>
<p><strong>Not using bound variables for changing parameters. </strong>+1. Оптимизатору надо помогать, а не запутывать его.</p>
<p><strong>Relying on conditional column predicates in triggers. </strong>+2<strong> </strong>Костылями надо пользоваться только в крайних случаях.</p>
<p><strong>Relying on context information in package variables. </strong>+2 Глобальные переменные не есть хорошо. Таблиц мало?</p>
<p><strong>Relying on external context initialisation. </strong>0 == +1 + -1. Но без комментариев, Потому что решение тоже не понравилось.</p>
<p><strong>Secondary</strong><strong> </strong><strong>processing</strong><strong> </strong><strong>with</strong><strong> </strong><strong>unshielded</strong><strong> </strong><strong>triggers</strong><strong>. </strong>+2. Почему смотрите выше.</p>
<p><strong>Storing</strong><strong> </strong><strong>ROWID</strong><strong> </strong><strong>for</strong><strong> </strong><strong>later</strong><strong> </strong><strong>reference</strong><strong>. </strong>+1. Есть sequences.</p>
<p><strong>Storing empty LOBs. </strong>+1. Вообще, зачем их хранить?</p>
<p><strong>Too many levels of views. </strong>+1. Oracle system views видели? План выполнения видели? Для некоторых в 40 строк не умещается.</p>
<p><strong>Transactional control in non-autonomous procedures. </strong>+1. Наступал.</p>
<p><strong>Trigger depending on order of execution.</strong> +2. Почему? Смотрите выше.</p>
<p><strong>Using Sequence nextval without curval.</strong> +1<strong> </strong>Странно? Потому что читать надо как &laquo;Using currval without call of nextval&raquo;.</p>
<p><strong>Using a sequence as a counter.</strong> +1. По моему все очевидно.</p>
<p><strong>Using bound variables for constants. </strong>0. &#8212; Проблема существуют, но решение подходит только к определенному случаю. Вы знаете список значений их характер распределения значений. Вероятность не очень большая.</p>
<p><strong>Using derived column values for existence checks. </strong>+1 Все прозрачно и ясно.</p>
<p><strong>Using exceptions for flow control.</strong> +1. Зачем так делать? Пример надуманным выглядит.</p>
<p><strong>Using magic numbers for non-existing values. </strong>+1 . NULL может использоваться как &laquo;значение по умолчанию&raquo;. Само значение может быть определенно в другом месте. 0 и -1 конечно это не годится. Можно конечно поспорить, но если сегодня например статьи с CategoryId = NULL означают &laquo;Разное&raquo;, при этом у вас есть и статьи с такой категорий, то пробивая сразу категорию &laquo;Разное&raquo;, позже их разделить будет невозможно, если вы определите что статьи с CategoryId = NULL это &laquo;Новости&raquo;. (Пример, конечно, высосан из пальца.)</p>
<p><strong>Using non-dedicated packages for continuous jobs. </strong>0 &#8212; Не понял что плохого. Успешность вызова grant execute зависит от того выполняется сейчас процедура из пакета или нет?</p>
<p><strong>Wrapping everything into stored procedures. </strong>Самый спорный вопрос &#8212; хорошо это или плохо. Я приверженец этого подхода, правда у меня только аргумент &#8212; такой подход позволяет скрыть структуры данных от клиентской части и модификация ее производится только на одном уровне. Вообще использование или не использование этого подхода &#8212; тема отдельной статьи.</p>
]]></content:encoded>
			<wfw:commentRss>http://mphome.dp.ua/oracle-bad-practice-kommentarii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

