<?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>Напоминалка системного администратора!</title>
	<atom:link href="http://kochetov.org.ua/feed/" rel="self" type="application/rss+xml" />
	<link>http://kochetov.org.ua</link>
	<description></description>
	<lastBuildDate>Thu, 10 May 2012 07:57:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Oracle. Примеры выборок</title>
		<link>http://kochetov.org.ua/2012/04/13/oracle_examples_select/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_examples_select</link>
		<comments>http://kochetov.org.ua/2012/04/13/oracle_examples_select/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 06:50:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2849</guid>
		<description><![CDATA[В данной заметке будут написаны примеры выборок. 1. Выбрать записи таблицы table где комбинация полей (name1, name2) повторяется больше одного раза: SELECT name1, name2, count(*) FROM table  GROUP BY name1, name2 HAVING count(*)&#62;1; &#160; 2. Выбрать уникальные строки с последней датой: SELECT * FROM table a WHERE date=(SELECT max(date) FROM table b); &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>В данной заметке будут написаны примеры выборок.</p>
<p style="text-align: justify;"><strong>1. Выбрать записи таблицы table где комбинация полей (name1, name2) повторяется больше одного раза:</strong></p>
<blockquote><p>SELECT name1, name2, count(*) FROM table  GROUP BY name1, name2 HAVING count(*)&gt;1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>2. Выбрать уникальные строки с последней датой:<br />
</strong></p>
<blockquote><p>SELECT * FROM table a WHERE date=(SELECT max(date) FROM table b);</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/04/13/oracle_examples_select/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Разное</title>
		<link>http://kochetov.org.ua/2012/04/11/oracle_other/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_other</link>
		<comments>http://kochetov.org.ua/2012/04/11/oracle_other/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 05:35:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2842</guid>
		<description><![CDATA[На данной странице написаны полезные команды и выборки. 1. Посмотреть общий размер, который занимает СУБД Oracle (все схемы) на диске: select sum(bytes)/1024/1024 &#124;&#124; &#8216; Mb&#8217; from dba_segments; &#160; 2. Посмотреть размер, который занимает схема &#8216;SHEMA&#8217; на диске: select sum(bytes)/1024/1024 &#124;&#124; &#8216; Mb&#8217; from dba_segments where owner=&#8217;SHEMA&#8217;; &#160; 3. Посмотреть блокировки: select object_name, s.sid, s.serial#, p.spid [...]]]></description>
			<content:encoded><![CDATA[<p>На данной странице написаны полезные команды и выборки.</p>
<p><strong>1. Посмотреть общий размер, который занимает СУБД Oracle (все схемы) на диске:</strong></p>
<blockquote><p>select sum(bytes)/1024/1024 || &#8216; Mb&#8217; from dba_segments;</p></blockquote>
<p>&nbsp;</p>
<p><strong>2. Посмотреть размер, который занимает схема &#8216;SHEMA&#8217; на диске:</strong></p>
<blockquote><p>select sum(bytes)/1024/1024 || &#8216; Mb&#8217; from dba_segments where owner=&#8217;SHEMA&#8217;;</p></blockquote>
<p>&nbsp;</p>
<p><strong>3. Посмотреть блокировки:</strong></p>
<blockquote><p>select object_name, s.sid, s.serial#, p.spid<br />
from v$locked_object l, dba_objects o, v$session s, v$process p<br />
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr;</p></blockquote>
<p>&nbsp;</p>
<p><strong>4. Посмотреть SID:</strong></p>
<blockquote><p>select * from v$session;</p></blockquote>
<p>&nbsp;</p>
<p><strong>5. Посмотреть названия (столбец TABLE_NAME) всех таблиц СУБД Oracle (все схемы):</strong></p>
<blockquote><p>select * from all_tables;</p></blockquote>
<p>&nbsp;</p>
<p><strong>6. Посмотреть названия (столбец TABLE_NAME) всех таблиц схемы &#8216;SHEMA&#8217; СУБД Oracle:</strong></p>
<blockquote><p>select * from all_tables where owner=&#8217;SHEMA&#8217;;</p></blockquote>
<p>&nbsp;</p>
<p><strong>7. Посмотреть названия (столбец COLUMN_NAME) всех полей СУБД Oracle (все схемы и все таблицы):</strong></p>
<blockquote><p>select * from all_tab_columns;</p></blockquote>
<p>&nbsp;</p>
<p><strong>8. Посмотреть названия (столбец COLUMN_NAME) всех полей схемы </strong><strong>&#8216;SHEMA&#8217; СУБД Oracle (все таблицы):</strong></p>
<blockquote><p>select * from all_tab_columns where owner=&#8217;SHEMA&#8217;;</p></blockquote>
<p>&nbsp;</p>
<p><strong>9. Посмотреть комментарии для таблицы TABLE_NAME:</strong></p>
<blockquote><p>select * from all_col_comments  where owner=&#8217;SHEMA&#8217; and table_name=&#8217;TABLE_NAME&#8217;;</p></blockquote>
<p>&nbsp;</p>
<p><strong>10. Страница время от времени дополняется.</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/04/11/oracle_other/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка SAP BusinessObjects BI platform 4.0 SP2</title>
		<link>http://kochetov.org.ua/2012/03/23/sapbobi40sp_install/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sapbobi40sp_install</link>
		<comments>http://kochetov.org.ua/2012/03/23/sapbobi40sp_install/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 06:00:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2777</guid>
		<description><![CDATA[1. Скачиваем SAP BusinessObjects BI 4.0 SP2 с сайта http://service.sap.com. &#160; 2. В версии SAP BusinessObjects Enterprise XI 3.0 и SAP BusinessObjects Enterprise XI 3.1 нужно было проверять обновление KB943295. Если оно было, то его удаляли. Для версии SAP BusinessObjects BI 4.0 не понятно нужно ли удалять данное обновление, но на всякий случай удаляем его. &#160; 3.Региональные [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1.</strong> Скачиваем SAP BusinessObjects BI 4.0 SP2 с сайта http://service.sap.com.</p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>2.</strong> В версии SAP BusinessObjects Enterprise XI 3.0 и SAP BusinessObjects Enterprise XI 3.1 нужно было проверять обновление KB943295. Если оно было, то его удаляли. Для версии SAP BusinessObjects BI 4.0 не понятно нужно ли удалять данное обновление, но на всякий случай удаляем его.</p>
<p>&nbsp;<br />
<strong>3.</strong>Региональные и языковые настройки на сервере делаем English (United States). Должно получиться где-то так:</p>
<p style="text-align: center;"><img class="size-full wp-image-2781 aligncenter" title="SapBOBI4.0-install_1" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_1.jpg" alt="SapBOBI4.0-install_1" width="465" height="535" /></p>
<p>&nbsp;</p>
<p><strong>4.</strong> Запускаем инсталяцию:</p>
<p style="text-align: center;"><img class="size-full wp-image-2783 aligncenter" title="SapBOBI4.0-install_2" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_2.jpg" alt="SapBOBI4.0-install_2" width="359" height="161" /></p>
<p>&nbsp;</p>
<p><strong>5.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2785 aligncenter" title="SapBOBI4.0-install_3" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_3.jpg" alt="SapBOBI4.0-install_3" width="503" height="484" /></p>
<p>&nbsp;</p>
<p><strong>6.</strong><strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2787 aligncenter" title="SapBOBI4.0-install_4" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_4.jpg" alt="SapBOBI4.0-install_4" width="503" height="485" /></p>
<p>&nbsp;</p>
<p><strong>7. </strong>Соглашаемся с лицензионным соглашением:<strong></strong><strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2788 aligncenter" title="SapBOBI4.0-install_5" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_5.jpg" alt="SapBOBI4.0-install_5" width="503" height="487" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>8. </strong>Вводим Product Keycode. Временную лицензию можно скачать с сайта http://service.sap.com/licensekeys — «Obtain a temporary license key (ZIP file)»:<strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2789 aligncenter" title="SapBOBI4.0-install_6" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_6.jpg" alt="SapBOBI4.0-install_6" width="507" height="487" /></p>
<p>&nbsp;</p>
<p><strong>9. </strong>Выбираем языки, которые будут установлены:<strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2791 aligncenter" title="SapBOBI4.0-install_7" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_7.jpg" alt="SapBOBI4.0-install_7" width="507" height="488" /></p>
<p>&nbsp;</p>
<p><strong>10. </strong>Выбираем тип установки:<strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2792 aligncenter" title="SapBOBI4.0-install_8" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_8.jpg" alt="SapBOBI4.0-install_8" width="507" height="488" /></p>
<p>&nbsp;</p>
<p><strong>11. </strong>Прописываем папку установки, если нужно:<strong><br />
</strong></p>
<p style="text-align: center;"><img class="wp-image-2793 aligncenter" title="SapBOBI4.0-install_9" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_9.jpg" alt="SapBOBI4.0-install_9" width="507" height="488" /></p>
<p>&nbsp;</p>
<p><strong>12.</strong></p>
<p style="text-align: center;"><img class="wp-image-2795 aligncenter" title="SapBOBI4.0-install_10" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_10.jpg" alt="SapBOBI4.0-install_10" width="507" height="488" /></p>
<p>&nbsp;</p>
<p><strong>13.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2796 aligncenter" title="SapBOBI4.0-install_11" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_11.jpg" alt="SapBOBI4.0-install_11" width="507" height="488" /></p>
<p>&nbsp;</p>
<p><strong>14.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2797 aligncenter" title="SapBOBI4.0-install_12" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_12.jpg" alt="SapBOBI4.0-install_12" width="502" height="485" /></p>
<p>&nbsp;</p>
<p><strong>15.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2798 aligncenter" title="SapBOBI4.0-install_13" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_13.jpg" alt="SapBOBI4.0-install_13" width="502" height="485" /></p>
<p>&nbsp;</p>
<p><strong>16.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2799 aligncenter" title="SapBOBI4.0-install_14" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_14.jpg" alt="SapBOBI4.0-install_14" width="505" height="487" /></p>
<p>&nbsp;</p>
<p><strong>17.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2800 aligncenter" title="SapBOBI4.0-install_15" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_15.jpg" alt="SapBOBI4.0-install_15" width="505" height="487" /></p>
<p>&nbsp;</p>
<p><strong>18.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2801 aligncenter" title="SapBOBI4.0-install_16" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_16.jpg" alt="SapBOBI4.0-install_16" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>19. </strong>Конфигурируем порты Web-сервера, если нужно:<strong><br />
</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2802 aligncenter" title="SapBOBI4.0-install_17" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_17.jpg" alt="SapBOBI4.0-install_17" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>20.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2803 aligncenter" title="SapBOBI4.0-install_18" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_18.jpg" alt="SapBOBI4.0-install_18" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>21.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2804 aligncenter" title="SapBOBI4.0-install_19" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_19.jpg" alt="SapBOBI4.0-install_19" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>22.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2805 aligncenter" title="SapBOBI4.0-install_20" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_20.jpg" alt="SapBOBI4.0-install_20" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>23.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2806 aligncenter" title="SapBOBI4.0-install_21" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_21.jpg" alt="SapBOBI4.0-install_21" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>24.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2807 aligncenter" title="SapBOBI4.0-install_22" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_22.jpg" alt="SapBOBI4.0-install_22" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>25.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2808 aligncenter" title="SapBOBI4.0-install_23" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_23.jpg" alt="SapBOBI4.0-install_23" width="505" height="488" /></p>
<p>&nbsp;</p>
<p><strong>26.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2809 aligncenter" title="SapBOBI4.0-install_24" src="http://kochetov.org.ua/wp-content/uploads/2012/03/SapBOBI4.0-install_24.jpg" alt="SapBOBI4.0-install_24" width="505" height="488" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/03/23/sapbobi40sp_install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Перечень основных команд</title>
		<link>http://kochetov.org.ua/2012/03/07/oracle_list_commands/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_list_commands</link>
		<comments>http://kochetov.org.ua/2012/03/07/oracle_list_commands/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 11:45:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2719</guid>
		<description><![CDATA[     В данной заметке будут описаны основные команды SQL (DDL &#8212; Data Definition Language (язык описания данных), DML &#8212; Data Manipulation Language (язык управления (манипулирования) данными), DCL &#8212; Data Control Language (язык баз данных для осуществления административных функций)). 1. Посмотреть структуру таблицы: DESC имя_таблицы &#160; 2. Создать таблицу table1: CREATE TABLE table1 ( field1  VARCHAR2(25) [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">     В данной заметке будут описаны основные команды SQL (<strong>DDL</strong> &#8212; Data Definition Language (язык описания данных), <strong>DML</strong> &#8212; Data Manipulation Language (язык управления (манипулирования) данными), <strong>DCL</strong> &#8212; Data Control Language (язык баз данных для осуществления административных функций)).</p>
<p><strong>1. Посмотреть структуру таблицы:</strong></p>
<blockquote><p>DESC имя_таблицы</p></blockquote>
<p>&nbsp;</p>
<p><strong>2. Создать таблицу table1:</strong></p>
<blockquote><p>CREATE TABLE table1 (<br />
field1  VARCHAR2(25) NOT NULL,<br />
field2 NUMBER(4,2) NOT NULL,<br />
field3 DATE<br />
);</p></blockquote>
<p>&nbsp;</p>
<p><strong>3. Вставить данные в таблицу table1:</strong></p>
<blockquote><p>INSERT INTO table1 VALUES (‘Data1′, 1, ’5-NOV-2000′);<br />
INSERT INTO table1 VALUES (‘Data2′, 2.5, ’29-JUN-2001′);<br />
INSERT INTO table1 VALUES (‘Data3′, 50.75, ’10-DEC-2002′);<br />
INSERT INTO table1 VALUES (‘Data4′, 1, NULL);</p></blockquote>
<p>&nbsp;</p>
<p><strong>4. Выбрать все поля (столбцы)  из таблицы table1:</strong></p>
<blockquote><p>SELECT * FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>5. Выбрать некоторые поля из таблицы table1:</strong></p>
<blockquote><p>SELECT field1, field2 FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>6. Удалить таблицу table1:</strong></p>
<blockquote><p>DROP TABLE table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>7. Выбрать поля из таблицы table1 с условием:</strong></p>
<blockquote><p>SELECT столбцы FROM имя_таблицы WHERE условие(я);</p></blockquote>
<p>&nbsp;</p>
<p><strong>8. Отсортировать по отдельным столбцам:</strong></p>
<blockquote><p>SELECT * FROM имя_таблицы ORDER BY столбец_сортировки ASC или DESC;</p></blockquote>
<p>где, ASC — возрастающая сортировка, а DESC — убывающая сортировка.</p>
<p>&nbsp;</p>
<p><strong>9. Изменить данные в таблице table1:</strong></p>
<blockquote><p>UPDATE имя_таблицы SET имя_столбца = новое_значение WHERE условие;</p></blockquote>
<p>&nbsp;</p>
<p><strong>10. Удаление записей из таблицы table1:</strong></p>
<blockquote><p>DELETE FROM имя_таблщы WHERE условие;</p></blockquote>
<p>&nbsp;</p>
<p><strong>11. Удаление всех записей таблицы:</strong></p>
<blockquote><p>DELETE FROM имя_таблщы WHERE условие;</p></blockquote>
<p>или</p>
<blockquote><p>TRUNCATE TABLE имя_таблицы;</p></blockquote>
<p>&nbsp;</p>
<p><strong>12. Откат одной и более транзакций:</strong></p>
<blockquote><p>ROLLBACK TO имя_точки _отката;</p></blockquote>
<p>&nbsp;</p>
<p><strong>13. Откат в  предварительно установленную точку:</strong></p>
<blockquote><p>SAVEPOINT имя_точки_сохранения;</p></blockquote>
<p>&nbsp;</p>
<p><strong>14. Выравнивания количества десятичных знаков:<br />
</strong></p>
<blockquote><p>COLUMN имя_столбца FORMAT код_формата;</p></blockquote>
<p>&nbsp;</p>
<p><strong>15. Форматирование заголовков столбцов:</strong></p>
<blockquote><p>COLUMN имя_столбца HEADING текст_заголовка JUSTIFY LEFT;</p></blockquote>
<p>или</p>
<blockquote><p>COLUMN имя_столбца HEADING текст_заголовка JUSTIFY CENTER;</p></blockquote>
<p>или</p>
<blockquote><p>COLUMN имя_столбца HEADING текст_заголовка JUSTIFY RIGHT;</p></blockquote>
<p>&nbsp;</p>
<p><strong>16. Отключения форматирования, заданного командой COLUMN:</strong></p>
<p>COLUMN имя_столбца OFF;</p>
<p>&nbsp;</p>
<p><strong> 17. Буферизация выходных данных на диске (процесс записи информации в дисковый файл):</strong></p>
<blockquote><p>SPOOL имя_буферного_файла;</p></blockquote>
<blockquote><p>SPOOL c:\test1.sql<br />
SELECT * FROM table1;<br />
SELECT * FROM table2;<br />
SPOOL OFF</p></blockquote>
<p>&nbsp;</p>
<p><strong>18. Запуск сценария:</strong></p>
<p style="text-align: justify;">     Запустить сценарий очень легко. Нужно лишь поставить перед именем файла знак «at» (@). Введите в строке приглашения SQL&gt; следующую команду:</p>
<blockquote><p>@с:\test1.sql</p></blockquote>
<p>&nbsp;</p>
<p><strong>19. Использование переменной подстановки:</strong></p>
<blockquote><p>SET VERIFY OFF<br />
SELECT field1, field2, field3 FROM table1 WHERE field1 оператор &amp;приглашения ввода;<br />
SET VERIFY ON</p></blockquote>
<blockquote><p>SET VERIFY OFF<br />
SELECT field1, field2, field3 FROM table1 WHERE field1&gt;=&amp;minimum_quantity_sold;<br />
SET VERIFY ON</p></blockquote>
<p>&nbsp;</p>
<p><strong>20. Определять приглашение произвольного вида, ACCEPT:</strong></p>
<blockquote><p>ACCEPT имя_переменной prompt текст приглашения;</p></blockquote>
<blockquote><p>SET VERIFY OFF<br />
SET ECHO OFF<br />
ACCEPT v_earliest_date<br />
PROMPT «Earliest date you would like to see? (dd-mmm-yy):»<br />
ACCEPT v_latest_date<br />
PROMPT «Thank you. Latest date you would like to see? (dd-mmm-yy):»<br />
SELECT field1, field2, field3 FROM «table1″<br />
WHERE field3 BETWEEN ‘&amp;v_earliest_date’ AND ‘&amp;v_latest_date’<br />
ORDER BY field1, field2;<br />
SET VERIFY ON<br />
SET ECHO ON</p></blockquote>
<p>&nbsp;</p>
<p><strong>21. Вставка комментариев в SQL-сценарии:</strong></p>
<blockquote>
<p style="text-align: justify;">     Для создания однострочного комментария можно поместить в начале строки «REM» вместо «—». Этот способ используется в других языках программирования, поэтому знаком программистам, переходящим к изучению SQL после других языков. Однако чисто визуально «REM» не привлекает внимание столь же легко, как «—». Возможно, именно поэтому вариант «—» более распространен. Если вы намерены сгруппировать несколько строк комментариев, более подходящим может оказаться другой подход, при котором в начале секции кпомещается «/*», а в конце — «*/». Все строки между этими парами символов игнорируются.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>22. Удалить индекс:<br />
</strong></p>
<blockquote><p>DROP INDEX имя_индекса;</p></blockquote>
<p>&nbsp;</p>
<p><strong>23. Создать индекс:</strong></p>
<blockquote><p>CREATE INDEX имя_индекса ON имя_таблицы(имя_столбца);</p></blockquote>
<blockquote><p>CREATE INDEX имя_индекса ON имя_таблицы (имя_первого_столбца, имя_второго_столбца );</p></blockquote>
<p>&nbsp;</p>
<p><strong>24. Создать битовый индекс:<br />
</strong></p>
<blockquote><p>CREATE BITMAP INDEX имя_индекса ON имя_таблицы(имя_столбца);</p></blockquote>
<p>&nbsp;</p>
<p><strong>25. Изменить статус существующего столбца на NOT NULL:<br />
</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы MODIFY (имя_столбца NOT NULL);</p></blockquote>
<blockquote><p>ALTER TABLE table1 MODIFY (first_name NOT NULL);<br />
ALTER TABLE table1 MODIFY (last_name NOT NULL);</p></blockquote>
<p>&nbsp;</p>
<p><strong>26. Использование ограничения, гарантирующего уникальность значений:<br />
</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы ADD CONSTRAINT имя_огрантения UNIQUE (имена_столбцов) ;</p></blockquote>
<p>&nbsp;</p>
<p><strong>27. Контроль ограничения на столбец существующей таблицы:</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы ADD CONSTRAINT [имя_ограничения] СНЕСК (имя_столбца условие);</p></blockquote>
<p>&nbsp;</p>
<p><strong>28. Временно запретить ограничение:</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы DISABLE CONSTRAINT имя_ограничения;</p></blockquote>
<p>&nbsp;</p>
<p><strong>29. Разрешить ограничения:</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы ENABLE CONSTRAINT имя_ограничения;</p></blockquote>
<p>&nbsp;</p>
<p><strong>30. Удалить ограничение:</strong></p>
<blockquote><p> ALTER TABLE имя_таблицы DROP CONSTRAINT имя_ограничения;</p></blockquote>
<p>&nbsp;</p>
<p><strong>31. Создать первичный ключ:</strong></p>
<blockquote><p>ALTER TABLE имя_таблицы ADD PRIMARY KEY (имя_столбца_1, имя_столбца_2,…);</p></blockquote>
<p>&nbsp;</p>
<p><strong>32. Создать вторичный (внешний) ключ:</strong></p>
<blockquote><p>ALTER TABLE имя_подчиненной_таблицы<br />
ADD CONSTRAINT имя_ограничения<br />
FOREIGN KEY (имена_столбцов_подчиненной_таблицы)<br />
REFERENCES имя_главной_таблицы;</p></blockquote>
<p>&nbsp;</p>
<p><strong>33. </strong><strong>Страница время от времени дополняется.</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/03/07/oracle_list_commands/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Индексы и ограничения</title>
		<link>http://kochetov.org.ua/2012/03/01/oracle_indexes_constraints/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_indexes_constraints</link>
		<comments>http://kochetov.org.ua/2012/03/01/oracle_indexes_constraints/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 09:32:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2567</guid>
		<description><![CDATA[     Сначала мы выясним, что такое индексы, и как их использование помогает ускорить работу базы данных. Затем вы увидите, как создаются ограничения базы данных, проверяющие входные данные и останавливающие выполнение любой команды, в которой делается попытка ввести значения, не соответствующие вашим требованиям. После этого вы узнаете о связях между таблицами, сделав тем самым первые шаги [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">     Сначала мы выясним, что такое индексы, и как их использование помогает ускорить работу базы данных. Затем вы увидите, как создаются ограничения базы данных, проверяющие входные данные и останавливающие выполнение любой команды, в которой делается попытка ввести значения, не соответствующие вашим требованиям. После этого вы узнаете о связях между таблицами, сделав тем самым первые шаги в области проектировании реляционных баз данных. В заключение вы научитесь писать запросы, включающие в себя другие запросы, что позволяет получать весьма сложные результаты при очень небольшом объеме кода.</p>
<p>&nbsp;</p>
<p><strong>Индексы</strong></p>
<p style="text-align: justify;">     Несомненно, вы знакомы с индексными указателями (индексами), размещаемыми на последних страницах книг. Что можно увидеть, обратившись к такому индексу? Одно-два слова, обозначающих каждую тему или понятие, за которыми следует номер страницы (или несколько номеров). Пролистав индекс и найдя нужную тему, вы можете сразу перейти на страницы, имеющие к ней отношение. Индексы удобны тем, что позволяют находить в книге определенную информацию, не просматривая все страницы подряд.</p>
<p><strong>Индексы в базах данных</strong></p>
<p style="text-align: justify;">     Тот же принцип индексирования можно применить к таблице базы данных. Когда таблица содержит большое число записей, ее полный просмотр с целью поиска определенных записей может занять у Oracle (как и у любой другой СУБД) много времени — сравните это с перелистыванием всей книги в поиске страниц, где обсуждается определенная тема. Oracle позволяет создавать вторую, скрытую таблицу, содержащую один или несколько важных столбцов из главной таблицы вместе с указателями на строки основной таблицы. В данном случае вместо номеров страниц указателями являются номера строк. Далее я буду называть эту скрытую таблицу индексом. Просматривая индекс, Oracle может узнать, какие строки содержат запрашиваемые данные (при условии, что эти данные находятся в столбцах, составляющих индекс). Поскольку индекс намного меньше таблицы, на которую он ссылается (подобно тому как книжный индекс намного меньше полного текста книги), поиск данных в таблице с индексом будет выполняться, существенно быстрее, чем в таблице без индекса. Таблица может иметь более одного индекса.</p>
<p style="text-align: justify;">     После того как вы создали индекс, Oracle автоматически поддерживает его синхронизацию с таблицей. Любые операции INSERT, UPDATE или DELETE над этой таблицей будут автоматически изменять ее индекс, и любая команда SELECT будет выполняться с привлечением индекса, если он содержит требуемые столбцы. Добавление или удаление индексов не влияет на операции с таблицей — любая использовавшая ее программа по-прежнему будет работать, хотя и более медленно. В случае удаления таблицы все ассоциированные с ней индексы также будут удалены, поскольку без таблицы индекс бесполезен.</p>
<p style="text-align: justify;">     Команда удаления индекса имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">DROP INDEX имя_индекса;</p>
</blockquote>
<p><strong>Когда индексы помогают?</strong></p>
<p style="text-align: justify;">     Индексы уменьшают время отклика команд, выполнение которых требует считывания содержимого таблицы. Это означает, что все команды SELECT, UPDATE и DELETE будут работать быстрее, если таблица имеет подходящий индекс.</p>
<p style="text-align: justify;">     Добавление индексов к таблице не ускоряет ввод данных командами INSERT; фактически это дает обратный эффект. Почему присутствие индекса замедляет вставку? Вспомните, что индекс тоже является таблицей. Когда вы добавляете запись к проиндексированной таблице, Oracle должен добавить запись и к самой таблице, и к ее индексу, т.е. выполнить две вставки для каждой записи. В результате добавление индекса к таблице вызовет более чем двукратное увеличение времени вставки (собственно две вставки плюс небольшое дополнительное время на их координацию). Добавление двух индексов замедлит операцию вставки в три раза, трех индексов — в четыре раза, и т.д.</p>
<p style="text-align: justify;">     Таким образом, использование индексов — это компромисс. Они замедляют ввод данных, но ускоряют их считывание. Следовательно, индексирование таблиц нежелательно в тех приложениях, где ввод данных должен происходить как можно быстрее. Например, в системе, обслуживающей сеть розничных магазинов, от кассовых терминалов требуется максимальная скорость выполнения транзакций. В этом случае индексирование таблицы транзакций будет ошибкой, поскольку приведет к замедлению ввода данных. С другой стороны, в той же самой компании могут работать специалисты, которым нужно выполнять запросы, анализирующие транзакции, а эти запросы сильно выиграют от наличия правильно индексированных таблиц. Как удовлетворить этим противоречивым требованиям? Во многих системах данные о транзакциях каждую ночь автоматически копируются из рабочих таблиц во вспомогательные индексированные таблицы, которые на следующий день используются для анализа. Вставка данных в индексированную таблицу занимает намного больше времени, чем вставка в таблицу транзакций, не имеющую индексов, но это никого не волнует, поскольку магазины закрыты, покупателей нет, а вся работа выполняется компьютерами.</p>
<p style="text-align: justify;">     Чем больше таблица, тем больший выигрыш можно получить от ее индексирования. Например, все созданные в предыдущих главах таблицы настолько малы, что любые операции с ними выполняются практически мгновенно. Как следствие, индексирование этих таблиц не даст заметной выгоды. По мере роста таблиц выигрыш увеличивается.</p>
<p style="text-align: justify;">     В качестве примера снова возьмем таблицу с миллионом записей.</p>
<p><strong>Результаты выполнения операций DML при наличии и отсутствии индекса</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#C0C0C0">
<td><strong>Операция</strong></td>
<td><strong>Без индекса</strong></td>
<td><strong>С индексом</strong></td>
<td><strong>Увеличение скорости</strong></td>
</tr>
<tr>
<td> SELECT (50 записей)</td>
<td> 18.9</td>
<td> 0.6</td>
<td> в 31.5 раза</td>
</tr>
<tr>
<td> UPDATE (50 записей)</td>
<td> 19.7</td>
<td> 0.5</td>
<td> в 39.4 раза</td>
</tr>
<tr>
<td> DELETE (50 записей)</td>
<td> 19.6</td>
<td> 0.06</td>
<td> в 326.7 раза</td>
</tr>
</tbody>
</table>
<p><strong><br />
</strong></p>
<p><strong>Как создаются индексы</strong></p>
<p style="text-align: justify;">     Создать индекс очень легко. Для этого используется команда со следующим синтаксисом:</p>
<blockquote>
<p style="text-align: justify;">CREATE INDEX имя_индекса ON имя_таблицы(имя_столбца);</p>
</blockquote>
<p style="text-align: justify;">     Если вы хотите, чтобы индекс содержал более одного столбца, используйте следующий синтаксис:</p>
<blockquote><p>CREATE INDEX имя_индекса ON имя_таблицы (имя_первого_столбца, имя_второго_столбца );</p></blockquote>
<p>&nbsp;</p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     Максимальное число столбцов, которые можно включать в стандартный индекс Oracle, равно 32.</p>
</blockquote>
<p><strong>Различные типы индексов</strong></p>
<p style="text-align: justify;">     Вероятно, вы уже поняли, что индексирование — это, по существу, способ компактного хранения информации о местонахождении записей, организованной на основе содержимого этих записей. Содержимое базы данных может сильно варьироваться от системы к системе, и для разных типов содержимого оптимальными оказываются разные виды организации. Oracle предлагает несколько типов индексов, в каждом из которых применяется свой организационный подход. Дальше описываются два самых распространенных типа индексов; остальные используются только в очень сложных базах данных и больше подходят для книги по администрированию баз данных.</p>
<p><strong>Индексы В*-дерева</strong></p>
<p style="text-align: justify;">     Тип индекса, используемый в Oracle по умолчанию, называется В*-деревом (В*-Тгее).</p>
<p style="text-align: justify;">     При создании индекса В*-дерева Oracle анализирует значения в индексируемом столбце (столбцах) и определяет, как разделить таблицу на блоки-листья (leaf blocks) с равным числом записей. Затем он создает уровни блоков-ветвей (branch blocks), обеспечивающих поиск записей в нижележащих блоках-листьях за минимально возможное число шагов.</p>
<p style="text-align: justify;"><strong>     Организация записей в индексе В*-дерева показана на рисунке ниже</strong></p>
<p style="text-align: center;"><img class="wp-image-2612 aligncenter" title="oracle-indexes-constraints_1" src="http://kochetov.org.ua/wp-content/uploads/2012/03/oracle-indexes-constraints_1.jpg" alt="oracle-indexes-constraints_1" width="560" height="459" /></p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     На рисунке выше блоки-ветви делят алфавит на равные части. В реальности точки ветвления определяются в зависимости от значений, содержащихся в записях. Например, если имена в записях таблицы гораздо чаще начинаются на &#171;А &#171;, чем на какую-либо другую букву, то букве &#171;А&#187; может быть выделена вся ветвь, а следующая ветвь начнется с буквы &#171;В&#187;.</p>
</blockquote>
<p>Достоинство индекса В*-дерева в том, что он позволяет Oracle быстро идентифицировать записи, не считывая их. За счет минимизации объема считываемых данных, а следовательно, и объема выполняемой работы, Oracle может возвращать результаты гораздо быстрее. Предположим, например, что таблица содержит миллиард записей, и вы хотите просмотреть запись с определенным идентификационным номером. Таблица не обязательно будет отсортирована по идентификационным номерам, поэтому не исключено, что Oracle должен будет считывать все записи, пока не найдет нужную. Но если для таблицы определен индекс В*-дерева, то Oracle сможет найти запись не более чем за 31 шаг. На каждом шаге исключается половина записей таблицы, поэтому Oracle может очень быстро сократить объем работы до разумных величин. Ниже на рисунке показано, насколько быстро индекс В*-дерева сокращает число записей, вовлеченных в операцию.</p>
<p style="text-align: center;"><img class="size-full wp-image-2639 aligncenter" title="oracle-indexes-constraints_2" src="http://kochetov.org.ua/wp-content/uploads/2012/03/oracle-indexes-constraints_2.jpg" alt="oracle-indexes-constraints_2" width="533" height="760" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;">     Поскольку сила индекса В*-дерева заключена в делении данных на множества и подмножества, этот тип индекса оптимален в тех случаях, когда индексируемый столбец содержит широкий диапазон значений — скажем, имена или даты. Для столбца с узким диапазоном значений (например, &#171;пол&#187;) лучше всего использовать битовый индекс.</p>
<p><strong>Битовые индексы</strong></p>
<p style="text-align: justify;">     Коль скоро структура индекса В*-дерева оптимальна для индексирования столбца со многими уникальными значениями, логично предположить, что для столбца с малым числом уникальных значений может лучше подойти другая структура индекса. Например, столбец &#171;пол&#187;, скорее всего, будет содержать одно из трех значений: &#171;М&#187; (&#171;мужской&#187;), &#171;F&#187; (&#171;женский&#187;) или &#171;U&#187; (&#171;Unknown&#187; — &#171;неизвестный&#187;). Помещение столь малого количества уникальных значений в структуру В*-дерева не имеет смысла, поскольку подход &#171;делить на подгруппы шаг за шагом&#187;, делающий В*-дерево столь удобным для поиска многовариантных значений, не даст большого выигрыша. В такой ситуации лучше использовать битовый индекс.</p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     Под кардинальностью (cardinality) понимается количество уникальных значений, которые может содержать столбец. Столбец с малым количеством уникальных значений (например, пол или значения типа &#171;истина &#171;/&#187;ложь &#171;) имеет низкую кардинальность. Столбец с большим количеством уникальных значений (например, цены или имена) имеет высокую кардинальность.</p>
</blockquote>
<p style="text-align: justify;">     Для тех запросов SELECT, в которых конструкция WHERE содержит столбец с низкой кардинальностью, предварительное создание битового индекса может значительно сократить время получения ответов. Рост скорости обусловлен двумя факторами: во-первых, битовые индексы могут быть довольно компактными<br />
(поскольку для хранения бит требуется лишь малая часть того места, которое отводится другим типам данных в стандартном индексе), а во-вторых, значения&#187; 1&#8243; или &#171;0&#8243; могут анализироваться компьютером очень быстро.</p>
<p style="text-align: justify;">     Команда создания битового индекса практически идентична команде создания стандартного индекса; добавляется только слово &#171;BITMAP&#187;, как показано в следующем примере:</p>
<blockquote><p>CREATE BITMAP INDEX имя_индекса ON имя_таблицы(имя_столбца);</p></blockquote>
<p>&nbsp;</p>
<p><strong>Обеспечение целостности данных: ограничения</strong></p>
<p style="text-align: justify;">     Одной из самых важных задач, стоящих при разработке таблиц, является обеспечение наивысшего возможного качества данных, которые вводятся пользователями в эти таблицы. &#171;Грязные&#187; данные содержат неверные коды, слишком большие или слишком малые числа, бессмысленные даты или просто пустые значения в тех полях, которые должны быть заполнены. Вы можете в широких пределах контролировать содержимое данных, заносимых в таблицу.</p>
<p><strong>Что такое ограничения?</strong></p>
<p style="text-align: justify;">     Ограничение (constraint) — это одно и более условий, которым должна удовлетворять введенная пользователем запись, чтобы Oracle вставил ее в таблицу. Ограничения хранятся как часть определения таблицы и после создания применяются автоматически. Когда введенная кем-либо команда INSERT или UPDATE нарушает ограничение, Oracle прерывает ее выполнение, производит откат и выдает сообщение об ошибке.</p>
<p><strong>Как создавать ограничения</strong></p>
<p style="text-align: justify;">     Дальше будут описаны ограничения трех различных типов. При совместном использовании эти ограничения могут оказать значительную помощь в обеспечении &#171;чистоты&#187; табличных данных.</p>
<p><strong>NOT NULL</strong></p>
<p style="text-align: justify;">     С одним из типов ограничений вы уже познакомились раньше, когда указывали в команде CREATE TABLE, что столбцы не должны содержать null-значений.</p>
<p style="text-align: justify;">     Теперь пора научиться изменять существующие таблицы таким образом, чтобы в столбцах больше не допускались null-значения при вставке или обновлении записей. Команда изменения статуса существующего столбца на NOT NULL имеет следующий синтаксис:</p>
<blockquote><p>ALTER TABLE имя_таблицы MODIFY (имя_столбца NOT NULL);</p></blockquote>
<blockquote><p>ALTER TABLE table1 MODIFY (first_name NOT NULL);<br />
ALTER TABLE table1 MODIFY (last_name NOT NULL);</p></blockquote>
<p><strong>UNIQUE</strong></p>
<p style="text-align: justify;">     Пользователям ничто не мешает ввести данные об одном человеке дважды. Вы думаете, им лучше знать? В идеале это так. Но люди отвлекаются, забивают, что уже сделано, а иногда просто бывают невнимательными; жизнь такова, что все мы делаем ошибки.</p>
<p style="text-align: justify;">     Это не означает, что отдельно взятый человек совершит все возможные ошибки. Но за время существования базы данных ее будут использовать многие люди, поэтому вполне вероятно, что в пределах этой группы каждая из возможных ошибок рано или поздно будет сделана. Одна из составляющих вашей работы — думать наперед и принимать меры к тому, чтобы ненамеренные попытки ввести &#171;дефектные&#187; данные не увенчались успехом.</p>
<p style="text-align: justify;">     Таким образом, мы снова возвращаемся к вопросу создания ограничений, исключающих возможность повторного ввода записей. Первое, что приходит в голову — это создать ограничение уникальности, гарантирующее, что данная комбинация из имени и фамилии может вводиться только один раз. Для начала это неплохо, но ограничение только по имени может быть неоправданно строгим. На свете много Бобов Смитов, и не исключено, что ваша компания наймет нескольких людей с таким именем. Решение состоит в том, чтобы включить в ограничение дату Приёма на работу, поскольку маловероятно, что два человека с одним и тем же именем будут наняты в один день.</p>
<p style="text-align: justify;">     Посмотрим, какой синтаксис используется для создания ограничения, гарантирующего уникальность значений:</p>
<blockquote>
<p style="text-align: justify;">ALTER TABLE имя_таблицы ADD CONSTRAINT имя_огрантения UNIQUE (имена_столбцов) ;</p>
</blockquote>
<blockquote><p>ALTER TABLE table1 ADD CONSTANT table1_unique UNIQUE (first_name, last_name, hiredate);</p></blockquote>
<p style="text-align: justify;">     Когда вы создаете ограничение уникальности, Oracle неявно создает уникальный индекс (unique index). Этот индекс содержит столбцы, указанные в команде ALTER TABLE&#8230;ADD CONSTRAINT, а его имя совпадает с именем ограничения. Уникальный индекс помогает Oracle идентифицировать повторяющиеся записи. Создавая этот индекс, Oracle считывает все существующие записи таблицы и представляет их в индексе. По этой причине создание ограничения уникальности будет успешным только в том случае, если оно не нарушается текущими записями таблицы. Если таблица содержит записи с повторяющимися значениями в указанных вами столбцах, то в ответ на команду ALTER TABLE&#8230;ADD CONSTRAINT будет выдано сообщение об ошибке с объяснением проблемы.</p>
<p><strong>CHECK</strong></p>
<p style="text-align: justify;">     Контрольное ограничение (check constraint) позволяет определить, каким условиям должны удовлетворять входные данные, чтобы Oracle разрешил их ввод. Контрольное ограничение можно определять для каждого столбца таблицы. Например, вы можете объявить, что значения в столбце с ценами должны быть положительными числами, и одновременно потребовать, чтобы значения в столбце с датами лежали в определенном диапазоне. Контрольные ограничения входят в число наиболее мощных инструментов, обеспечивающих чистоту хранимых данных.</p>
<p style="text-align: justify;">     Команда создания контрольного ограничения на столбец существующей таблицы имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">ALTER TABLE имя_таблицы ADD CONSTRAINT [имя_ограничения] СНЕСК (имя_столбца условие);</p>
</blockquote>
<p style="text-align: justify;">     Параметр имя_таблицы, разумеется, идентифицирует таблицу, столбцы которой должны контролироваться. Необязательный параметр имя_ограничения позволяет вам самостоятельно присвоить имя ограничению. Если опустить этот параметр, Oracle выберет имя автоматически, причем оно не будет нести какой-либо полезной информации. Лучше присваивать имя вручную, чтобы при нарушении ограничения в сообщении об ошибке стояло именно заданное вами имя — предположительно, более информативное, чем присвоенное по умолчанию.</p>
<p style="text-align: justify;">     Параметр имя_столбца идентифицирует столбец, к которому относится ограничение. Параметр условие определяет, каким требованиям должны удовлетворять данные, чтобы попытка их вставки в таблицу была успешной. Все вместе эти параметры выглядят точно так же, как и условие в конструкции WHERE оператора SELECT.</p>
<p style="text-align: justify;">     Чтобы определить контрольное ограничение, не обязательно ждать, пока будет создана таблица; это можно сделать одновременно с ее созданием. Информация об ограничении добавляется к определению соответствующего столбца после типа данных и опции NULL.</p>
<p><strong>Разрешение и запрещения существующих ограничений</strong></p>
<p style="text-align: justify;">     Бывают ситуации, когда полезно временно запретить ограничения, а впоследствии снова их разрешить. Например, при загрузке данных из внешнего источника вы можете заранее знать, что некоторые из них не удовлетворяют определенному ограничению, но предпочесть устранение ошибок средствами Oracle. В подобных случаях следует использовать команду ALTER TABLE, чтобы временно запретить ограничение, не удаляя его. Затем вы сможете загрузить данные с нежелательными значениями, исправить их и снова разрешить ограничение.</p>
<p style="text-align: justify;">     Синтаксис этой команды выглядит следующим образом:</p>
<blockquote>
<p style="text-align: justify;">ALTER TABLE имя_таблицы DISABLE CONSTRAINT имя_ограничения;</p>
</blockquote>
<p style="text-align: justify;">     Команда разрешения ограничения имеет похожий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">ALTER TABLE имя_таблицы ENABLE CONSTRAINT имя_ограничения;</p>
</blockquote>
<p><strong>Изменение и удаление существующих ограничений</strong></p>
<p style="text-align: justify;">     Жизнь непредсказуема, требования меняются, поэтому рано или поздно вам придется модифицировать или удалять существующие ограничения. Например, очень часто требуется изменять ограничение NULL на NOT NULL и наоборот. Синтаксис команды, разрешающей столбцу принимать null-значения, имеет следующий вид:</p>
<blockquote><p>ALTER TABLE имя_таблицы MODIFY (имя_столбца NULL);</p></blockquote>
<p style="text-align: justify;">     Если нужно, чтобы столбец перестал принимать null-значения, используется следующий синтаксис:</p>
<blockquote><p>ALTER TABLE имя_таблицы MODIFY (имя_столбца NOT NULL);</p></blockquote>
<p style="text-align: justify;">     Если нужно совсем удалить ограничение, используется следующий синтаксис:</p>
<blockquote><p>ALTER TABLE имя_таблицы DROP CONSTRAINT имя_ограничения;</p></blockquote>
<blockquote><p><strong>Совет</strong></p>
<p style="text-align: justify;">     Имейте в виду, что удаление ограничения — это необратимое действие. Если есть вероятность, что ограничение снова потребуется, его лучше запретить, а не удалять.</p>
</blockquote>
<p><strong>Где следует определять ограничения &#8212; в базе данных или приложения?</strong></p>
<p style="text-align: justify;">     Далее вы познакомились с техникой определения ограничений в самой базе данных. Ограничения можно устанавливать и в интерфейсных компонентах — иначе говоря, в формах, которые используются для ввода данных. Оба подхода имеют свои достоинства.</p>
<p style="text-align: justify;">     Когда ограничения определены в интерфейсном компоненте, они могут проверяться без обращения к серверу базы данных. Это исключает ненужный сетевой трафик (поскольку ошибочные данные не передаются), уменьшает нагрузку на базу данных и позволяет сразу же выполнять контроль. В результате система работает быстрее, а сетевые и серверные ресурсы используются более эффективно. Такой подход идеален для систем, которые не допускают задержек на серверную обработку (например, кассовые терминалы), используют медленно работающие сетевые соединения (например, Интернет-приложения) или обслуживают много клиентов.</p>
<p style="text-align: justify;">Но что произойдет, если кто-то соединится с базой данных не через утвержденные формы ввода? Вы видели, насколько легко соединиться с базой данных через SQL*Plus, и это почти так же легко сделать при использовании офисных приложений типа Microsoft Access или Excel. Если ограничения базы данных устанавливаются только в формах ввода данных, то пользователь, соединившийся с базой данных другим способом, может внести изменения, которые не обязательно удовлетворяют ограничениям. В результате могут возникнуть большие проблемы — например, в заказах будут значиться товары, которых больше нет, или появятся служащие, начало работы которых датируется серединой 1800-х годов. Помните: если что-то может быть сделано неправильно, оно будет сделано неправильно. Включение ограничений в базу данных — это единственный способ гарантировать их выполнение независимо от того, как устанавливается соединение с базой данных.</p>
<p style="text-align: justify;">     С моей точки зрения, вопрос не в том, где устанавливать ограничения — в интерфейсных компонентах или на сервере базы данных. Ограничения на сервере необходимы, и точка. Вопрос в том, нужно ли их устанавливать также и в интерфейсных компонентах. Если ваше приложение будет обслуживать многих пользователей или работать через медленное сетевое соединение, и при этом требовать крайне малого времени отклика, подумайте о встраивании ограничений в интерфейсные компоненты.</p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     Если вы включаете ограничения и в базу данных, и в интерфейсный компонент, необходимо выработать стандарты на их изменение. В противном случае наверняка возникнет рассогласование, когда при переработке приложения разработчик базы данных забудет сообщить разработчику интерфейса об изменении, или наоборот.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Связи между таблицами</strong></p>
<p style="text-align: justify;">     Далее вы научитесь устанавливать связи между таблицами, чтобы, например, в записи о покупке стояла ссылка только на тот товар, который реально существует в таблице товаров. Вы также узнаете, как выбирать информацию одновременно из нескольких таблиц и представлять ее в едином списке, похожем на электронную таблицу.</p>
<p><strong>Использование ограничений для установления связей между таблицами</strong></p>
<p style="text-align: justify;">     Чтобы между двумя таблицами существовала связь, должны быть выполнены два условия:<br />
• Главная таблица должна содержать столбец (или группу столбцов), уникально идентифицирующий каждую запись.<br />
• Подчиненная таблица должна иметь идентичный столбец (или группу столбцов) для хранения значений, уникально идентифицирующих главные записи.</p>
<p style="text-align: justify;">     Можно привести много повседневных примеров первичных ключей. Зайдите в магазин (или позвоните в местную службу доставки пиццы), и если вы уже зарегистрированы у них как постоянный клиент, у вас, вероятно, спросят телефон, чтобы найти соответствующую учетную запись. В этой базе данных первичным ключом Служит телефонный номер клиента. В учебных заведениях студентам присваивается идентификационный номер, работодатели присваивают своим работникам номер служащего, а в каталогах для заказа по почте проставляются номера товаров. Все эти значения — первичные ключи соответствующих таблиц.</p>
<p style="text-align: justify;">     Чтобы использовать первичный ключ главной таблицы для связывания таблиц, необходимо поместить ссылку на него в подчиненную таблицу. Это осуществляется путем включения в подчиненную таблицу столбца (или группы столбцов), имеющего точно такой же тип данных, как и у первичного ключа главной таблицы. Когда вам нужно создать в подчиненной таблице запись, ссылающуюся на запись главной таблицы, вы включаете в эту запись значение первичного ключа. Например, чтобы определить, какой товар был куплен в результате транзакции, необходимо включить в запись о транзакции название или номер товара, в зависимости от того, что используется в качестве первичного ключа главной таблицы.</p>
<p><strong>Создание первичного ключа</strong></p>
<p style="text-align: justify;">     Команда, позволяющая определить, какие столбцы существующей таблицы будут использоваться в качестве первичного ключа, имеет следующий синтаксис:</p>
<blockquote><p>ALTER TABLE имя_таблицы ADD PRIMARY KEY (имя_столбца_1, имя_столбца_2,&#8230;);</p></blockquote>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     Когда вы создаете первичный ключ, Oracle автоматически индексирует его столбцы. Это немного замедляет ввод данных, но ускоряет выполнение любых запросов, у которых в конструкции WHERE на первом месте указаны столбцы первичного ключа.</p>
</blockquote>
<p style="text-align: justify;">     Первичный ключ можно определить и при первоначальном создании таблицы.</p>
<p>&nbsp;</p>
<p><strong>Создание ограничения внешнего ключа</strong></p>
<p style="text-align: justify;">     Первичные и внешние ключи — это физические компоненты, без которых невозможно установить связь между таблицами. Однако сами по себе они не обеспечивают реляционной целостности. Даже если столбцы первичного и внешнего ключей имеют одинаковые имена и типы данных, Oracle не считает их связанными, пока вы не объявите об этом. Последний шаг имеет решающее значение: вы должны определить ограничение на подчиненную таблицу, которое будет использоваться для сверки значений, вводимых в столбец внешнего ключа, со значениями первичного ключа главной таблицы. Без такого ограничения пользователь сможет ввести во внешний ключ подчиненной таблицы значения, не существующие в главной таблице.</p>
<blockquote><p>ALTER TABLE имя_подчиненной_таблицы<br />
ADD CONSTRAINT имя_ограничения<br />
FOREIGN KEY (имена_столбцов_подчиненной_таблицы)<br />
REFERENCES имя_главной_таблицы;</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/03/01/oracle_indexes_constraints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка SAP BusinessObjects Enterprise XI 3.1 SP5</title>
		<link>http://kochetov.org.ua/2012/02/28/sapboexi31sp5_install/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sapboexi31sp5_install</link>
		<comments>http://kochetov.org.ua/2012/02/28/sapboexi31sp5_install/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 13:40:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2469</guid>
		<description><![CDATA[1. Скачиваем SAP BusinessObjects Enterprise XI 3.1 SP5 с сайта http://service.sap.com. &#160; 2. Проверяем обновление KB943295. Если оно есть, удаляем его. &#160; 3. Запускаем инсталяцию: &#160; 4. &#160; 5. Соглашаемся с лицензионным соглашением: &#160; 6. Вводим Product Keycode. Временную лицензию можно скачать с сайта http://service.sap.com/licensekeys &#8212; &#171;Obtain a temporary license key (ZIP file)&#187;: &#160; 7. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1.</strong> Скачиваем SAP BusinessObjects Enterprise XI 3.1 SP5 с сайта http://service.sap.com.</p>
<p>&nbsp;</p>
<p><strong>2.</strong> Проверяем обновление KB943295. Если оно есть, удаляем его.</p>
<p>&nbsp;</p>
<p><strong>3.</strong> Запускаем инсталяцию:</p>
<p style="text-align: center;"><img class="size-full wp-image-2487 aligncenter" title="SapBOE-install_1" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_1.jpg" alt="SapBOE-install_1" width="355" height="185" /></p>
<p>&nbsp;</p>
<p><strong>4.</strong></p>
<p style="text-align: center;"><img class="wp-image-2489 aligncenter" title="SapBOE-install_2" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_2.jpg" alt="SapBOE-install_2" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>5.</strong> Соглашаемся с лицензионным соглашением:</p>
<p style="text-align: center;"><img class=" wp-image-2494 aligncenter" title="SapBOE-install_3" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_3.jpg" alt="SapBOE-install_3" width="510" height="393" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>6.</strong> Вводим Product Keycode. Временную лицензию можно скачать с сайта http://service.sap.com/licensekeys &#8212; &#171;Obtain a temporary license key (ZIP file)&#187;:</p>
<p style="text-align: center;"><img class="size-full wp-image-2496 aligncenter" title="SapBOE-install_4" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_4.jpg" alt="SapBOE-install_4" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>7.</strong> Выбираем языки, которые будут установлены:</p>
<p style="text-align: center;"><img class=" wp-image-2499 aligncenter" title="SapBOE-install_5" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_5.jpg" alt="SapBOE-install_5" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>8.</strong></p>
<p style="text-align: center;"><img class="wp-image-2501 aligncenter" title="SapBOE-install_6" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_6.jpg" alt="SapBOE-install_6" width="510" height="393" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>9.</strong> Порт подключения для SAP BusinessObjects оставляем по умолчанию или пишем свой. Также, пароль для пользователя Administrator оставляем пустым или придумываем свой:</p>
<p style="text-align: center;"><img class="wp-image-2502 aligncenter" title="SapBOE-install_7" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_7.jpg" alt="SapBOE-install_7" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>10.</strong></p>
<p style="text-align: center;"><img class="size-full wp-image-2504 aligncenter" title="SapBOE-install_8" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_8.jpg" alt="SapBOE-install_8" width="510" height="393" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>11.</strong> Далее прописываем порт для базы данных, Data Source Name, пользователь и пароль для базы данных, пользователь и пароль для SAP BusinessObjects. Данную информацию нужно запомнить или записать:</p>
<p style="text-align: center;"><img class="wp-image-2506 aligncenter" title="SapBOE-install_9" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_9.jpg" alt="SapBOE-install_9" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>12.</strong> Выбираем Web-сервер:</p>
<p style="text-align: center;"><img class="wp-image-2507 aligncenter" title="SapBOE-install_10" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_10.jpg" alt="SapBOE-install_10" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>13.</strong> Конфигурируем порты:</p>
<p style="text-align: center;"><img class="wp-image-2508 aligncenter" title="SapBOE-install_11" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_11.jpg" alt="SapBOE-install_11" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>14.</strong> В окне &#171;Start Installation&#187; нажимем кнопку &#171;Next&#187;:</p>
<p style="text-align: center;"><img class="size-full wp-image-2509 aligncenter" title="SapBOE-install_12" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_12.jpg" alt="SapBOE-install_12" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>15.</strong> Окно установки SAP BusinessObjects:</p>
<p style="text-align: center;"><img class="size-full wp-image-2510 aligncenter" title="SapBOE-install_13" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_13.jpg" alt="SapBOE-install_13" width="510" height="393" /></p>
<p>&nbsp;</p>
<p><strong>16.</strong> Образец окна удачной установки SAP BusinessObjects:</p>
<p style="text-align: center;"><img class="size-full wp-image-2514 aligncenter" title="SapBOE-install_14" src="http://kochetov.org.ua/wp-content/uploads/2012/02/SapBOE-install_14.jpg" alt="SapBOE-install_14" width="510" height="393" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/02/28/sapboexi31sp5_install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Встроенные функции SQL</title>
		<link>http://kochetov.org.ua/2012/02/24/oracle_functions/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_functions</link>
		<comments>http://kochetov.org.ua/2012/02/24/oracle_functions/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 05:12:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2309</guid>
		<description><![CDATA[Часто используемые однострочные функции      Функции этого типа делятся на следующие категории: • Системные переменные • Числовые функции • Символьные (текстовые) функции • Функции для работы с датами • Функции преобразования данных • Прочие функции &#160; Системные функции      Системные переменные создаются Oracle и содержат информацию о среде, в которой функционирует база данных. Три системные [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Часто используемые однострочные функции</strong></p>
<p style="text-align: justify;">     Функции этого типа делятся на следующие категории:</p>
<p>• Системные переменные</p>
<p>• Числовые функции</p>
<p>• Символьные (текстовые) функции</p>
<p>• Функции для работы с датами</p>
<p>• Функции преобразования данных</p>
<p>• Прочие функции</p>
<p>&nbsp;</p>
<p><strong>Системные функции</strong></p>
<p style="text-align: justify;">     Системные переменные создаются Oracle и содержат информацию о среде, в которой функционирует база данных. Три системные переменные, описанные здесь, позволяют определять системные дату и время, идентификатор пользователя, выполняющего SQL-оператор, и имя компьютера, с которого пользователь вводит команды. Как вы увидите далее, эти переменные могут быть очень полезны в самых разнообразных ситуациях.</p>
<p><strong>SYSDATE</strong></p>
<p style="text-align: justify;">     Функция SYSDATE возвращает текущие дату и время. Если говорить точнее, она возвращает дату и время, которые являются текущими с точки зрения сервера Oracle, поэтому если сервер окажется в другом часовом поясе, то возвращаемая информация будет относиться именно к этому поясу. Чтобы увидеть, как работает эта функция, введите следующую команду:</p>
<blockquote><p> SELECT SYSDATE FROM dual;</p></blockquote>
<p><strong>USER</strong></p>
<p style="text-align: justify;">     Функция USER возвращает идентификатор пользователя Oracle, который выдал команду, содержащую эту функцию. Чтобы понять смысл сказанного, попробуйте ввести следующую команду:</p>
<blockquote><p>SELECT USER FROM DUAL;</p></blockquote>
<p style="text-align: justify;">     В результате вы увидите свое имя, под которым вошли в систему перед запуском SQL. Данная функция представляет лишь теоретический интерес, но она пригодится в дальнейшем, когда вам потребуется сохранять идентификатор пользователя, вносящего изменения в базу данных.</p>
<p><strong>USERNEV</strong></p>
<p style="text-align: justify;">     Функция USERENV может возвращать множество разных сведений о вычислительной среде, в которой была выдана содержащая ее команда. Наибольший интерес представляет имя компьютера, на котором работает пользователь. Введите следующую команду, чтобы понять, о чем идет речь:</p>
<blockquote><p>SELECT USERENV (&#8216;TERMINAL&#8217;) FROM DUAL;</p></blockquote>
<p style="text-align: justify;">     В результате вы увидите имя своего компьютера. Эта функция в сочетании с рассмотренной выше функцией USER позволяет определить, кто и с какого компьютера обращался к базе данных. Добавьте сюда функцию SYSDATE, и вы получите начало детализированной записи аудита.</p>
<p>&nbsp;</p>
<p><strong>Числовые функции</strong></p>
<p style="text-align: justify;">     Числовые функции оперируют с числовыми значениями, изменяя их в соответствии с вашими потребностями. Представленные здесь функции обеспечивают выполнение общепринятых математических операций. Если вы работаете главным образом с текстовыми данными, то можете решить, что эти функции вам ни к чему. Тем не менее я рекомендую их изучить. Для профессионального роста важно иметь представление о возможностях системы, чтобы при возникновении новой задачи знать, какие инструменты следует использовать для ее решения.</p>
<p><strong>ROUND</strong></p>
<p style="text-align: justify;">     Функция ROUND округляет числа с любой заданной точностью. Она имеет следующий синтаксис:</p>
<blockquote><p>ROUND(входное значение, число_знаков_после_десятичной_точки);</p></blockquote>
<p style="text-align: justify;">     Для использования функции ROUND (как и любой другой функции, модифицирующей значение) ей нужно передать значение, подлежащее модификации. Поскольку обычно это делается в операторе SELECT, вы будете передавать функции имя столбца, содержащего модифицируемые значения. Для примера:</p>
<blockquote><p>SELECT product_name, ROUND (product_price, 0) FROM table1;</p></blockquote>
<p style="text-align: justify;">     Можно указывать любое число десятичных знаков, но некоторые значения имеют больше смысла, чем другие. Если указать отрицательное число, то функция ROUND начнет округление до десятичной точки, иначе говоря, числа будут округляться до ближайших десятков, сотен, тысяч и т.д.</p>
<p style="text-align: justify;">     Введите перечисленные ниже команды, чтобы посмотреть, как отражается количество десятичных знаков, указанных в функции ROUND, на способе округления переданного ей числа.</p>
<blockquote><p>SELECT ROUND (1234.5678, 4) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, 3) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, 2) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, 1) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, 0) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, -1) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, -2) FROM DUAL;</p>
<p>SELECT ROUND (1234.5678, -3) FROM DUAL;</p></blockquote>
<p style="text-align: justify;">     <strong>Результаты применения функции ROUND:</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#c0c0c0">
<td><strong>Функция ROUND</strong></td>
<td><strong>Возвращаемое значение </strong></td>
</tr>
<tr>
<td> ROUND(1234.5678, 4)</td>
<td> 1234.5678</td>
</tr>
<tr>
<td> ROUND(1234.5678, 3)</td>
<td> 1234.568</td>
</tr>
<tr>
<td> ROUND(1234.5678, 2)</td>
<td> 1234.57</td>
</tr>
<tr>
<td> ROUND(1234.5678, 1)</td>
<td> 1234.6</td>
</tr>
<tr>
<td> ROUND(1234.5678, 0)</td>
<td> 1235</td>
</tr>
<tr>
<td> ROUND(1234.5678, -1)</td>
<td> 1230</td>
</tr>
<tr>
<td> ROUND(1234.5678, -2)</td>
<td> 1200</td>
</tr>
<tr>
<td> ROUND(1234.5678, -3)</td>
<td> 1000</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>TRUNC</strong></p>
<p style="text-align: justify;">     Функция TRUNC усекает число, понижая его точность. Различие между усечением и округлением проявляется, когда за последним из остающихся десятичных разрядов идет значение 5 и выше. Округление привело бы к увеличению содержимого последнего разряда на 1, тогда как при усечении этого не происходит. Введите следующую серию команд, чтобы понять, о чем идет речь:</p>
<blockquote><p>SELECT TRUNC (1234.5678, 4) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, 3) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, 2) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, 1) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, 0) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, -1) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, -2) FROM DUAL;</p>
<p>SELECT TRUNC (1234.5678, -3) FROM DUAL;</p></blockquote>
<p><strong>Результаты применения функции TRUNC:</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#c0c0c0">
<td><strong>Функция TRUNC</strong></td>
<td><strong>Возвращаемое значение </strong></td>
</tr>
<tr>
<td> TRUNC(1234.5678, 4)</td>
<td> 1234.5678</td>
</tr>
<tr>
<td> TRUNC(1234.5678, 3)</td>
<td> 1234.567</td>
</tr>
<tr>
<td> TRUNC(1234.5678, 2)</td>
<td> 1234.56</td>
</tr>
<tr>
<td> TRUNC(1234.5678, 1)</td>
<td> 1234.5</td>
</tr>
<tr>
<td> TRUNC(1234.5678, 0)</td>
<td> 1234</td>
</tr>
<tr>
<td> TRUNC(1234.5678, -1)</td>
<td> 1230</td>
</tr>
<tr>
<td> TRUNC(1234.5678, -2)</td>
<td> 1200</td>
</tr>
<tr>
<td> TRUNC(1234.5678, -3)</td>
<td> 1000</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>MOD</strong></p>
<p style="text-align: justify;">     Дает остаток от деления делимого на делитель. Если результат деления целое число, то игнорируется. В качестве первого аргумента берется делимое, в качестве второго делитель.</p>
<p>&nbsp;</p>
<p><strong>Текстовые функции</strong></p>
<p style="text-align: justify;">     Текстовые функции, называемые в Oracle символьными функциями (character functions), оперируют с текстовыми строками. Чаще всего с текстовыми строками требуется делать следующее: изменять регистр символов (на верхний, нижний или смешанный); разбивать длинные строки на несколько более коротких подстрок; очищать текст, поступающий из внешнего источника, от избыточных пробелов в конце.</p>
<p><strong>UPPER, LOWER, INITCAT</strong></p>
<p style="text-align: justify;"><strong>Функция </strong><strong>UPPER</strong><strong> </strong><strong></strong><strong></strong> – изменяет регистр всех альфавитных символов на символы верхнего регистра.</p>
<p style="text-align: justify;"><strong>Функция </strong><strong>LOWER</strong><strong> </strong><strong></strong> – изменяет регистр всех алфавитных символов (символы имеющиеся в алфавите) на символы нижнего регистра.</p>
<p style="text-align: justify;"><strong>Функция </strong><strong>INITCAP</strong> <strong></strong> – изменяет регистр всех первых альфавитных символов на символы верхнего регистра, а последующие символы на символы нижнего регистра.</p>
<blockquote><p>SELECT UPPER (product_name) FROM table1;</p>
<p>SELECT LOWER (product_name) FROM table1;</p>
<p>SELECT INITCAP (product_name) FROM table1;</p></blockquote>
<p><strong> LENGTH</strong></p>
<p style="text-align: justify;">     Временами требуется определять длину данных, хранимых в столбце таблицы. Такую возможность предоставляет функция LENGTH. Функция LENGTH полезна также для определения максимальной и средней длины текста в столбце.</p>
<p><strong>SUBSTR</strong></p>
<p style="text-align: justify;">     Возвращает определенное количество символов аргумента. Это определенное количество определяется аргументами задаваемое вами. Синтаксис команды SUBSTR:</p>
<blockquote><p>SUBSTR (исходный_текст, позиция_начального_символа, количество_символов);</p></blockquote>
<p style="text-align: justify;">     Позиция_начального_символа — это символ, с которого будет начинаться подстрока, а количество_символов — общее количество символов, которое она должна содержать.</p>
<p><strong>INSTR</strong></p>
<p style="text-align: justify;">     Возвращает целое число, указывающее начальную позицию первого вхождения одной строки в другую. Синтаксис функции INSTR выглядит следующим образом:</p>
<blockquote><p>INSTR (ucxoдный_текст, текст _для_поиска, позиция _начального_символа);</p></blockquote>
<p style="text-align: justify;">     Как правило, исходный_текст представляет собой имя столбца, содержащего длинную строку, которую вам нужно разобрать. Текст_для_поиска — это текст, который вы хотите найти, а позиция_начального_символа определяет номер символа исходного текста, с которого будет начат поиск (чтобы поиск выполнялся с самого начала текста, укажите здесь значение 1).</p>
<p><strong>LTRIM, RTRIM</strong></p>
<p style="text-align: justify;">     Процесс удаления избыточных пробелов в начале или конце текстовой строки называется обрезанием (trimming), и для этого в Oracle есть две функции: LTRIM и RTRIM. Функция LTRIM удаляет пробелы в начале строки, а функция RTRIM — в конце. Они имеют одинаковый синтаксис:</p>
<blockquote><p>LTRIM (имя_столбца);</p>
<p>RTRIM (имя_столбца);</p></blockquote>
<p>&nbsp;</p>
<p><strong>Функции для работы с датами</strong></p>
<p><strong>ADD_MONTHS</strong></p>
<p style="text-align: justify;">     Функция ADD_MONTHS возвращает дату с тем же днем месяца, что и в исходной дате, но отнесенную на заданное количество месяцев в будущее (или прошлое). Эта функция имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">ADD_MONTHS (&#8216;начальная дата&#8217;, количество_месяцев);</p>
</blockquote>
<p style="text-align: justify;">     Если вы хотите увидеть, как работает эта функция, введите следующие команды:</p>
<blockquote>
<p style="text-align: justify;">SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;</p>
<p>SELECT ADD_MONTHS(SYSDATE, 12) FROM DUAL;</p></blockquote>
<p><strong>LAST_DAY</strong></p>
<p style="text-align: justify;">     Функция LAST_DAY решает простую задачу, над которой пришлось бы немало поработать при самостоятельном программировании: возвращает последний день любого месяца, указанного в переданной ей дате. Вот ее синтаксис:</p>
<blockquote>
<p style="text-align: justify;">LAST_DAY (&#8216;дата&#8217;) ;</p>
</blockquote>
<p style="text-align: justify;">     Для примера:</p>
<blockquote><p>SELECT LAST_DAY(SYSDATE) FROM DUAL;</p></blockquote>
<p><strong>MONTHS_BETWEEN</strong></p>
<p style="text-align: justify;">     MONTHS_BETWEEN &#8212; это совсем простая функция, которая возвращает количество месяцев, разделяющих две даты. Она имеет следующий синтаксис:</p>
<blockquote><p>MONTHS_BETWEEN (конечная дата, начальная_дата);</p></blockquote>
<p>&nbsp;</p>
<p><strong>Функции преобразования данных</strong></p>
<p style="text-align: justify;">     Под преобразованием данных (data conversion) понимается преобразование информации одного типа в информацию другого типа — обычно текста в дату, время или число, либо наоборот. В вашей базе данных Oracle потребность в преобразовании типов можетбыть относительно невелика, но функции преобразования данных все равно будут полезны — по двум причинам:</p>
<p>• Они позволяют изменять способ отображения дат, времен и чисел.</p>
<p>• Они упрощают импорт данных из других источников.</p>
<p><strong>TO_CHAR</strong></p>
<p style="text-align: justify;">     Функция TO_CHAR преобразует дату, время или число в текст. Ее основная ценность в том, что она позволяет в широких пределах управлять отображением дат, времен и чисел. Тот факт, что все это будет показано в текстовом виде, не имеет значения при просмотре на экране SQL.</p>
<p style="text-align: justify;">     <strong>Форматирование значений даты и времени.</strong> Синтаксис функции TO_CHAR, предназначенной для изменения способа отображения дат и времени, имеет следующий вид:</p>
<blockquote><p>ТО_CHAR (входное_значение, код_формата);</p></blockquote>
<p style="text-align: justify;"><strong>     Элементы кода формата даты и времени, используемого в функции TO_CHAR</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#c0c0c0">
<td width="150"><strong>Элемент</strong></td>
<td><strong>Значение</strong></td>
</tr>
<tr>
<td>- / , . ; : &#8216;любой текст&#8217;</td>
<td>Воспроизведение соответствующих знаков препинания и текста в кавычках</td>
</tr>
<tr>
<td> AD  или A.D.</td>
<td>Обозначение года новой эры (с точками или без точек)</td>
</tr>
<tr>
<td> AM или A.M.</td>
<td>Обозначение времени до полудня (с точками или без точек)</td>
</tr>
<tr>
<td> BC или B.C.</td>
<td>Обозначение года до новой эры (с точками или без точек)</td>
</tr>
<tr>
<td> CC или SCC</td>
<td>Век (для четырехзначного года); в варианте с &#171;S&#187; даты до н. э. SCC предваряются знаком&#187;-&#187;</td>
</tr>
<tr>
<td> D</td>
<td>День недели (1-7)</td>
</tr>
<tr>
<td> DAY</td>
<td>Название дня недели, дополненное пробелами до девяти символов</td>
</tr>
<tr>
<td> DD</td>
<td>День месяца (1-31)</td>
</tr>
<tr>
<td> DDD</td>
<td>День года (1-366)</td>
</tr>
<tr>
<td> DY</td>
<td>Сокращенное название дня недели</td>
</tr>
<tr>
<td> E</td>
<td>Сокращенное название эпохи (для японского имперского, тайско-буддийского и официального китайского календарей)</td>
</tr>
<tr>
<td> EE</td>
<td>Полное название эпохи (для японского имперского, тайско-буддийского и официального китайского календарей)</td>
</tr>
<tr>
<td> HH</td>
<td>Час дня(1-12)</td>
</tr>
<tr>
<td> HH12</td>
<td>Часдня(1-12)</td>
</tr>
<tr>
<td> HH24</td>
<td>Час дня (0-23)</td>
</tr>
<tr>
<td> IW</td>
<td>Неделя года (1 -52 или 1 -53) согласно стандарту ISO</td>
</tr>
<tr>
<td> IYYY</td>
<td>Четырехзначный год согласно стандарту ISO</td>
</tr>
<tr>
<td> IYY или IY или I</td>
<td>Последние цифры (три, две или одна) года ISO</td>
</tr>
<tr>
<td> J</td>
<td>Юлианский день; количество дней, прошедших с 1 января 4712 г. до н.э. Число со спецификатором J должно быть целым</td>
</tr>
<tr>
<td> MI</td>
<td>Минуты (0-59)</td>
</tr>
<tr>
<td> M</td>
<td>Месяц (01-12; январь = 01)</td>
</tr>
<tr>
<td> MON</td>
<td>Сокращенное название месяца</td>
</tr>
<tr>
<td> MONTH</td>
<td>Название месяца, дополненное пробелами до девяти символов</td>
</tr>
<tr>
<td> PM или P.M.</td>
<td>Обозначение времени после полудня (с точками или без точек)</td>
</tr>
<tr>
<td> Q</td>
<td>Квартал года (1,2,3,4; январь-март = 1)</td>
</tr>
<tr>
<td> RM</td>
<td>Римский номер месяца (I-XII; январь = I)</td>
</tr>
<tr>
<td> RR</td>
<td>Для года, записанного двумя цифрами, возвращает год следующего века, если год &lt; 50 и две последние цифры текущего года &gt;= 50; возвращает год предыдущего века, если год &gt;= 50 и две последние цифры текущего года &lt; 50</td>
</tr>
<tr>
<td> RRRR</td>
<td>На входе допустимы четыре или две цифры. Для двух цифр возвращает тот же результат, что и RR. Если вам не нужна эта возможность, просто вводите четырехзначный год</td>
</tr>
<tr>
<td> SS</td>
<td>Секунды (0-59)</td>
</tr>
<tr>
<td> SSSSS</td>
<td>Секунды после полуночи (0-86399)</td>
</tr>
<tr>
<td> WW</td>
<td>Неделя года (1 -53), в котором первая неделя начинается в первый день года и продолжается до седьмого дня года</td>
</tr>
<tr>
<td> W</td>
<td>Неделя месяца (1 -5), в котором первая неделя начинается в первый день месяца и заканчивается в седьмой</td>
</tr>
<tr>
<td> Y,YYY</td>
<td>Год с запятой в указанной позиции</td>
</tr>
<tr>
<td> YEAR или SYEAR</td>
<td>Год в буквенном написании; в варианте с &#171;S&#187; даты до н.э. предваряются знаком &#171;-&#187;</td>
</tr>
<tr>
<td> YYYY или S YYYY</td>
<td>Год из четырех цифр; в варианте с &#171;S&#187; даты до н.э. предваряются знаком &#171;-&#187;</td>
</tr>
<tr>
<td> YYY или YY или Y</td>
<td>Последние цифры года (три, две или одна)</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>     Форматирование числовых значений.</strong> Функция TO_CHAR обеспечивает также стандартизацию способа отображения чисел.</p>
<p style="text-align: justify;"><strong>     Элементы кода формата чисел, используемого в функции TO_CHAR</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#C0C0C0">
<td width="100"><strong>Элемент</strong></td>
<td width="100"><strong>Пример</strong></td>
<td><strong>Описание</strong></td>
</tr>
<tr>
<td>$</td>
<td>$9999</td>
<td>Помещает знак доллара перед значением</td>
</tr>
<tr>
<td>, (запятая)</td>
<td>9,999</td>
<td>Помещает запятую в указанной позиции</td>
</tr>
<tr>
<td>. (точка)</td>
<td>99.99</td>
<td>Помещает десятичную точку в указанной позиции</td>
</tr>
<tr>
<td>MI</td>
<td>9999MI</td>
<td>Отображает знак минуса (-) после любого отрицательного числа</td>
</tr>
<tr>
<td>S</td>
<td>S9999</td>
<td>Помещает в указанной позиции знак плюса (+) для положительных чисел и знак минуса (-) для отрицательных</td>
</tr>
<tr>
<td>PR</td>
<td>9999PR</td>
<td>Окружает отрицательные числа угловыми скобками &lt;999&gt;</td>
</tr>
<tr>
<td>D</td>
<td>99D99</td>
<td>Отображает в указанной позиции десятичный разделитель, принятый в вашей стране</td>
</tr>
<tr>
<td>G</td>
<td>9G999</td>
<td>Отображает в указанной позиции разделитель групп разрядов, принятый в вашей стране</td>
</tr>
<tr>
<td>C</td>
<td>C999</td>
<td>Отображает в указанной позиции знак денежной единицы ISO</td>
</tr>
<tr>
<td>L</td>
<td>L999</td>
<td>Отображает в указанной позиции знак местной денежной единицы</td>
</tr>
<tr>
<td>RN или m</td>
<td>RN</td>
<td>Отображает числа римскими цифрами верхнего или нижнего регистра (только для целых чисел от 1 до 3999)</td>
</tr>
<tr>
<td>0</td>
<td>0999</td>
<td>Отображает один и более начальных нулей</td>
</tr>
<tr>
<td>0</td>
<td>9990</td>
<td>Отображает пустые значения в виде нулей</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>TO_DATE</strong></p>
<p style="text-align: justify;">     Функция TO_DATE преобразует текстовое представление даты (и/или времени) в действительные значения даты/времени. Хотя ее основное назначение — импорт текстовых файлов с датами и временем из других баз данных, она также полезна при ручном вводе даты в формате, отличном от стандартного формата Oracle (DD-MON-YY), или при вводе времени. Эта функция имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">ТО_DATE (входное_значение, код_формата);</p>
</blockquote>
<p style="text-align: justify;">     Функция TO_DATE использует подмножество элементов кода формата, определенных в функции TO_CHAR.</p>
<p>&nbsp;</p>
<p><strong>Прочие функции</strong></p>
<p><strong>DECODE</strong></p>
<p style="text-align: justify;">     Одним из различий между языком SQL и языком программирования PL/SQL, является то, что SQL не позволяет управлять последовательностью выполнения команд — в нем нет циклов, операторов &#171;goto&#187;, if-then-else. Сценарий SQL выполняется сверху вниз, строка за строкой, без ветвлений. В SQL отсутствуют средства принятия решений, но есть одна функция, которая в чем-то аналогична оператору if-then-else: DECODE. Эта функция транслирует одно множество данных в другое, используя определенные вами значения &#171;до&#187; и &#171;после&#187;. Охарактеризовать ее работу можно так: если входное значение равно &#171;А&#187;, на выходе будет &#171;В&#187;, а если входное значение равно &#171;С&#187;, функция вернет &#171;D&#187;. Значения &#171;А&#187;, &#171;В&#187;, &#171;С&#187; и &#171;D&#187; вы определяете сами. Это может оказать неоценимую помощь при трансляции данных из одной системы баз данных в другую, поскольку разные системы обычно используют разные множества кодов для представления схожей информации.</p>
<p style="text-align: justify;">     Функция DECODE имеет следующий синтаксис:</p>
<blockquote><p>DECODE (источник входных данных,<br />
входное_значение_1, выходное_значение_ 1,<br />
входное_значение_2, выходное_значение_2,</p>
<p>&#8230;&#8230;.<br />
последнее_входное_значение, последнее_выходное_значение,<br />
[выходное_значение_по_умолчанию при_отсутствие_совпадений]<br />
);</p></blockquote>
<p>Несколько пояснений к только что приведенному синтаксису:</p>
<p style="text-align: justify;">• Указав источник_входных_данных (обычно это имя столбца некоторой таблицы), вы определяете пары входных/выходных значений. Слева располагается одно из значений, которые будут поступать из источника данных, а справа — то, во что вы хотите транслировать это значение. Можно определить сколько угодно таких пар (именно об этом говорит многоточие между строками).<br />
• Определив пары входных/выходных значений, вы можете отдельно указать конечный результат, которому не соответствует какое-либо определенное входное значение. Он будет возвращен в том случае, если функция DECODE встретит значение, отсутствующее в списке (по аналогии с блоком else оператора if-then-else). Эта часть функции необязательна (поэтому и заключена в квадратные скобки), но обычно ее стоит указывать, чтобы знать, не встретились ли среди входных данных какие-нибудь значения, которых вы не ожидали.</p>
<p><strong>NVL</strong></p>
<p style="text-align: justify;">     Функция NVL выполняет простую, но важную задачу: получив в качестве аргумента null-значение, она возвращает вместо него выбранное вами значение. Автоматическое заполнение пустых полей помогает придавать выходным данным более законченный вид. Эта функция имеет следующий синтаксис:</p>
<blockquote><p>NVL (входное_значение, результат_если_null);</p></blockquote>
<p style="text-align: justify;">     Как и во многих других функциях, входное_значение обычно представляет собой имя столбца. Результат_если_null может быть всем, чем угодно: литералом (т.е. жестко закодированным значением), ссылкой на другой столбец или произвольным выражением.</p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     В действительности функция NVL не обновляет никаких значений. Исходные данные таблицы остаются нетронутыми.</p>
</blockquote>
<p style="text-align: justify;">     У функции NVL есть одна особенность: она ожидает, что входное_значение и результат_если_null будут иметь один и тот же тип данных. Если входное_значение — дата, то результат_если_null также должен быть датой, и т.д. Это становится проблемой, если вы хотите выводить популярное &#171;N/A&#187; для null-значений, поскольку &#171;N/A&#187; является текстом. Когда столбец, полученный функцией в качестве входного_значения, имеет текстовый тип, все в порядке. Но если функция проверяет на наличие null-значений числовой столбец или столбец с датами, то вам потребуется подставить имя столбца в функцию TO_CHAR, чтобы входное значение также было текстом.</p>
<p>&nbsp;</p>
<p><strong>Вставка комментариев в SQL-сценарии</strong></p>
<p style="text-align: justify;">     Существует два типа комментариев. Комментарии первого типа занимают одну строку и хорошо подходят в качестве небольших памяток или для временного блокирования части кода, который вы не хотите выполнять, но не намерены и удалять. Комментарии второго типа могут содержать сколько угодно строк, но не столь очевидны, поэтому не бросаются в глаза при чтении файла. И тот, и другой тип находят свое применение, и во многих файлах сценариев они встречаются одновременно.</p>
<p style="text-align: justify;">     Чтобы создать однострочный комментарий, просто поставьте в начале строки два дефиса &#8212; &#171;&#8212;&#187;. Все, что последует за дефисами, Oracle будет игнорировать.</p>
<blockquote><p><strong>Совет</strong></p>
<p style="text-align: justify;">     Для создания однострочного комментария можно поместить в начале строки &#171;REM&#187; вместо &#171;&#8212;&#187;. Этот способ используется в других языках программирования, поэтому знаком программистам, переходящим к изучению SQL после других языков. Однако чисто визуально &#171;REM&#187; не привлекает внимание столь же легко, как &#171;&#8212;&#187;. Возможно, именно поэтому вариант &#171;&#8212;&#187; более распространен.</p>
</blockquote>
<p style="text-align: justify;">     Если вы намерены сгруппировать несколько строк комментариев, более подходящим может оказаться другой подход, при котором в начале секции кпомещается &#171;/*&#187;, а в конце — &#171;*/&#187;. Все строки между этими парами символов игнорируются.</p>
<p>&nbsp;</p>
<p><strong>Часто используемые групповые функции</strong></p>
<p style="text-align: justify;">     В Oracle также есть групповые функции (group functions), позволяющие анализировать группы записей. Под группой записей понимается любой набор записей, имеющих что-то общее — например, относящихся к одному товару, одному отделу или одному временному интервалу. Вы определяете состав группы, а групповые функции дают вам итоговую  сумму, количество записей, а также среднее, наименьшее и наибольшее, значения для каждой группы. Эти функции очень удобны для статистического анализа.</p>
<p><strong>SUM</strong></p>
<p style="text-align: justify;">     Функция SUM суммирует значения и возвращает итог, используется для подсчета обшей суммы одной группы не учитывая пустые поля.</p>
<blockquote>
<p style="text-align: justify;">SELECT SUM(quantity) FROM table1;</p>
</blockquote>
<p><strong>COUNT</strong></p>
<p style="text-align: justify;">     Функция COUNT используется для подсчета количества строк группы. За исключением, других групповых функций, функция COUNT не игнорируют пустые значения null.</p>
<blockquote><p>SELECT COUNT(*) FROM table1;</p></blockquote>
<p style="text-align: justify;">     Указывая &#171;*&#187; вместо имен столбцов, вы неявно заставляете Oracle считывать всю таблицу. Это не страшно для маленьких учебных таблиц, но представляет собой серьезную проблему в системах с сотнями тысяч, а тем более с миллиардами записей. Полное сканирование таблицы намного замедляет выдачу результата и вынуждает Oracle отвлекать компьютерные ресурсы от главных задач, для выполнения которых предназначалась база данных, что тормозит работу всей компании. Гораздо лучше указать какой-нибудь один столбец, по которому функция COUNT будет считать записи:</p>
<blockquote><p>SELECT COUNT(product_name) FROM table1;</p></blockquote>
<p style="text-align: justify;">     Как правило, предпочтение отдается первому столбцу таблицы. Можно поступить еще проще, указав в качестве аргумента функции COUNT не имя столбца, а литеральное значение:</p>
<blockquote><p>SELECT COUNT(1) FROM table1;</p></blockquote>
<p style="text-align: justify;">     Функция COUNT имеет одно интересное свойство: если указать столбец таблицы, записи которой подсчитываются, будут учтены только записи, содержащие в этом столбце какое-либо значение. Этим можно воспользоваться для определения процента записей, имеющих null-значение в определенном столбце.</p>
<p><strong>AVG</strong></p>
<p style="text-align: justify;">     Функция AVG используется для подсчета среднеарифметической суммы одной группы не учитывая пустые поля.</p>
<blockquote><p>SELECT AVG(product_price) FROM table1;</p></blockquote>
<p><strong>MIN</strong></p>
<p style="text-align: justify;">     Функция MIN используется для подсчета минимального значения группы не учитывая пустые поля.</p>
<blockquote><p>SELECT MIN(product_price) FROM table1;</p></blockquote>
<p><strong>MAX</strong></p>
<p style="text-align: justify;">     Функция MAX используется для подсчета максимального значения группы не учитывая пустые поля.</p>
<blockquote><p>SELECT MAX(product_price) FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>Группирование данных с помощью конструкции GROUP BY</strong></p>
<p style="text-align: justify;">     Теперь, когда вы знаете о групповых функциях, пора научиться создавать группы. Это делается путем добавления конструкции GROUP BY в оператор SELECT.</p>
<blockquote>
<p style="text-align: justify;">SELECT product_name, SUM(quantity)<br />
FROM table1<br />
GROUP BY product_name;</p>
</blockquote>
<p style="text-align: justify;">     В оператор SELECT можно включать несколько различных групповых функций. Например, один и тот же оператор может выдавать суммарное, среднее, наименьшее и наибольшее значения по каждой группе, а также подсчитывать число записей в группах.</p>
<blockquote><p>SELECT product_name, SUM(quantity), AVG(quantity), COUNT(quantity), MIN(quantity), MAX(quantity)<br />
FROM table1 GROUP BY product_name;</p></blockquote>
<p><strong>Включение и использование групп с помощью конструктора HAVING</strong></p>
<p style="text-align: justify;">     Как вы помните, конструкция WHERE позволяет фильтровать записи, возвращаемые оператором SELECT. При группировании записей конструкция WHERE работает точно так же: фильтрует отдельные записи, тем самым исключая их из вычислений, выполняемых групповыми функциями.</p>
<p style="text-align: justify;">     Однако после создания групп возникает новая задача: фильтрация самих групп на основе групповой информации. Предположим, что вашей компании не хватает складских площадей и она намерена сократить запас товаров на складе. Для поддержки этого мероприятия вам требуется составить список плохо продающихся товаров — например, тех, для которых общий объем продаж составляет менее пяти штук. Здесь и пригодится конструкция HAVING. Она фильтрует группы на основе групповых значений. В отличие от конструкции WHERE, фильтрующей записи до группирования, конструкция HAVING фильтрует уже сформированные группы.</p>
<blockquote><p>SELECT product_name, SUM(quantity), AVG(quantity), COUNT(quantity), MIN(quantity), MAX(quantity)<br />
FROM table1 GROUP BY product_name HAVING SUM(quantity);</p></blockquote>
<p>&nbsp;</p>
<p><strong>Итоги</strong></p>
<p style="text-align: justify;">     Вы начали с изучения однострочных SQL-функций, к которым относятся системные переменные (SYSDATE, USER и USERENV), числовые функции (ROUND и TRUNC), текстовые функции (UPPER, LOWER, INITCAP, LENGTH, SUBSTR, INSTR, LTRIM и RTRIM), функции для работы с датами (ADD_MONTHS, LAST_DAY и MONTH_BETWEEN), функции преобразования данных (TO_CHAR и TO_DATE), а также полезные, но плохо поддающиеся классификации функции DECODE и NVL. Затем вы познакомились с групповыми функциями (SUM, COUNT, AVG, MIN и MAX) и научились подводить промежуточные итоги с помощью конструкции GROUP BY, включаемой в оператор SELECT. В заключение вы научились исключать из выходных данных целые группы промежуточных итогов, помещая в оператор SELECT конструкцию HAVING.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/02/24/oracle_functions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Форматирование и буферизация выходных данных</title>
		<link>http://kochetov.org.ua/2012/02/23/oracle_formatting_buffering/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_formatting_buffering</link>
		<comments>http://kochetov.org.ua/2012/02/23/oracle_formatting_buffering/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 05:30:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2189</guid>
		<description><![CDATA[     Вероятно, вы уже заметили, что SELECT очень мало заботится о красоте отображаемых записей. Он не выравнивает количество десятичных знаков в числах, обрезает заголовки столбцов по своему усмотрению и настойчиво показывает все содержимое большого текстового столбца в одной строке, независимо от того, насколько широким будет этот столбец на экране. Всего лишь несколько простых команд могут [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">     Вероятно, вы уже заметили, что SELECT очень мало заботится о красоте отображаемых записей. Он не выравнивает количество десятичных знаков в числах, обрезает заголовки столбцов по своему усмотрению и настойчиво показывает все содержимое большого текстового столбца в одной строке, независимо от того, насколько широким будет этот столбец на экране. Всего лишь несколько простых команд могут радикально улучшить внешний вид выходных данных SELECT.</p>
<p style="text-align: justify;">     Секрет заключен в команде COLUMN. Она не взаимодействует с базой данных Oracle. Ее единственная задача — повлиять на способ отображения информации. По этой причине команды COLUMN не требуется завершать точкой с запятой, как стандартные команды SQL.</p>
<p>&nbsp;</p>
<p><strong>Форматирование чисел</strong></p>
<p style="text-align: justify;">     Обычно с числами требуется осуществлять три действия:<br />
• Выравнивать количество десятичных знаков<br />
• Помещать разделитель между сотнями, тысячами и т.д.<br />
• Добавлять знак денежной единицы</p>
<p>Сначала мы рассмотрим каждое из этих действий в отдельности, а потом скомбинируем их.</p>
<p>&nbsp;</p>
<p><strong>Выравнивание количества десятичных знаков</strong></p>
<p style="text-align: justify;">     Команда COLUMN, выравнивающая количество десятичных знаков, имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">COLUMN имя_столбца FORMAT код_формата;</p>
</blockquote>
<p style="text-align: justify;">     Вместо аргумента имя_столбца подставляется имя того столбца, который вы хотите отформатировать. Обратите внимание: здесь не упоминается, какой таблице принадлежит столбец! Команда COLUMN воздействует на все столбцы с указанным именем, независимо от того, в какой таблице они находятся. Впрочем, если два столбца имеют одинаковые имена, они с большой вероятностью содержат похожие данные, и форматирование, примененное к одному из них, обычно имеет смысл и для другого.</p>
<p style="text-align: justify;">     Аргумент код_формата заменяется на представление числа. Это представление содержит по одной цифре &#171;9 &#187; для каждого десятичного знака, который требуется для ваших чисел, а также символ &#171;.&#187; для обозначения десятичного разделителя. (Если в вашей стране целая и дробная части разделяются другим символом, используйте вместо точки букву &#171;D&#187;. В этом случае будет использован десятичный разделитель из национальной конфигурации базы данных.)</p>
<blockquote><p>COLUMN product_price FORMAT 9999.99<br />
SELECT * FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>Добавления разделителя групп разрядов</strong></p>
<p style="text-align: justify;">     Разделитель групп разрядов (group separator) — это символ, разделяющий сотни, тысячи и т.д. в пределах числа. Иногда в  столбце вашей таблицы будут содержатся значения, которые будут смотреться лучше при наличии запятой, отделяющей сотни от тысяч. Этого результата можно достичь при помощи того же синтаксиса COLUMN, который использовался для выравнивания количества десятичных знаков; нужно лишь изменить код формата. Это представление содержит по одной цифре &#171;9&#8243; для каждого десятичного знака, который требуется для ваших чисел, а также символ &#171;,&#187; для разделителя групп разрядов.</p>
<blockquote><p>COLUMN quantity_on_hand FORMAT 99,999<br />
SELECT * FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p><strong>Добавления знака денежной единицы</strong></p>
<p style="text-align: justify;">     Легко догадаться, что речь идет об очередной разновидности кода формата. Попробуйте ввести следующий код, чтобы поместить знак доллара ($) перед каждым значением PRODUCT_PRICE:</p>
<blockquote><p>COLUMN product_price FORMAT $99.99<br />
SELECT * FROM table1;</p></blockquote>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>Таблица кодов числовых форматов</strong></p>
<table width="100%" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr bgcolor="#C0C0C0">
<td width="100"><strong>Элемент</strong></td>
<td width="100"><strong>Пример</strong></td>
<td><strong>Описание</strong></td>
</tr>
<tr>
<td> $</td>
<td> $9999</td>
<td>Помещает знак доллара перед значением</td>
</tr>
<tr>
<td> , (запятая)</td>
<td> 9,999</td>
<td>Помещает запятую в указанной позиции</td>
</tr>
<tr>
<td> . (точка)</td>
<td> 99.99</td>
<td>Помещает десятичную точку в указанной позиции</td>
</tr>
<tr>
<td> MI</td>
<td> 9999MI</td>
<td>Отображает знак минуса (-) после любого отрицательного числа</td>
</tr>
<tr>
<td> S</td>
<td> S9999</td>
<td>Помещает в указанной позиции знак плюса (+) для положительных чисел и знак минуса (-) для отрицательных</td>
</tr>
<tr>
<td> PR</td>
<td> 9999PR</td>
<td>Окружает отрицательные числа угловыми скобками &lt;999&gt;</td>
</tr>
<tr>
<td> D</td>
<td> 99D99</td>
<td>Отображает в указанной позиции десятичный разделитель, принятый в вашей стране</td>
</tr>
<tr>
<td> G</td>
<td> 9G999</td>
<td>Отображает в указанной позиции разделитель групп разрядов, принятый в вашей стране</td>
</tr>
<tr>
<td> C</td>
<td> C999</td>
<td>Отображает в указанной позиции знак денежной единицы ISO</td>
</tr>
<tr>
<td> L</td>
<td> L999</td>
<td>Отображает в указанной позиции знак местной денежной единицы</td>
</tr>
<tr>
<td> RN или m</td>
<td> RN</td>
<td>Отображает числа римскими цифрами верхнего или нижнего регистра (только для целых чисел от 1 до 3999)</td>
</tr>
<tr>
<td> 0</td>
<td> 0999</td>
<td>Отображает один и более начальных нулей</td>
</tr>
<tr>
<td> 0</td>
<td> 9990</td>
<td>Отображает пустые значения в виде нулей</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<blockquote><p>COLUMN имя_столбца FORMAT Amn WORD_WRAP</p></blockquote>
<p style="text-align: justify;">     Вероятно, вы уже поняли, что вместо аргумента имя_столбца нужно подставить имя столбца с текстом, подлежащим переносу. Другим аргументом является mn, позволяющий указать, какую ширину (в символах) должен иметь столбец. Буква &#171;А&#187; перед числом означает &#171;алфавитно-цифровой&#187; (&#171;alphanumeric&#187;).</p>
<p>&nbsp;</p>
<p><strong>Форматирования заголовков столбцов</strong></p>
<p style="text-align: justify;">     Все рассмотренные выше способы позволяют улучшать внешний вид отображаемых записей, тогда как заголовки столбцов над этими записями остаются в беспорядке. Помимо того, что имена столбцов состоят только из заглавных букв, в некоторых случаях они превышают ширину самих столбцов и поэтому обрезаются. Об устранении этих проблем позаботится специальная разновидность команды COLUMN. Вот ее синтаксис:</p>
<blockquote>
<p style="text-align: justify;">COLUMN имя_столбца HEADING текст_заголовка JUSTIFY LEFT;</p>
</blockquote>
<p style="text-align: justify;">или</p>
<blockquote>
<p style="text-align: justify;">COLUMN имя_столбца HEADING текст_заголовка JUSTIFY CENTER;</p>
</blockquote>
<p style="text-align: justify;">или</p>
<blockquote>
<p style="text-align: justify;">COLUMN имя_столбца HEADING текст_заголовка JUSTIFY RIGHT;</p>
</blockquote>
<p style="text-align: justify;">     Кроме управления содержимым заголовков, вы получаете возможность использовать смесь символов верхнего и нижнего регистров и разбивать заголовки на несколько строк. Вертикальная черта ( | ) в аргументе текст_заголовка обозначает перевод строки.</p>
<p style="text-align: justify;">     Для отключения форматирования, заданного командой COLUMN, используется следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">COLUMN имя_столбца OFF;</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Буферизация выходных данных на диске</strong></p>
<p style="text-align: justify;">     Буферизация (spooling) — это процесс записи информации в дисковый файл. Если выходные данные умещаются на одном экране, можно просто выделить мышью нужный фрагмент, скопировать его в буфер обмена, а затем вставить в любую нужную программу. Возможно, после вставки потребуется установить для этих данных моноширинный шрифт, чтобы сохранить выравнивание строк.</p>
<p style="text-align: justify;">     Команда SPOOL имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">SPOOL имя_буферного_файла;</p>
</blockquote>
<p style="text-align: justify;">     При желании можете включить в имя буферного файла расширение (например, .sql или .ргп). Если расширение не указано, имя автоматически дополняется расширением .lst. Кроме того, имя буферного файла может содержать путь (path), т.е. имя дискового накопителя и каталога, где должен быть сохранен файл. Если путь не указан, буферный файл сохраняется в подкаталоге BIN базового каталога Oracle. Чтобы увидеть, как выполняется буферизация, введите перечисленные ниже команды. Обратите внимание, что после команд SPOOL не нужно ставить точку с запятой, поскольку они являются внутренними командами и не влияют на работу сервера Oracle.</p>
<blockquote><p>SPOOL c:\test1.prn<br />
SELECT * FROM table1;<br />
SELECT * FROM table2;<br />
SPOOL OFF</p></blockquote>
<p>&nbsp;</p>
<p><strong>Файлы сценариев SQL</strong></p>
<p style="text-align: justify;">     К этому моменту вы изучили порядочное количество различных SQL-команд, и в ходе экспериментов с ними набрали множество строк кода. Для бизнес-сред характерно наличие операций, выполняющихся одинаковым (или почти одинаковым) образом по многу раз. Повторный набор одних и тех же команд может быстро утомить. Вместо этого вы можете сохранять часто используемые команды в дисковом файле. Такой подход имеет три основных преимущества: экономит время, устраняя необходимость повторного набора команд; позволяет завершать процедуру в более короткие сроки, поскольку команды считываются с диска намного быстрее, чем вы их набираете; гарантирует, что при каждом выполнении команды будут иметь один и тот же выверенный синтаксис.</p>
<p>&nbsp;</p>
<p><strong>Создания файла сценария</strong></p>
<p style="text-align: justify;">     Файл сценария (script file) представляет собой обычный текстовый файл. Вы можете создать его в любом текстовом редакторе или процессоре. При использовании текстового процессора не забудьте сохранить файл командой Save As в формате &#171;text only&#187;, чтобы он не содержал кодов форматирования.)</p>
<p>&nbsp;</p>
<p><strong>Запуск сценария</strong></p>
<p style="text-align: justify;">     Запустить сценарий очень легко. Нужно лишь поставить перед именем файла знак &#171;at&#187; (@). Введите в строке приглашения SQL&gt; следующую команду:</p>
<blockquote><p>@с:\test1.sql</p></blockquote>
<p>&nbsp;</p>
<p><strong>Использование переменных в файлах сценариев</strong></p>
<p style="text-align: justify;">     Временами возникает потребность в сценарии, который мог бы выполнять разные действия в зависимости от ситуации. Этого можно достичь за счет использования переменных (variables). Переменная заменяет часть команды, позволяя вводить эту часть при выполнении сценария и тем самым влиять на его работу. (Противоположностью переменным является информация, явно указанная в файле сценария. Информация такого типа называется жестко закодированной (hard-coded), поскольку ее нельзя изменять во время выполнения сценария.) Переменные можно встраивать в сценарии SQL двумя способами: использовать переменные подстановки или команду ACCEPT.</p>
<p>&nbsp;</p>
<p><strong>Переменные подстановки</strong></p>
<p style="text-align: justify;">     Использование переменной подстановки (substitution variable) — это самый простой способ встроить переменную в сценарий. Чтобы увидеть, как это делается, создайте файл сценария с именем test2.sql и поместите в него следующие команды:</p>
<blockquote><p>SET VERIFY OFF<br />
SELECT product_name, quantity, purchase_date FROM table1 WHERE quantity&gt;=&amp;minimum_quantity_sold;<br />
SET VERIFY ON</p></blockquote>
<p style="text-align: justify;">      Сохраните и запустите этот сценарий. Вы увидите приглашение на ввод значения minimum_quantity_sold (&#171;Enter value for mmimum_quantity_sold&#187;). Введенное число будет помещено в конструкцию WHERE.</p>
<p style="text-align: justify;">     Команды SET VERIFY OFF и SETVERIFY ON помогают улучшить восприятие сценария. Без них будет показано старое и новое значение переменной подстановки перед выполнением команды SELECT, что приведет в замешательство любого другого пользователя, запускающего сценарий, а в конце концов начнет раздражать и самого создателя сценария. Переменные подстановки можно с тем же успехом использовать для текста и дат. При этом вы не должны забывать, что в SQL текст и даты требуется заключать в одиночные кавычки.</p>
<p><strong>Команда ACCEPT</strong></p>
<p style="text-align: justify;">     Как вы могли заметить, приглашение, которое SQL выдает пользователям, встречая переменную подстановки, выглядит не слишком привлекательно. Альтернативой является команда ACCEPT, которая позволяет определять приглашение произвольного вида. Эта команда имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">accept имя_переменной prompt текст приглашения</p>
</blockquote>
<p style="text-align: justify;">     Чтобы увидеть, как она работает, создайте сценарий с именем test2.sql и поместите в него следующие команды:</p>
<blockquote><p>SET VERIFY OFF<br />
SET ECHO OFF<br />
ACCEPT v_earliest_date<br />
PROMPT &#171;Earliest date you would like to see? (dd-mmm-yy):&#187;<br />
ACCEPT v_latest_date<br />
PROMPT &#171;Thank you. Latest date you would like to see? (dd-mmm-yy):&#187;<br />
SELECT product_name, quantity, purchase_date FROM &#171;table1&#8243;<br />
WHERE purchase_date BETWEEN &#8216;&amp;v_earliest_date&#8217; AND &#8216;&amp;v_latest_date&#8217;<br />
ORDER BY product_name, quantity;<br />
SET VERIFY ON<br />
SET ECHO ON</p></blockquote>
<p style="text-align: justify;">     В этом сценарии задействована пара новых команд: SET ECHO OFF и SET ECHO ON. Команды SET ECHO включают и выключают отображение команд сценария на экране. В данном случае они гарантируют, что пользователь увидит только приглашения из команд ACCEPT, но не сами эти команды.</p>
<p>&nbsp;</p>
<p><strong>Итоги</strong></p>
<p style="text-align: justify;">     Облегчить чтение выбранных данных помогает команда COLUMN, позволяющая форматировать числа, даты и текст, а также определять и выравнивать заголовки столбцов. Чтобы сохранить в дисковом файле все, что выводилось на экран , можно воспользоваться командой SPOOL. Одним из самых мощных способов повышения эффективности работы с SQL является хранение часто используемых групп команд в текстовых файлах с расширением .sql, называемых файлами сценариев. Для запуска этих сценариев достаточно ввести в приглашении SQL символ @, указав после него имя файла, содержащего нужные команды. Чтобы сделать сценарии более универсальными, в них можно включать переменные подстановки и команды ACCEPT, позволяющие вводить критерии (или любую другую информацию) в ходе выполнения сценария.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/02/23/oracle_formatting_buffering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Более сложные манипуляции с данными</title>
		<link>http://kochetov.org.ua/2012/02/22/oracle_data_manipulation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_data_manipulation</link>
		<comments>http://kochetov.org.ua/2012/02/22/oracle_data_manipulation/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 11:24:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=2137</guid>
		<description><![CDATA[Ограничение диапазона выбираемых записей      Одной из наиболее распространенных операций, которые вы будете выполнять при выборе записей из таблицы, является получение определенного подмножества записей. Это подмножество будет постоянно меняться в зависимости от поставленных вопросов (например: &#171;Какие клиенты не получали от меня сообщений более двух недель?&#187; или &#171;Какие товары продавались партиями, содержащими более чем 100 штук [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Ограничение диапазона выбираемых записей</strong></p>
<p style="text-align: justify;">     Одной из наиболее распространенных операций, которые вы будете выполнять при выборе записей из таблицы, является получение определенного подмножества записей. Это подмножество будет постоянно меняться в зависимости от поставленных вопросов (например: &#171;Какие клиенты не получали от меня сообщений более двух недель?&#187; или &#171;Какие товары продавались партиями, содержащими более чем 100 штук за последние 30 дней?&#187;). Подобная фильтрация записей выполняется путем добавления к оператору SELECT специальной конструкции WHERE. В ней указываются условия (conditions), которым должны удовлетворять отображаемые записи. Синтаксис выглядит следующим образом:</p>
<blockquote><p>SELECT столбцы FROM имя_таблицы WHERE условие(я);</p></blockquote>
<p>&nbsp;</p>
<p><strong>Использование шаблонов</strong></p>
<p style="text-align: justify;">     При поиске в текстовых столбцах часто возникает потребность отыскать небольшой фрагмент текста в любом месте столбца. Это делается с помощью шаблонов (wildcards), представляющих произвольную часть текста. При поиске текста можно применять шаблоны &#171;_&#187; (для представления одиночных символов) и &#171;%&#187; (для представления группы символов), а также оператор LIKE.</p>
<p>&nbsp;</p>
<p><strong>Сортировка по отдельным столбцам</strong></p>
<p style="text-align: justify;">     Для изменения последовательности вывода записей достаточно добавить к команде SELECT конструкцию ORDER BY. В ней указывается один или несколько столбцов, по которым Oracle будет сортировать записи. Синтаксис конструкции ORDER BY следующий:</p>
<blockquote><p>SELECT * FROM имя_таблицы ORDER BY столбец_сортировки ASC или DESC;</p></blockquote>
<p>где, ASC &#8212; возрастающая сортировка, а DESC &#8212; убывающая сортировка.</p>
<p>&nbsp;</p>
<p><strong>Отображение только уникальных значений</strong></p>
<p style="text-align: justify;">     Бывают ситуации, когда нужно узнать, какие значения содержит столбец, но при этом желательно увидеть только по одному экземпляру каждого значения для этого используются модификаторы DISTINCT или UNIQUE.</p>
<p style="text-align: justify;">     Выбор уникальных значений похож на выбор обычного списка значений, нужно лишь указать в команде SELECT модификатор DISTINCT или UNIQUE. Модификаторы DISTINCT и UNIQUE дают одинаковый эффект, но DISTINCT более распространен.</p>
<p>&nbsp;</p>
<p><strong>Выбор из DUAL</strong></p>
<p style="text-align: justify;">     Согласитесь — было бы удобно иметь таблицу, где гарантированно присутствует только одна запись. Светлые головы из Oracle тоже об этом подумали и предусмотрели в процессе установки Oracle создание таблицы с именем DUAL, доступной всем пользователям.</p>
<p>&nbsp;</p>
<p><strong>Модификация данных в таблице</strong></p>
<p style="text-align: justify;">     Изменить данные в таблице Oracle очень легко. Используемая для этого команда называется UPDATE, а ее синтаксис выглядит следующим образом:</p>
<blockquote><p>UPDATE имя_таблицы SET имя_столбца = новое_значение WHERE условие;</p></blockquote>
<p>&nbsp;</p>
<p><strong>Удаления записей с таблицы</strong></p>
<p style="text-align: left;">     Последний из фундаментальных навыков, необходимых при работе с таблицами, — это умение удалять записи. Команда DELETE имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: left;">DELETE FROM имя_таблщы WHERE условие;</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Удаление всех строк</strong></p>
<p style="text-align: justify;">     Для этого применяются два способа: использовать команду DELETE, не указывая условие WHERE, или использовать новую для вас команду TRUNCATE (Усечь).</p>
<p>&nbsp;</p>
<p><strong>Усечение таблицы</strong></p>
<p style="text-align: justify;">     Основное достоинство команды TRUNCATE — скорость. Когда Oracle выполняет эту команду, он не просматривает существующие записи, а просто выбрасывает их. Другой выигрыш от использования этой команды состоит в том, что она автоматически освобождает табличное пространство, которое занимали усеченные записи. Команда TRUNCATE имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">TRUNCATE TABLE имя_таблицы;</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Предупреждение</strong></p>
<p style="text-align: justify;">     Команда TRUNCATE необратима! Используйте ее только в случае действительной необходимости!</p>
<p>&nbsp;</p>
<p><strong>Управление транзакциями</strong></p>
<p style="text-align: justify;">     До этого момента вы создавали и удаляли таблицы, вставляли и удаляли записи — короче говоря, делали все, что хотели, не задумываясь о том, как это может повлиять на других пользователей. В реальной жизни вам придется работать с таблицами, содержащими чужие данные, и выполненные вами изменения неизбежно затронут других пользователей. Чтобы отвечать за свои действия, вы должны понимать, каким образом Oracle вносит изменения в базу данных. Это немедленно принесет свою выгоду: в частности, вы научитесь использовать средства отмены (undo), предоставляемые Oracle.</p>
<p>&nbsp;</p>
<p><strong>Отмена транзакций DML</strong></p>
<p style="text-align: justify;">     Когда вы вставляете, обновляете или удаляете данные, Oracle не выполняет эти изменения немедленно. Вам кажется, что изменения произошли тотчас же, если ввести команду SELECT, они будут отражены в выходных данных. Однако на самом деле изменения хранятся во временной области памяти и будут применены к таблице только в ответ на одну из нескольких специальных команд.</p>
<p style="text-align: justify;">     Отмена в Oracle выполняется с помощью команды ROLLBACK (Откат). Производя откат одной и более транзакций, вы сообщаете Oracle, что они не должны применяться к базе данных. Команда ROLLBACK имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">ROLLBACK TO имя_точки _отката;</p>
</blockquote>
<p style="text-align: justify;">     Возможности команды ROLLBACK не ограничиваются только одним уровнем отмены. В сочетании с другой командой, SAVEPOINT, она позволяет возвращаться в любую из предварительно установленных точек. Команда SAVEPOINT имеет следующий синтаксис:</p>
<blockquote>
<p style="text-align: justify;">SAVEPOINT имя_точки_сохранения;</p>
</blockquote>
<p style="text-align: justify;">     Что дает использование нескольких точек возврата? Прежде всего, гибкость. При выполнении большого пакета команд можно устанавливать точки сохранения после каждой логической группы команд, и если следующая группа по какой-то причине даст неудовлетворительный результат, вы всегда сможете вернуться к последней точке и применить лишь те изменения, которые<br />
были выполнены до нее.</p>
<p style="text-align: justify;">     Имена точек сохранения — всего лишь метки, поэтому они могут быть любыми. У вас есть возможность выбирать имена, по которым будет видно, какие данные охватывает каждая точка. Для имен точек сохранения используются соглашения, похожие на соглашения для имен таблиц и столбцов: максимальная длина — 30 символов, а первым символом должна быть буква. Теперь, научившись отменять изменения, вы готовы к тому, чтобы делать их постоянными. Соответствующая команда называется COMMIT (Завершить).<br />
Поскольку она приводит к записи всех ваших изменений в таблицу базы данных (что делает невозможным откат), все точки сохранения, установленные к моменту завершения транзакции, сбрасываются.</p>
<p>&nbsp;</p>
<p><strong>Доступность данных для других пользователей</strong></p>
<p style="text-align: justify;">     По команде COMMIT изменения записываются в базу данных, разделяемую всеми остальными пользователями, поэтому завершение вашей работывлияет на то, какие данные будут им видны. Доступ к вашим изменениям станет возможен только после выдачи команды COMMIT. Следовательно, вы можете вставить тысячу новых записей, изменить тысячу существующих, еще тысячу удалить, но ни одно из этих изменений не отразится в операторах SELECT других пользователей, пока вы не завершите свою работу командой COMMIT.</p>
<p>&nbsp;</p>
<p><strong>Явное и не явное завершение</strong></p>
<p style="text-align: justify;">     Выше мы описали команду COMMIT. Однако явный ввод команды—это лишь один из способов завершения изменений в базе данных. Некоторые команды Oracle выполняют завершение предыдущих команд, не дожидаясь ваших указаний, т.е. неявно. Говоря конкретнее, любые команды DDL (например, CREATE TABLE или DROP TABLE) неявно завершают изменение всех не сохраненных данных перед выполнением своих функций. Выход из Oracle также приводит к автоматическому завершению ваших изменений.</p>
<p><strong>Итоги</strong></p>
<p style="text-align: justify;">     Сначала вы узнали, как с помощью конструкции WHERE оператора S ELECT ограничить диапазон записей, возвращаемых Oracle. При фильтрации можно использовать разнообразные операторы сравнения, включая =, !=, &lt;&gt;, &gt;, &lt;,  &gt;=, &lt;=, BETWEEN и NOT. Вы также научились создавать объединенные условия, разделяя их словом AND, и условия &#171;или&#187;, разделенные словом OR. Если требуется выбрать записи, содержащие любое значение из некоторого множества, то вместо многочисленных конструкций OR можно использовать функцию IN.</p>
<p style="text-align: justify;">     При поиске текста можно применять шаблоны &#171;_&#187; (для представления одиночных символов) и &#171;%&#187; (для представления группы символов), а также оператор LIKE. Чтобы найти записи с пустыми столбцами любого типа или, наоборот, избежать их вывода, нужно указать в конструкции WHERE оператор IS NULL или IS NOT NULL.</p>
<p style="text-align: justify;">     Добившись от оператора SELECT вывода именно тех записей, которые вам нужны, можно изменить порядок их отображения, добавив конструкцию ORDER BY. В ней указывается столбец (или столбцы), по которому должны сортироваться записи на экране. (Помните, что ORDER BY изменяет только порядок вывода записей, а не их фактическое расположение в таблице, так как последнее заняло бы слишком много времени.) Как правило, крайний левый из отображаемых столбцов следует делать первым столбцом сортировки, следующий отображаемый столбец — вторым, и т. д. В противном случае другим пользователям будет трудно понять, как отсортированы записи.</p>
<p style="text-align: justify;">     Бывают ситуации, когда нужно узнать, какие значения содержит столбец, но при этом желательно увидеть только по одному экземпляру каждого значения. Этого можно достичь, добавив модификатор DISTINCT сразу после ключевого слова SELECT. Вы можете в реальном времени выполнять вычисления с данными, не содержащимися в таблице, выбирая значения из DUAL.</p>
<p style="text-align: justify;">     Когда дело доходит до модификации данных в таблице, применяется команда UPDATE. В ней вы указываете таблицу, подлежащую обновлению, значения столбцов, а затем задаете условие, которому должна удовлетворять запись для обновления. Условие WHERE играет очень важную роль, поскольку при его отсутствии будет обновлена каждая запись! То же самое справедливо и при удалении записей по команде DELETE: если опустить конструкцик) WHERE, вы удалите все записи таблицы. Если ваша цель в этом и состоит, лучше использовать команду TRUNCATE TABLE, которая не считывает каждую запись таблицы перед ее удалением и поэтому работает гораздо быстрее.<br />
В Oracle есть средства отмены в виде группы команд, относящихся к категории &#171;управление транзакциями&#187;. Наиболее важна команда ROLLBACK, отменяющая любые команды DML (INSERT, UPDATE и DELETE), выполненные с момента последнего завершения. Явное завершение выполняется при вводе команды COMMIT. Неявное завершение происходит при выполнении любой из операций DDL (в частности, CREATE и DROP), а также при выходе из Oracle.</p>
<p style="text-align: justify;">     Точки сохранения обеспечивают возможность многоуровневой отмены — иначе говоря, позволяют вам решать, на какое количество команд DML выполнить откат. Выдавая команду SAVEPOINT, вы устанавливаете именованный маркер, к которому можно будет вернуться по команде ROLLBACK. Точки сохранения остаются активными до завершения изменений данных; после этого они исчезают. Измененные данные становятся видимы другим пользователям и программам, работающим с базой данных Oracle, только после завершения изменений. (Непонимание этого факта может легко привести к недоразумению. Например, кто-то вставляет, обновляет или удаляет данные, а потом удивляется, почему изменения не видны на компьютерах его коллег. Обычно это означает, что пользователь забыл завершить свои изменения.)</p>
<p>&nbsp;</p>
<p><strong>Примеры</strong></p>
<p><strong>1.</strong> Выбрать записи из таблицы table1, где поле product_price&gt;=50 и product_price&lt;=100:</p>
<blockquote><p>SELECT * FROM table1 WHERE product_price&gt;=50 AND product_price&lt;=100;</p></blockquote>
<p>или</p>
<blockquote><p>SELECT * FROM table1 WHERE product_price BETWEEN 50 AND 100;</p></blockquote>
<p><strong>2.</strong> Выбрать записи из таблицы table1, поля  которых не входят в диапазон product_price&gt;=50 и product_price&lt;=100:</p>
<blockquote><p>SELECT * FROM table1 WHERE product_price&lt;50 OR product_price&gt;100;</p></blockquote>
<p>или</p>
<blockquote><p>SELECT * FROM table1 WHERE product_price NOT BETWEEN 50 AND 100;</p></blockquote>
<p><strong>3.</strong> Выбрать записи из таблицы table1, где поле product_name содержит любое значение из группы (&#8216;SmallWidget&#8217;, &#8216;MediumWidget&#8217;, &#8216;ChromePhoobar&#8217;):</p>
<blockquote><p>SELECT * FROM table1 WHERE product_name=&#8217;SmallWidget&#8217; OR product_name=&#8217;MediumWidget&#8217; OR product_name=&#8217;ChromePhoobar&#8217;;</p></blockquote>
<p>или</p>
<blockquote><p>SELECT * FROM table1 WHERE product_name IN (&#8216;SmallWidget&#8217;, &#8216;MediumWidget&#8217;, &#8216;ChromePhoobar&#8217;);</p></blockquote>
<p><strong>4.</strong> Выбрать данные из таблицы table1, где поле product_name содержит, сначала пять любых символов, далее слово Chrome и еще любой набор символов:</p>
<blockquote><p>SELECT * FROM table1 WHERE product_name LIKE &#8216;_____Chrome%&#8217;;</p></blockquote>
<p><strong>5.</strong> Выбрать данные из таблицы table1 и отсортировать по убыванию по полю product_price:</p>
<blockquote><p>SELECT * FROM table1 ORDER BY product_price DESC;</p></blockquote>
<p><strong>6.</strong> Выбрать уникальные значения из таблицы table1:</p>
<blockquote><p>SELECT  DISTINCT * FROM table1;</p></blockquote>
<p><strong>7.</strong> Переименовать все товары в таблице table1, поле product_name с SmallWidget в LargeWidget:</p>
<blockquote><p>UPDATE table1 SET product_name = &#8216;LargeWidget&#8217; WHERE product_name = &#8216;SmallWidget&#8217;;</p></blockquote>
<p><strong>8.</strong> Удалить все данные из таблицы table1, где поле product_name SmallWidget:</p>
<blockquote><p>DELETE FROM table1 WHERE product_name=&#8217;SmallWidget&#8217;;</p></blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/02/22/oracle_data_manipulation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle. Сохранение и выборка данных</title>
		<link>http://kochetov.org.ua/2012/02/21/oracle_database_save_select/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oracle_database_save_select</link>
		<comments>http://kochetov.org.ua/2012/02/21/oracle_database_save_select/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 06:00:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kochetov.org.ua/?p=1998</guid>
		<description><![CDATA[Именование таблиц и столбцов      Присваивая имена таблицам и столбцам, вы должны следовать определенным правилам. Некоторые из них носят обязательный характер, тогда как другие представляют собой рекомендации, помогающие придать таблицам профессиональный вид. Правила      Перечисленные ниже правила обязательны для любой таблицы или столбца. Постарайтесь запомнить их прямо сейчас, чтобы впоследствии не тратить время на поиск [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Именование таблиц и столбцов</strong></p>
<p style="text-align: justify;">     Присваивая имена таблицам и столбцам, вы должны следовать определенным правилам. Некоторые из них носят обязательный характер, тогда как другие представляют собой рекомендации, помогающие придать таблицам профессиональный вид.</p>
<p><strong>Правила</strong></p>
<p style="text-align: justify;">     Перечисленные ниже правила обязательны для любой таблицы или столбца. Постарайтесь запомнить их прямо сейчас, чтобы впоследствии не тратить время на поиск ошибок, связанных с ненамеренным нарушением одного или нескольких из них. (Стоит переписать эти правила на лист бумаги и держать его перед собой во время упражнений с SQL):</p>
<p style="text-align: justify;">• Максимальная длина имени таблицы или столбца равна 30 символам.<br />
• Имена таблиц и столбцов могут содержать буквы, цифры и символ подчеркивания (_). (Есть еще пара специальных символов, которые можно использовать в случае острой необходимости, но в обычной работе это не принесет ничего, кроме проблем, поэтому лучше ограничиться буквами, цифрами и символом подчеркивания.<br />
• Имена таблиц и столбцов должны начинаться с буквенного символа. Имя может содержать цифры или символы подчеркивания, но в любом случае должно начинаться с буквы.<br />
• Символы верхнего и нижнего регистров в именах таблиц и столбцов считаются одинаковыми.<br />
• Имя таблицы или столбца не должно содержать пробелы.<br />
• В Oracle таблицы присваиваются пользователям; по умолчанию они присваиваются тому пользователю, который их создал . Каждая из таблиц должна иметь имя, отличное от имен других таблиц этого пользователя. Иными словами, у пользователя не может быть двух таблиц с одним и тем же именем. (Однако разные пользователи могут без проблем создавать таблицы с одинаковыми именами.) Все столбцы в пределах таблицы должны иметь уникальные имена.<br />
• Некоторые слова представляют собой команды и параметры Oracle, a следовательно, не могут использоваться в качестве имен таблиц или столбцов.</p>
<blockquote>
<p style="text-align: justify;"><strong>Совет</strong></p>
<p style="text-align: justify;">     Единственный способ гарантировать, что имя таблицы никогда не совпадет с зарезервированным словом Oracle, — это предварять его аббревиатурой, обозначающей систему, к которой относится таблица. Например, в системе Accounts Payable (&#171;счета кредиторов&#187;) имя каждой таблицы может начинаться с &#171;AP_&#187;.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Рекомендации</strong></p>
<p style="text-align: justify;">     Перечисленные ниже пункты полезно учитывать при проектировании таблиц.<br />
• Имена таблиц следует записывать в единственном, а не множественном числе. Всем и так понятно, что таблица PRODUCT будет содержать записи о многих товарах, поэтому нет необходимости отмечать это в имени таблицы. К тому же, глядя на диаграммы с таблицами базы данных (они рассматриваются в главе 7), вы сможете переходить от таблицы к таблице, говоря себе примерно следующее: &#171;PURCHASE ORDER ссылается на PRODUCT&#8230;&#187;.<br />
• Не включайте слова TABLE или DATA в имя таблицы. Опытные пользователи понимают, что объектом базы данных, хранящим информацию, является таблица, а таблицы содержат данные. Не нужно напоминать им об этом.</p>
<p>&nbsp;</p>
<blockquote><p><strong>Совет</strong></p>
<p style="text-align: justify;">     При определении столбца типа CHAR можно не указывать его длину. В этом случае будет использована длина по умолчанию, равная 1. Однако определение столбца без явного указания длины считается проявлением небрежности. Указывайте длину столбца во всех случаях, даже если она равна 1.</p>
</blockquote>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>Как в Oracle хранится текст</strong></p>
<p style="text-align: justify;">     Для начала нужно выяснить, что в базе данных считается текстом. Это не всегда очевидно, поскольку некоторые текстовые столбцы используются только для хранения чисел.</p>
<p style="text-align: justify;">     Текстовый столбец может содержать буквы, цифры, пробелы и специальные символы — все, что можно ввести с клавиатуры. Когда в текстовый столбец вводится число, оно также рассматривается как текст. Числа в текстовых столбцах невозможно складывать, усреднять или выполнять над ними какие-либо другие математические операции. (Правда, есть функции, позволяющие преобразовывать числа из текстовых столбцов в числа, пригодные для вычислений, но пока мы не будем касаться этой темы).</p>
<p style="text-align: justify;">     Для чего может потребоваться помещать число в текстовый столбец, если с ним нельзя проводить вычисления? Дело в том, что в ряде случаев числа используются не только для вычислений. Пример — телефонные номера. Возьмем такой номер:<br />
(800)555-1212.</p>
<blockquote>
<p style="text-align: justify;"><strong>Совет</strong></p>
<p style="text-align: justify;">     Как определить, какой столбец использовать для хранения чисел — текстовый или числовой? Подумайте, будете ли вы когда-нибудь выполнять над этими числами математические операции (например, сложение или усреднение). Если да, то используйте числовой столбец. В противном случае более подходящим может оказаться текстовый столбец.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Как Oracle сохраняет числа</strong></p>
<p style="text-align: justify;">     Для определения столбцов, в которых будут храниться только числа, используется тип данных NUMBER. При определении столбца типа NUMBER также указывается, сколько цифр должен хранить столбец. Эта спецификация может состоять из двух частей: количества цифр до десятичной точки и количества цифр после десятичной точки.</p>
<p style="text-align: justify;">     Тип данных NUMBER позволяет хранить поистине огромные числа: наибольшее значение составляет 999999999999999999999999999 999 999 999 990 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000. Число цифр после десятичной точки может достигать 127. Такой диапазон значений рассчитан на промышленное применение и является одной из черт, отличающих серьезные базы данных, такие, как Oracle, от офисных продуктов, к которым относятся электронные таблицы.</p>
<p>&nbsp;</p>
<p><strong>Как Oracle сохраняет даты</strong></p>
<p style="text-align: justify;">     С датами, хранимыми в виде текста, проводить вычисления нельзя, поскольку в текстовом представлении они не имеют числовых значений. Это просто строки символов, которые мы, люди, интерпретируем как даты. Для вычислений с датами их нужно как-то преобразовать в числа. Поскольку большинство таких вычислений включает подсчет дней, самый удобный подход — присвоить каждому дню уникальный номер так, чтобы номер завтрашнего дня был на единицу больше номера сегодняшнего дня. Если теперь вычесть более раннюю дату из более поздней, разность будет равна числу дней между ними. Такой способ счета дней существует давно: это юлианский календарь. Когда система использует юлианский календарь, начальному дню присваивается номер 1, следующий за ним называется днем 2 и т. д. Поскольку каждый последующий день увеличивает счетчик на единицу, календарь такого типа идеально подходит для вычислений с датами. Oracle поддерживает юлианский календарь, где начальной датой является 1 января 4712 г. до н.э. Преобразование дат между визуальным форматом (например, &#8217;08-MAY-2004&#8242;) и его юлианским эквивалентом производится автоматически. Мы просто вводим даты в привычном текстовом представлении, затем Oracle преобразует их в свой внутренний, юлианский, формат, а при выборке этих дат из таблицы они снова отображаются виде дней, месяцев и лет. Нам никогда не потребуется просматривать даты в юлианском формате.</p>
<blockquote><p><strong>Примечание</strong></p>
<p style="text-align: justify;">     В SQL-операторах даты должны заключаться в одиночные кавычки, как и текстовые строки.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Определение структуры таблицы</strong></p>
<p style="text-align: justify;">     Создавая свою собственную таблицу, вы знаете ее структуру&#8230; до поры до времени. Потом вам придется заниматься другими вещами, и вы забудете подробности того, что делали раньше. Если же таблицу создал кто-то другой, вы вообще не имеете представления об ее структуре. Следовательно, нужно иметь возможность определять структуру существующей таблицы. Вероятно, вас не очень удивит известие о том, что в Oracle есть команда, предназначенная имен но для этой цели. Она называется DESCRIBE (сокращенно — DESC) и имеет следующий синтаксис:</p>
<blockquote><p>DESC имя_таблицы</p></blockquote>
<p style="text-align: justify;">     Это одна из немногих команд, которые не требуется завершать точкой с запятой. С другой стороны, наличие точки с запятой ничему не повредит, так что можете ее ставить — просто для закрепления привычки.</p>
<p>&nbsp;</p>
<p><strong>Столбцы NULL и NOT NULL</strong></p>
<p style="text-align: justify;">     При разработке таблиц для хранения информации определенного назначения (давайте вместо слова &#171;назначение&#187; употребим &#171;приложение&#187;) вы можете в довольно широких пределах контролировать, что может, а что не может попа- дать в эти таблицы. Коль скоро вам предоставлена такая возможность, на вас ложится ответственность за ее использование таким образом, чтобы обеспечить максимально возможное качество данных в таблицах. Одним из решений, которые следует принять в первую очередь, является решение о том, какие столбцы записи должны содержать данные, а какие могут оставаться пустыми.</p>
<p>&nbsp;</p>
<blockquote><p><strong> Примечание</strong></p>
<p style="text-align: justify;">     Отдельные единицы информации (например, имя и зарплата) на языке баз данных называются атрибутами. Атрибуты непосредственно связаны со столбцами таблицы. Столбец — это средство физического хранения, тогда как атрибут представляет собой содержимое столбца.</p>
</blockquote>
<p>&nbsp;</p>
<p><strong>Математические операторы</strong></p>
<p style="text-align: justify;">     На техническом языке математические символы, обозначающие операции, называются операторами (operators). Например, знаки плюса и минуса — это операторы. Oracle поддерживает четыре стандартные арифметические операции — сложение, вычитание, умножение и деление. Умножение обозначается звездочкой (*). Для деления используется символ /, а для сложения и вычитания — символы + и -, соответственно.</p>
<p>&nbsp;</p>
<p><strong>Что такое выражение?</strong></p>
<p style="text-align: justify;">     В Oracle термин выражение (expression) имеет различные значения. В нашем случае он обозначает часть команды, состоящую из одного и более имен столбцов, NULL, введенных вами значений (таких, как числа, которые также называются константами, поскольку они фиксированы), или любой комбинации этих членов, соединенных математическими операторами.</p>
<p>&nbsp;</p>
<p><strong>Приоритеты операторов</strong></p>
<p style="text-align: justify;">     Когда выражение содержит более одного математического оператора, Oracle применяет правила, определяющие порядок выполнения операций. Умножение, деление и любые операции в скобках выполняются в первую очередь, слева направо. Затем выполняются сложение и вычитание, также слева направо. Многие забывают, какие математические операции выполняются в первую очередь, если вообще когда-либо это знали. По этой причине следует явно указывать в выражениях порядок вычислений, используя скобки. Заключите в скобки часть выражения, которая должна вычисляться в первую очередь, и ни у кого не возникнет вопросов о порядке операций.</p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>Соединение двух и более частей текста</strong></p>
<p style="text-align: justify;">     При работе с базами данных часто возникают ситуации, когда желательно показать содержимое двух и более текстовых столбцов в одной строке, продолжая хранить части текста в разных столбцах. Например, на почтовой наклейке в одной строке указываются имя, фамилия, город, штат и почтовый индекс (или аналогичная информация, принятая в вашей стране), но изначально эти данные хранятся в разных столбцах таблицы. Соединение двух частей текста называется конкатенацией (concatenation). Чтобы указать на необходимость соединения двух столбцов в операторе SELECT, нужно поместить между их именами две вертикальные черты (||).</p>
<p>&nbsp;</p>
<p><strong>Присваивания столбцам псевдонимов</strong></p>
<p style="text-align: justify;">     Как вы могли заметить, в результате последней команды заголовок столбца совсем &#171;отбился от рук&#187;. По умолчанию заголовками столбцов служат их имена. Однако при выполнении оператора SELECT, в котором используется конкатенация столбцов, в качестве заголовка отображается все выражение. Обычно это выглядит непривлекательно и редко приносит пользу. SQL позволяет определить, что будет помещено на вершине столбца, выбранного оператором SELECT. Все, что для этого нужно, — ввести после имени столбца (или выражения) текст, который вы хотите видеть в качестве заголовка.</p>
<p style="text-align: justify;">     Имя-заменитель, которое вы указываете для столбца, называется псевдонимом столбца (alias). Если заключить псевдоним в двойные кавычки, в нем можно будет использовать пробелы и буквы нижнего регистра. (Двойные кавычки необходимы для того, чтобы Oracle не пытался интерпретировать псевдоним как имя столбца, подлежащего выборке.)</p>
<p>&nbsp;</p>
<p><strong>Итоги</strong></p>
<p style="text-align: justify;">     Имя таблицы или столбца может иметь длину до 30 символов. Оно должно начинаться с буквы и может содержать буквы, цифры и ограниченный набор специальных символов, наиболее полезным из которых является символ подчеркивания &#171;_&#187; позволяющий визуально разделять слова в имени. Пробелы в именах таблиц и столбцов недопустимы. Oracle рассматривает символы верхнего и нижнего регистров как одинаковые.</p>
<p style="text-align: justify;">     Определенное количество слов зарезервировано и не может использоваться в качестве имен таблиц или столбцов. В частности, к ним относятся команды (например, CREATE) и имена объектов (например, ROW). Зарезервированных слов слишком много, и запомнить их все большинству людей не под силу. Случайно употребив одно из них, вы сразу узнаете об этом, поскольку вместо нормального завершения команды Oracle выдаст сообщение об ошибке с фразой &#171;Invalid table name&#187; или &#171;Invalid column name&#187;. Если проблема связана с именем таблицы, добавьте в начале имени аббревиатуру, обозначающую систему, частью которой является таблица (например, AP_ADMIN вместо ADMIN). Если проблема связана с именем столбца, добавьте к имени одно-два слова, чтобы лучше описать содержимое столбца.</p>
<p style="text-align: justify;">     Создавая любую таблицу, вы автоматически становитесь ее владельцем. Все принадлежащие вам таблицы должны иметь уникальные имена; у вас не может быть двух таблиц с одним и тем же именем. (Однако имена таблиц, принадлежащих двум разным пользователям Oracle, могут совпадать.) Каждый столбец в пределах одной таблицы должен иметь уникальное имя. В разных таблицах могут использоваться одни и те же столбцы.</p>
<p style="text-align: justify;">     Имена таблиц лучше всего записывать в единственном, а не множественном числе: например, таблицу служащих следует назвать EMPLOYEE, а не EMPLOYEES. Кроме того, не нужно включать в имя таблицы слова TABLE и DATA, поскольку все, о чем они сообщают, следует из самого факта работы с таблицей. При создании таблицы вы должны указать тип данных и длинукаждого столбца. Таблицы Oracle могут хранить любые разновидности данных — текст, числа, даты, изображения, звуковые файлы и т. д. Каждый тип данных имеет определенный набор свойств. Самые распространенные типы данных таблицы — это текст, числа и даты.</p>
<p style="text-align: justify;">     Текстовый столбец может содержать буквы, цифры, пробелы и специальные символы — все, что можно ввести с клавиатуры. Когда в текстовый столбец вводится число, оно также рассматривается как текст. Числа в текстовых столбцах невозможно складывать, усреднять или выполнять над ними какие-либо другие математические операции. В текстовые столбцы обычно помещаются числа, содержащие нецифровые символы — знаки математических операций, буквенные символы или пробелы. Широко известными примерами текстовых значений, содержащих большое количество чисел, являются телефонные номера, номера социального обеспечения и счетов. Если числовое значение никогда не предполагается использовать в математических операциях, оно является хорошим кандидатом на помещение в текстовый столбец.</p>
<p style="text-align: justify;">     Существуют два основных типа текстовых столбцов: с фиксированной и переменной длиной. Для создания столбца фиксированной длины нужно указать в команде CREATE TABLE тип данных CHAR. Длина текста в столбцах CHAR всегда равна длине, указанной в объявлении столбца. Более короткие данные дополняются пробелами. Это может привести к бесполезной трате места, поэтому столбцы CHAR уместны только в тех случаях, когда все данные будут иметь одинаковую длину, как, например, обозначения пола или коды штатов.</p>
<p style="text-align: justify;">     Большинство текстовых столбцов будут содержать данные переменной длины, и здесь следует использовать тип VARCHAR2. Если длина текста, который вы намереваетесь хранить в столбце, превышает 2000 символов (это максимум для типа VARCHAR2), можно воспользоваться типом LONG, который позволяет хранить до двух миллиардов символов в одном поле.</p>
<p style="text-align: justify;">     Текстовое значение обычно называется строкой. В SQL-командах строки всегда заключаются в одиночные кавычки. Простой текст, содержащий только те символы, которые можно найти на клавиатуре (без символов форматирования, вставляемых текстовыми процессорами и электронными таблицами), часто называется ASCJI-текстом. (ASCII — это сокращение от American Standard Code for Information Interchange.) Стандарт ASCII предназначен для приведения информации к &#171;общему знаменателю&#187;, чтобы обеспечить ее перенос между компьютерами.</p>
<p style="text-align: justify;">     Для числовых столбцов в отличие от текстовых Oracle предлагает всего один базовый тип данных с названием NUMBER. При создании числового столбца вы просто указываете максимальное количество цифр, которое он может содержать, вместе с требуемым количеством цифр после запятой. Наибольшее число, которое можно хранить, составляет 999 999 999 999 999 999 999 999 999 999 999 999 990 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000.</p>
<p style="text-align: justify;">     Для хранения даты и времени Oracle предоставляет тип данных DATE. Значения дат (которые, как и любой текст, заключаются в одиночные кавычки) при сохранении преобразуются в юлианские даты. Преобразование дат между визуальным форматом (например, &#8217;08-MAY-2004&#8242;) и его юлианским эквивалентом производится автоматически. Мы просто вводим даты в привычном текстовом представлении, затем Oracle преобразует их в свой внутренний, юлианский, формат, а при выборке этих дат из таблицы они снова будут отображены в виде дней, месяцев и лет. Нам никогда не потребуется просматривать даты в юлианском формате.</p>
<p style="text-align: justify;">     Тип данных DATE можно использовать для вычислений с датами. Например, чтобы получить дату, отстоящую на неделю от некоторой известной даты, нужно просто добавить 7 к этой известной дате. Oracle также проверяет достоверность дат; например, если кто-то попытается вставить дату 29 февраля 2002 г. в столбец с датами, то Oracle не позволит это сделать, поскольку 2002 г. не является високосным, а следовательно, не содержит 29 дней в феврале.</p>
<p style="text-align: justify;">     Время хранится в виде десятичной дроби, показывающей, какая часть дня прошла к этому моменту. Например, если некоторому дню соответствует юлианская дата 33333, то время 18:00 этого дня будет сохранено как 33333.75 (.75<br />
показывает, что к 18:00 прошло 75% дня).</p>
<p style="text-align: justify;">     После изучения самых распространенных типов данных Oracle вы познакомились с тем, как использовать команду DESC для просмотра структуры существующей таблицы. Вы также узнали, что в команде CREATE TABLE можно указать спецификацию NOT NULL для любого столбца (или всех столбцов), в результате чего вставка или обновление записей будут возможны только при указании значений для этих столбцов.</p>
<p style="text-align: justify;">     При добавлении или изменении данных в таблицах, столбцы которых допускают null-значения, можно избежать ввода значения в столбец, если указать NULL в том месте SQL-оператора, где должно находиться значение столбца. Пропустить столбцы в команде INSERT можно и другим способом — явно перечислить все заполняемые столбцы, не указывая те, в которые не предполагается вводить данные. Чтобы вставить данные с апострофами при помощи программы SQL*Plus, предварите команду INSERT командой SET SCAN OFF. Закончив вставку данных с апострофами, введите команду SET SCAN ON, что бы вернуть систему в нормальный режим.</p>
<p style="text-align: justify;">     Затем вы изучили ряд более сложных способов просмотра данных в таблице. Чтобы указать, какие из столбцов таблицы должны быть выведены, перечислите в операторе SELECT их имена вместо звездочки, обозначающей все столбцы. Чтобы просмотреть столбцы в другом порядке, просто перечислите их в этом порядке, когда будете писать команду SELECT.</p>
<p style="text-align: justify;">     Для проведения вычислений с данными, хранимыми в таблице, включите в оператор SELECT математические операторы, используя имена нужных столбцов в качестве переменных. Полученное выражение, имеющее вид математической формулы, будет давать ответы на основе табличных данных. Если формула содержит более одного оператора, при ее написании необходимо обращать внимание на приоритет операторов, т.е. на последовательность, в которой Oracle выполняет операции. Умножение, деление и любые операции в скобках выполняются в первую очередь, слева направо. Затем выполняются сложение и вычитание, также слева направо. Для управления порядком вычислений лучше всего использовать скобки. Заключите в скобки часть выражения, которая должна вычисляться в первую очередь, и ни у кого не возникнет вопросов о порядке операций.</p>
<p style="text-align: justify;">     Если вы хотите сложить не числа, а текстовые строки (иначе говоря, выполнить конкатенацию двух текстовых столбцов), поместите между именами столбцов в операторе SELECT две вертикальные черты (||). Чтобы разделить две<br />
части текста пробелом, поместите между именами столбцов комбинацию || &#8216; &#8216; ||. В результате этих действий заголовок столбца может оказаться слишком длинным и неудобным для чтения. В таком случае следует присвоить столбцу псевдоним, указав его после выражения, содержащего оператор конкатенации.</p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>Примеры</strong></p>
<p style="text-align: justify;"><strong>1.</strong> Создадим таблицу table1:</p>
<blockquote>
<p style="text-align: justify;">CREATE TABLE table1<br />
(<br />
&#8216;product_name&#8217;  VARCHAR2(25) NOT NULL,<br />
&#8216;product_price&#8217; NUMBER(4,2) NOT NULL,<br />
&#8216;product_date&#8217; DATE<br />
);</p>
</blockquote>
<p style="text-align: justify;"><strong>2.</strong> Вставим данные в таблицу table1:</p>
<blockquote>
<p style="text-align: justify;">INSERT INTO table1 VALUES (&#8216;ProductName1&#8242;, 1, &#8217;5-NOV-2000&#8242;);<br />
INSERT INTO table1 VALUES (&#8216;ProductName2&#8242;, 2.5, &#8217;29-JUN-2001&#8242;);<br />
INSERT INTO table1 VALUES (&#8216;ProductName3&#8242;, 50.75, &#8217;10-DEC-2002&#8242;);<br />
INSERT INTO table1 VALUES (&#8216;ProductName4&#8242;, 1, NULL);</p>
</blockquote>
<p style="text-align: justify;"><strong>3.</strong> Выберем все поля (столбцы)  из таблицы table1:</p>
<blockquote>
<p style="text-align: justify;">SELECT * FROM table1;</p>
</blockquote>
<p style="text-align: justify;"><strong>4.</strong> Выберем некоторые поля из таблицы table:</p>
<blockquote>
<p style="text-align: justify;">SELECT product_name, product_price FROM table1;</p>
</blockquote>
<p style="text-align: justify;"><strong>5.</strong> Удалим таблицу table1:</p>
<blockquote><p>DROP TABLE table1;</p></blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kochetov.org.ua/2012/02/21/oracle_database_save_select/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

