<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Olga Aldabaeva </title><subtitle>ORACLE APEX developer
🔹 Оптимизирую SQL/PLSQL
🔹 Разрабатываю приложения APEX
🔹 Работаю с геоданными, JSON, XML</subtitle><author><name>Olga Aldabaeva </name></author><id>https://teletype.in/atom/apworks</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/apworks?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@apworks?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/apworks?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-05T02:25:32.705Z</updated><entry><id>apworks:swVW4E-UvEc</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/swVW4E-UvEc?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Перенос Excel в таблицу в pl/sql developer</title><published>2025-12-21T14:53:33.059Z</published><updated>2025-12-21T14:53:33.059Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/23/9e/239e6b66-8d37-4580-bdc4-ff7cf31fafd5.png"></media:thumbnail><category term="oracle-database" label="Oracle database"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/c0/5e/c05efce7-9a79-4cdf-a8a0-6a81460c857c.png&quot;&gt;Как импортировать данные из Excel в PL/SQL Developer с помощью Text Importer?</summary><content type="html">
  &lt;p id=&quot;v9OC&quot;&gt;Как импортировать данные из Excel в PL/SQL Developer с помощью Text Importer?&lt;/p&gt;
  &lt;p id=&quot;ZNCD&quot;&gt;&lt;strong&gt;Проблема:&lt;/strong&gt; Часто возникает необходимость быстро перенести данные из Excel в Oracle-таблицу, но ручной ввод или написание скриптов для каждой загрузки отнимает время и чревато ошибками.&lt;/p&gt;
  &lt;p id=&quot;Tjx0&quot;&gt;Чтобы быстро загрузить данные из Excel в Oracle через PL/SQL Developer, удобно воспользоваться встроенным инструментом &lt;strong&gt;Text Importer&lt;/strong&gt;. Вот краткая пошаговая инструкция.&lt;/p&gt;
  &lt;h2 id=&quot;GjMx&quot;&gt;&lt;br /&gt;1. Подготовьте данные в Excel&lt;/h2&gt;
  &lt;p id=&quot;ab4R&quot;&gt;Сохраните нужный лист в формате CSV (Файл → Сохранить как → CSV UTF-8 или CSV с разделителями-запятыми). Убедитесь, что первая строка содержит заголовки — она понадобится при настройке импорта.&lt;/p&gt;
  &lt;figure id=&quot;ewOI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/38/c13805e2-1469-4678-b7f4-8016ad89a782.png&quot; width=&quot;567&quot; /&gt;
    &lt;figcaption&gt;Подготовка данных в csv&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zbQ2&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;8zHr&quot;&gt;2. Создайте таблицу в базе&lt;/h2&gt;
  &lt;p id=&quot;yvBF&quot;&gt;Перед импортом создайте таблицу с колонками, соответствующими структуре CSV-файла.&lt;/p&gt;
  &lt;p id=&quot;ZwDs&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;oDyy&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE theme_16_load_excel (
    id         NUMBER,
    name       VARCHAR2(500),
    department VARCHAR2(500),
    salary     NUMBER,
    hire_date  DATE
);&lt;/pre&gt;
  &lt;p id=&quot;WGIx&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;p8ft&quot;&gt;3. Запустите Text Importer&lt;/h2&gt;
  &lt;p id=&quot;uc96&quot;&gt;В PL/SQL Developer перейдите:&lt;/p&gt;
  &lt;h3 id=&quot;2MVj&quot;&gt;Tools → Text Importer.&lt;/h3&gt;
  &lt;figure id=&quot;AgQK&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://avatars.dzeninfra.ru/get-zen_doc/271828/pub_694805d581e6f420ab25eabd_6948080969f43c63d367789f/scale_1200&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;YaYQ&quot;&gt;Во вкладке Data from text file укажите путь к CSV-файлу.&lt;/h3&gt;
  &lt;figure id=&quot;vpIf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9f/1a/9f1abf3b-bdbd-4f23-95af-31db39a350c5.png&quot; width=&quot;604&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ueSJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/55/1c55c061-f925-4d77-94d5-222054f4caaa.png&quot; width=&quot;639&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DqSZ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;1UuG&quot;&gt;Выберите разделитель (обычно запятая или точка с запятой).&lt;/h3&gt;
  &lt;figure id=&quot;I62B&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/5e/c05efce7-9a79-4cdf-a8a0-6a81460c857c.png&quot; width=&quot;1630&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gtj4&quot;&gt;Отметьте First row is column names, если первая строка — заголовки.&lt;/p&gt;
  &lt;p id=&quot;y4xj&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;fDd8&quot;&gt;Во вкладке Data to Oracle:&lt;/h3&gt;
  &lt;figure id=&quot;Ytx3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/c5/96c5ffb4-68db-4499-9173-863d8c4d6869.png&quot; width=&quot;941&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;rkHi&quot;&gt;Укажите схему и имя созданной таблицы (например, &amp;#x60;THEME_16_LOAD_EXCEL&amp;#x60;).&lt;/h3&gt;
  &lt;figure id=&quot;f4Ua&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/75/ed/75ed33ee-2d60-49df-9dfe-2afe32ae9215.png&quot; width=&quot;1611&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Gxww&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;9Pay&quot;&gt;Сопоставьте колонки файла с полями таблицы (обычно делается автоматически по именам).&lt;/h3&gt;
  &lt;p id=&quot;entS&quot;&gt;Нажмите Import, и данные будут загружены.&lt;/p&gt;
  &lt;figure id=&quot;Lwvd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7f/01/7f01410e-aa13-4b95-b50a-59267ac8b1d2.png&quot; width=&quot;1159&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;NzRZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6a/34/6a3450b4-6ad2-411d-b3b4-5aa39c8be683.png&quot; width=&quot;791&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;INBQ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;eb4J&quot;&gt;Готово! Этот способ особенно удобен для разовых загрузок или небольших объёмов данных.&lt;/p&gt;
  &lt;p id=&quot;gcLq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;MqkJ&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt; PL/SQL Developer предоставляет удобный инструмент &lt;strong&gt;Text Importer&lt;/strong&gt;, который позволяет импортировать данные из CSV-файлов (сохранённых из Excel) напрямую в существующую таблицу. Всего за несколько кликов можно загрузить данные, избежав ошибок форматирования и сэкономив время. Главное — заранее создать таблицу с подходящей структурой и правильно указать параметры импорта.&lt;/p&gt;
  &lt;p id=&quot;df9Q&quot;&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;YJ9k&quot;&gt;P.S. Главный секрет разработчика — не делать вручную то, что можно автоматизировать в три клика. Text Importer — один из таких секретов. Пользуйтесь на здоровье.&lt;/blockquote&gt;

</content></entry><entry><id>apworks:kFvivI8LTJp</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/kFvivI8LTJp?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Массивы в Oracle</title><published>2025-08-09T15:17:40.418Z</published><updated>2025-08-09T15:17:40.418Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/22/5c/225c54b8-ddb8-4bab-85bb-95a75592541d.png"></media:thumbnail><category term="oracle-pl-sql" label="Oracle PL/SQL"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/62/49/62490196-0032-49a1-92af-2955a4fc67f0.png&quot;&gt;Введение</summary><content type="html">
  &lt;figure id=&quot;yG8T&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/62/49/62490196-0032-49a1-92af-2955a4fc67f0.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MX5Z&quot;&gt;Введение&lt;/p&gt;
  &lt;p id=&quot;Y0PH&quot;&gt;В Oracle &lt;strong&gt;массив &lt;/strong&gt;— это структура, которая позволяет хранить набор значений в одной переменной.  &lt;br /&gt;Представьте, что у вас есть список номеров школ — вместо того чтобы заводить 10 переменных school1, school2, ..., мы кладём все значения в один контейнер и работаем с ними как с единым объектом.&lt;/p&gt;
  &lt;p id=&quot;SqED&quot;&gt;Массивы в Oracle особенно полезны в &lt;strong&gt;PL/SQL&lt;/strong&gt;, при передаче данных между процедурами, а также при интеграции через OCI (Oracle Call Interface).&lt;/p&gt;
  &lt;p id=&quot;QKfO&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;I2OE&quot;&gt;Основные типы массивов в Oracle&lt;/h2&gt;
  &lt;h3 id=&quot;Gwrg&quot;&gt;VARRAY (Variable-size array)&lt;/h3&gt;
  &lt;ul id=&quot;FPqw&quot;&gt;
    &lt;li id=&quot;CU3o&quot;&gt;Хранит фиксированное _максимальное_ количество элементов.&lt;/li&gt;
    &lt;li id=&quot;nRun&quot;&gt;Данные хранятся &lt;strong&gt;вместе&lt;/strong&gt; с родительской записью (inline).&lt;/li&gt;
    &lt;li id=&quot;ALMy&quot;&gt;Хорошо для небольших списков, когда нужен фиксированный лимит.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Tgz7&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;dm1b&quot;&gt;NESTED TABLE&lt;/h3&gt;
  &lt;ul id=&quot;hrll&quot;&gt;
    &lt;li id=&quot;Cy1E&quot;&gt;Размер не ограничен.&lt;/li&gt;
    &lt;li id=&quot;Tt0x&quot;&gt;Данные могут храниться отдельно от основной таблицы (out-of-line).&lt;/li&gt;
    &lt;li id=&quot;SP1O&quot;&gt;Удобно, когда список может расти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6wEX&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;EX6T&quot;&gt;INDEX-BY TABLE (Associative array)&lt;/h3&gt;
  &lt;ul id=&quot;K8Ck&quot;&gt;
    &lt;li id=&quot;ua4r&quot;&gt;Хранится только в памяти (не в таблице).&lt;/li&gt;
    &lt;li id=&quot;k3b8&quot;&gt;Индексация по числу или строке.&lt;/li&gt;
    &lt;li id=&quot;ZLtF&quot;&gt;Используется в PL/SQL для временных структур.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;BODV&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;tVfN&quot;&gt;TABLE OF TYPE&lt;/h3&gt;
  &lt;ul id=&quot;YltM&quot;&gt;
    &lt;li id=&quot;tvh9&quot;&gt;Пользовательский тип данных, который можно использовать в схемах, пакетах и т. д.&lt;/li&gt;
    &lt;li id=&quot;9G2S&quot;&gt;Часто используется для передачи коллекций между процедурами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;YoH1&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;XIXO&quot;&gt;OCI Массивы (SYS.OCI...)&lt;/h3&gt;
  &lt;ul id=&quot;t688&quot;&gt;
    &lt;li id=&quot;99VI&quot;&gt;Специальные структуры для обмена данными с клиентскими приложениями через OCI.&lt;/li&gt;
    &lt;li id=&quot;KiYw&quot;&gt;Применяются при работе с драйверами C/C++ или при пакетной загрузке данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;b9Lk&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;sMB1&quot;&gt;Массив школ в SYS.ODCINumberList (OCI совместимый тип)&lt;/h3&gt;
  &lt;p id=&quot;2zdB&quot;&gt;В Oracle уже есть готовые коллекции в пакете &lt;strong&gt;SYS&lt;/strong&gt;, которые используются и в OCI — например:&lt;/p&gt;
  &lt;ol id=&quot;Kfpl&quot;&gt;
    &lt;li id=&quot;8RBu&quot;&gt;SYS.ODCINumberList — массив чисел&lt;/li&gt;
    &lt;li id=&quot;dOdd&quot;&gt;SYS.ODCIvarchar2List — массив строк&lt;/li&gt;
    &lt;li id=&quot;dSA2&quot;&gt;SYS.ODCIRawList — массив RAW&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;lW5z&quot;&gt;Они часто применяются для &lt;strong&gt;bulk insert&lt;/strong&gt;, передачи в SQL из PL/SQL, и для интеграции с внешними клиентами.&lt;/p&gt;
  &lt;p id=&quot;GZzZ&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;JlVa&quot;&gt;Сравнение&lt;/h2&gt;
  &lt;figure id=&quot;6kky&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f2/df/f2dffdca-0dff-45a6-8355-6eddf2894440.png&quot; width=&quot;515&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4FTb&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;5Au4&quot;&gt;Где применяется&lt;/h2&gt;
  &lt;ul id=&quot;y4Iv&quot;&gt;
    &lt;li id=&quot;VdcS&quot;&gt;Списки — например, список номеров школ для обработки.&lt;/li&gt;
    &lt;li id=&quot;ZAas&quot;&gt;Передача параметров в процедуру/функцию.&lt;/li&gt;
    &lt;li id=&quot;KMot&quot;&gt;Пакетная загрузка данных в таблицу.&lt;/li&gt;
    &lt;li id=&quot;weY2&quot;&gt;Интеграция с внешними приложениями через OCI.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6FQd&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;qOeJ&quot;&gt;Пример SYS.ODCINumberList&lt;/h2&gt;
  &lt;pre id=&quot;xQJH&quot; data-lang=&quot;sql&quot;&gt;DECLARE
	v_schools SYS.ODCINumberList := SYS.ODCINumberList(101, 102, 103);
BEGIN
	v_schools.EXTEND;
	v_schools(4) := 104;
	FOR i IN 1 .. v_schools.COUNT LOOP
		DBMS_OUTPUT.PUT_LINE(&amp;#x27;School #&amp;#x27; || v_schools(i));
	END LOOP;
END;&lt;/pre&gt;
  &lt;p id=&quot;l8O0&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;S50S&quot;&gt;Пример  TYPE&lt;/h2&gt;
  &lt;pre id=&quot;bS8E&quot; data-lang=&quot;sql&quot;&gt;CREATE OR REPLACE TYPE school_varray AS VARRAY(5) OF NUMBER;  
DECLARE
	v_schools school_varray := school_varray(201, 202);
BEGIN
	v_schools.EXTEND;
	v_schools(3) := 203;
	DBMS_OUTPUT.PUT_LINE(&amp;#x27;Total schools: &amp;#x27; || v_schools.COUNT);
END;&lt;/pre&gt;
  &lt;p id=&quot;vDvm&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;jFEl&quot;&gt;Пример nested table&lt;/h2&gt;
  &lt;pre id=&quot;avAA&quot; data-lang=&quot;sql&quot;&gt;CREATE OR REPLACE TYPE school_list AS TABLE OF NUMBER;  
DECLARE
	v_schools school_list := school_list(101, 102, 103);
BEGIN
	FOR i IN 1 .. v_schools.COUNT LOOP
		DBMS_OUTPUT.PUT_LINE(&amp;#x27;School #&amp;#x27; || v_schools(i));
	END LOOP;
END;&lt;/pre&gt;
  &lt;h2 id=&quot;WUHM&quot;&gt;&lt;br /&gt;Пример INDEX-BY TABLE&lt;/h2&gt;
  &lt;pre id=&quot;npmI&quot; data-lang=&quot;sql&quot;&gt;DECLARE
	TYPE school_index IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
	v_schools school_index;
BEGIN
	v_schools(1) := &amp;#x27;School #301&amp;#x27;;
	v_schools(2) := &amp;#x27;School #302&amp;#x27;;
	DBMS_OUTPUT.PUT_LINE(v_schools(1));
	DBMS_OUTPUT.PUT_LINE(v_schools(2));
END;&lt;/pre&gt;
  &lt;p id=&quot;DwIr&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;6fsv&quot;&gt;Пример SYS.OCI...&lt;/h2&gt;
  &lt;pre id=&quot;uP6S&quot; data-lang=&quot;sql&quot;&gt;DECLARE
	v_schools SYS.ODCINumberList := SYS.ODCINumberList(101, 102, 103);
BEGIN
	v_schools.EXTEND;
	v_schools(4) := 104;
	FOR i IN 1 .. v_schools.COUNT LOOP
		DBMS_OUTPUT.PUT_LINE(&amp;#x27;Школа №&amp;#x27; || v_schools(i));
	END LOOP;
END;&lt;/pre&gt;
  &lt;p id=&quot;azy0&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;A5j8&quot;&gt;Полезные ссылки&lt;/h2&gt;
  &lt;ol id=&quot;fu4h&quot;&gt;
    &lt;li id=&quot;5as2&quot;&gt; Документация Oracle — Collections and Records (&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-collections-and-records.html&quot; target=&quot;_blank&quot;&gt;читать&lt;/a&gt;)&lt;/li&gt;
    &lt;li id=&quot;1zN3&quot;&gt;DBMS_XPLAN — вывод плана выполнения(&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XPLAN.html&quot; target=&quot;_blank&quot;&gt;читать&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;x6w6&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;01HG&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;P1H2&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram &lt;/a&gt;| &lt;a href=&quot;https://aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>apworks:MkRlQIBBeha</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/MkRlQIBBeha?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Bitmap индекс в Oracle — когда ускоряет, а когда мешает</title><published>2025-07-06T12:56:23.406Z</published><updated>2025-07-06T12:56:23.406Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/28/c4/28c4308f-87c0-41f9-8615-f62eee49aa96.png"></media:thumbnail><category term="oracle-database" label="Oracle database"></category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>индексы</tt:hashtag><tt:hashtag>битовый_индекс</tt:hashtag><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/8f/c3/8fc3cf59-d244-47b6-843a-8abc11755cd0.png&quot;&gt;Битовые индексы — мощный инструмент в Oracle, но работают не везде. В этом посте — просто и по делу: когда их использовать, а когда лучше обойти стороной.</summary><content type="html">
  &lt;figure id=&quot;uxSE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8f/c3/8fc3cf59-d244-47b6-843a-8abc11755cd0.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;OJ8q&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;qxST&quot;&gt;Битовые индексы — мощный инструмент в Oracle, но работают не везде. В этом посте — просто и по делу: когда их использовать, а когда лучше обойти стороной.&lt;/p&gt;
  &lt;h2 id=&quot;6rDm&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;zxIx&quot;&gt;Что такое битовый индекс?&lt;/h2&gt;
  &lt;p id=&quot;CNVP&quot;&gt;В отличие от классического B-tree индекса, который хранит ссылки на строки с конкретными значениями, битовый индекс использует битовые карты: для каждого уникального значения создаётся &amp;quot;битовая маска&amp;quot;, где каждая строка таблицы — это позиция (бит). Один бит = одна строка.&lt;/p&gt;
  &lt;p id=&quot;lKgf&quot;&gt;Такой подход суперэффективен, когда:&lt;/p&gt;
  &lt;ol id=&quot;siOQ&quot;&gt;
    &lt;li id=&quot;jrZL&quot;&gt;значений немного (низкая кардинальность)&lt;/li&gt;
    &lt;li id=&quot;HWkv&quot;&gt;частые фильтры или группировки по этому полю.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;bMnF&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;4GkX&quot;&gt;Когда он полезен?&lt;/h2&gt;
  &lt;p id=&quot;GItF&quot;&gt;Посмотрим на таблицу &amp;#x60;demo_customers&amp;#x60;.&lt;/p&gt;
  &lt;pre id=&quot;Sk5X&quot; data-lang=&quot;sql&quot;&gt;-- Таблица customers
CREATE TABLE demo_customers (
  customer_id   NUMBER PRIMARY KEY,
  name          VARCHAR2(100),
  region        VARCHAR2(50),
  created_at    DATE DEFAULT SYSDATE,
  created_by    NUMBER,
  modified_at   DATE,
  modified_by   NUMBER,
  is_active     CHAR(1) DEFAULT &amp;#x27;Y&amp;#x27; CHECK (is_active IN (&amp;#x27;Y&amp;#x27;, &amp;#x27;N&amp;#x27;)),
  deleted_at    DATE,
  deleted_by    NUMBER
);&lt;/pre&gt;
  &lt;p id=&quot;ZUfK&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;BVFY&quot;&gt;Есть поле &amp;#x60;is_active&amp;#x60;, которое может быть &amp;#x60;&amp;#x27;Y&amp;#x27;&amp;#x60; или &amp;#x60;&amp;#x27;N&amp;#x27;&amp;#x60;.&lt;/p&gt;
  &lt;p id=&quot;JnAG&quot;&gt;Угадаете, сколько уникальных значений? Правильно — два.&lt;/p&gt;
  &lt;p id=&quot;mmSU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;j2C8&quot;&gt;Создаем индекс:&lt;/p&gt;
  &lt;pre id=&quot;QU4V&quot; data-lang=&quot;sql&quot;&gt;CREATE BITMAP INDEX idx_cust_is_active ON demo_customers(is_active);&lt;/pre&gt;
  &lt;p id=&quot;OXMk&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;XqkL&quot;&gt;Теперь запросы вроде:&lt;/p&gt;
  &lt;pre id=&quot;o1Nn&quot; data-lang=&quot;sql&quot;&gt;SELECT COUNT(*) FROM demo_customers WHERE is_active = &amp;#x27;Y&amp;#x27;;&lt;/pre&gt;
  &lt;p id=&quot;fZyW&quot;&gt;будут отрабатывать быстрее — особенно на больших таблицах.&lt;/p&gt;
  &lt;p id=&quot;YWVH&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ivQi&quot;&gt;Аналогично, если вы часто строите отчёты по &amp;#x60;region&amp;#x60;, и количество регионов ограничено (например, 10–20), создаём:&lt;/p&gt;
  &lt;pre id=&quot;huIS&quot; data-lang=&quot;sql&quot;&gt;CREATE BITMAP INDEX idx_orders_region   ON demo_orders(region);&lt;/pre&gt;
  &lt;p id=&quot;8do2&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;MPlk&quot;&gt;Это даст буст производительности при таких запросах:&lt;/p&gt;
  &lt;pre id=&quot;7DgB&quot; data-lang=&quot;sql&quot;&gt;SELECT region, COUNT(*)
	FROM demo_orders
 WHERE is_active = &amp;#x27;Y&amp;#x27;
 GROUP BY region;&lt;/pre&gt;
  &lt;p id=&quot;kAkN&quot;&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;Vwcp&quot;&gt; Заметьте: Oracle может эффективно &lt;strong&gt;объединять&lt;/strong&gt; несколько битовых индексов в одном запросе — это ещё один плюс.&lt;/blockquote&gt;
  &lt;p id=&quot;RXI9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ckB4&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;0vSo&quot;&gt;Когда НЕ стоит использовать битовые индексы?&lt;/h2&gt;
  &lt;p id=&quot;aZWD&quot;&gt;Вот где начинаются подводные камни: &lt;/p&gt;
  &lt;ol id=&quot;WelF&quot;&gt;
    &lt;li id=&quot;zIJh&quot;&gt;&lt;strong&gt;Частые DML-операции&lt;/strong&gt; (INSERT/UPDATE/DELETE): битовый индекс &lt;em&gt;тяжеловат&lt;/em&gt; на обновления. Любое изменение строки может затронуть много битов — и Oracle будет блокировать больше, чем хотелось бы. &lt;/li&gt;
    &lt;li id=&quot;kd9T&quot;&gt;&lt;strong&gt;Высокая кардинальность&lt;/strong&gt; — например, индекс на customer_id или product_id точно не стоит делать битовым: для каждого значения будет почти свой отдельный бит, и индекс станет больше самой таблицы. &lt;/li&gt;
    &lt;li id=&quot;3HQY&quot;&gt;В многопользовательской среде с конкурентной записью — возможны блокировки.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;SKnP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Di6V&quot;&gt;Допустим, вы обновляете тысячи строк в demo_orders:&lt;/p&gt;
  &lt;pre id=&quot;Xrxn&quot; data-lang=&quot;sql&quot;&gt;UPDATE demo_orders
   SET is_active = &amp;#x27;N&amp;#x27;
 WHERE order_date &amp;lt; ADD_MONTHS(SYSDATE, -12);&lt;/pre&gt;
  &lt;p id=&quot;6jim&quot;&gt;Битовый индекс is_active здесь будет тормозить: Oracle должен будет перестраивать множество битов, возможно с блокировками. В OLTP-сценариях лучше использовать обычный B-tree или вообще обойтись без индекса.&lt;/p&gt;
  &lt;p id=&quot;fvR2&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;SbGm&quot;&gt;Проверяем скорость с и без индекса&lt;/h2&gt;
  &lt;pre id=&quot;jrFK&quot; data-lang=&quot;sql&quot;&gt;-- включаем простую метрику времени
SET timing ON

-- 1. Без индекса
DROP INDEX idx_cust_is_active;
SELECT /*+ gather_plan_statistics */ COUNT(*)
FROM demo_customers
WHERE is_active = &amp;#x27;Y&amp;#x27;;
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,&amp;#x27;ALLSTATS LAST&amp;#x27;));&lt;/pre&gt;
  &lt;p id=&quot;Lzqs&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;Vp96&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a0/b1/a0b15e8a-c4ed-435f-b9bb-bbdb45726af8.png&quot; width=&quot;506&quot; /&gt;
    &lt;figcaption&gt;Стоимость запроса (cost) = 5 - без индекса bitmap&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;OQXG&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;aXAb&quot; data-lang=&quot;sql&quot;&gt;-- 2. С индексом
CREATE BITMAP INDEX idx_cust_is_active
  ON demo_customers(is_active);
SELECT /*+ gather_plan_statistics */ COUNT(*)
  FROM demo_customers
 WHERE is_active = &amp;#x27;Y&amp;#x27;;
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,&amp;#x27;ALLSTATS LAST&amp;#x27;));&lt;/pre&gt;
  &lt;p id=&quot;l9TM&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;VlKn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/cd/4fcd1601-2264-4fdb-92a7-f382f92ab7c2.png&quot; width=&quot;498&quot; /&gt;
    &lt;figcaption&gt;Стоимость запроса (cost) = 1 - с индексом bitmap&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mBUi&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;S01V&quot;&gt;Резюме&lt;/h2&gt;
  &lt;h3 id=&quot;6kme&quot;&gt;Используй битовый индекс, если:&lt;/h3&gt;
  &lt;ol id=&quot;CLtS&quot;&gt;
    &lt;li id=&quot;2HHb&quot;&gt;Поле с низкой кардинальностью (&amp;#x60;Y/N&amp;#x60;, фиксированный список значений)&lt;/li&gt;
    &lt;li id=&quot;q4AQ&quot;&gt;Часто идёт фильтрация, группировка, аналитика&lt;/li&gt;
    &lt;li id=&quot;Rdbj&quot;&gt;Таблица читается чаще, чем изменяется&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;lCI5&quot;&gt;Избегай, если:&lt;/h3&gt;
  &lt;ol id=&quot;J6Ts&quot;&gt;
    &lt;li id=&quot;gDEO&quot;&gt;Поле с уникальными или почти уникальными значениями&lt;/li&gt;
    &lt;li id=&quot;BEQG&quot;&gt;Частые INSERT/UPDATE/DELETE&lt;/li&gt;
    &lt;li id=&quot;c5l2&quot;&gt;Сценарии с высокой конкурентностью&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;2GUp&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Xj4h&quot;&gt;Полезные ссылки&lt;/h2&gt;
  &lt;ol id=&quot;jOGa&quot;&gt;
    &lt;li id=&quot;KQRf&quot;&gt;Индексы в Oracle (&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/indexes-and-index-organized-tables.html?source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&quot; target=&quot;_blank&quot;&gt;перейти&lt;/a&gt;)&lt;/li&gt;
    &lt;li id=&quot;NIC0&quot;&gt;Bitmap индекс в Oracle (&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/indexes-and-index-organized-tables.html?source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D&amp;source=%253Aex%253Apw%253A%253A%253A%253A%253ATNS_SQL_2_D#GUID-B15C4817-7748-456D-9740-8B9628AF9F47&quot; target=&quot;_blank&quot;&gt;перейти&lt;/a&gt;)&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;6naQ&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;b2f1&quot;&gt;Файлы и скрипты&lt;/h2&gt;
  &lt;p id=&quot;lP7v&quot;&gt;Исходные файлы можно найти в (&lt;a href=&quot;https://github.com/aldabaeva/blog/tree/main/create-database-tables/sql&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;).&lt;/p&gt;
  &lt;h2 id=&quot;LC3o&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;Pods&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;7YFI&quot;&gt;Битовый индекс — отличный инструмент, но не волшебная палочка. Бери и применяй — но не везде!&lt;/p&gt;
  &lt;p id=&quot;SMx9&quot;&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;w8oH&quot;&gt;P.S. Если что-то не работает или нужен архив в другом формате — напишите мне.&lt;/blockquote&gt;
  &lt;p id=&quot;L1Rc&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;wyTz&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;0zOI&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram &lt;/a&gt;| &lt;a href=&quot;https://aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;EfuR&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;xDlv&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;индексы&quot;&gt;#индексы&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;битовый_индекс&quot;&gt;#битовый_индекс&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:technical_columns</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/technical_columns?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Технические столбцы в таблице</title><published>2025-06-22T08:11:09.670Z</published><updated>2025-06-23T07:30:48.593Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f3/7f/f37fe4cf-207f-4005-8288-32ee4e3283be.png"></media:thumbnail><category term="oracle-database" label="Oracle database"></category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>автоматизация</tt:hashtag><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/39/38/3938e089-7ff0-4e7f-9dd7-d5abd69f1364.png&quot;&gt;Если в вашей БД нет технических столбцов — вы играете на авось.  
Кто создал? Кто удалил? Почему не работает? Где следы?  
Без этих ответов вы не владеете своей системой.</summary><content type="html">
  &lt;figure id=&quot;QbMI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/39/38/3938e089-7ff0-4e7f-9dd7-d5abd69f1364.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;4S83&quot;&gt;Если в вашей БД нет технических столбцов — вы играете на авось.  &lt;br /&gt;&lt;strong&gt;&lt;em&gt;Кто создал? Кто удалил? Почему не работает? Где следы? &lt;/em&gt;&lt;/strong&gt; &lt;br /&gt;&lt;strong&gt;Без этих ответов&lt;/strong&gt; вы не владеете своей системой.&lt;/blockquote&gt;
  &lt;p id=&quot;GYf0&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;m21q&quot;&gt;Что обязательно добавлять в каждую таблицу&lt;/h2&gt;
  &lt;p id=&quot;IjDE&quot;&gt;Минимальный набор &amp;quot;технической гигиены&amp;quot;:&lt;/p&gt;
  &lt;ol id=&quot;4odo&quot;&gt;
    &lt;li id=&quot;RSa6&quot;&gt;&lt;strong&gt;created_at, created_by &lt;/strong&gt;— кто и когда создал&lt;/li&gt;
    &lt;li id=&quot;GxfZ&quot;&gt;&lt;strong&gt;modified_at, modified_by&lt;/strong&gt; — кто и когда менял&lt;/li&gt;
    &lt;li id=&quot;AIuk&quot;&gt;&lt;strong&gt;deleted / is_active&lt;/strong&gt; — флаг логического удаления&lt;/li&gt;
    &lt;li id=&quot;dW0w&quot;&gt;&lt;strong&gt;deleted_at, deleted_by&lt;/strong&gt; — когда и кем удалено&lt;/li&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;2BRk&quot;&gt;&lt;em&gt;Именовать столбцы вы можете по-другому, главное - название предавало назначение столбца&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;bSTv&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;EWm9&quot;&gt;Как это выглядит в SQL&lt;/h2&gt;
  &lt;pre id=&quot;N5Vo&quot; data-lang=&quot;sql&quot;&gt;— Таблица клиентов
CREATE TABLE demo_customers (
  customer_id   NUMBER PRIMARY KEY,
  name          VARCHAR2(100),
  region        VARCHAR2(50),
  created_at    DATE DEFAULT SYSDATE,
  created_by    NUMBER,
  modified_at   DATE,
  modified_by   NUMBER,
  is_active     CHAR(1) DEFAULT &amp;#x27;Y&amp;#x27; CHECK (is_active IN (&amp;#x27;Y&amp;#x27;, &amp;#x27;N&amp;#x27;)),
  deleted_at    DATE,
  deleted_by    NUMBER
);&lt;/pre&gt;
  &lt;p id=&quot;Z6Xc&quot;&gt;Тот же принцип работает и для продуктов (&amp;quot;demo_products&amp;quot;), и для заказов (&amp;quot;demo_orders&amp;quot;). Всё в &lt;a href=&quot;https://github.com/aldabaeva/blog/blob/main/create-database-tables/sql/02_create_tables.sql&quot; target=&quot;_blank&quot;&gt;исходниках на GitHub&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;8IME&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;VlS8&quot;&gt;А теперь по пунктам: что это вам даёт&lt;/h2&gt;
  &lt;h3 id=&quot;oUEC&quot;&gt;1. Безопасность&lt;/h3&gt;
  &lt;p id=&quot;lhUq&quot;&gt;&lt;strong&gt;Удалённое — не значит потерянное!&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;qJKY&quot;&gt;В &amp;quot;demo_orders&amp;quot; заказ с &amp;quot;is_active = &amp;#x27;N&amp;#x27;&amp;quot; — всё ещё в базе.&lt;/p&gt;
  &lt;p id=&quot;6hN8&quot;&gt;Ничего не теряется: просто исключается из бизнес-логики.&lt;/p&gt;
  &lt;p id=&quot;ACUs&quot;&gt;&lt;strong&gt;Пример: Клиент потребовал восстановить заказ — не проблема&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;hQvY&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt; &lt;/p&gt;
  &lt;pre id=&quot;Fmm8&quot; data-lang=&quot;sql&quot;&gt;UPDATE demo_orders 
   SET is_active = &amp;#x27;Y&amp;#x27; 
 WHERE order_id = 101;&lt;/pre&gt;
  &lt;p id=&quot;cPLR&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;PyZc&quot;&gt;2. Аудит&lt;/h3&gt;
  &lt;p id=&quot;Wefd&quot;&gt;&lt;strong&gt;Кто и что сделал — теперь прозрачно&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;mpdr&quot;&gt;Благодаря &amp;quot;&lt;strong&gt;modified_by&lt;/strong&gt;&amp;quot;, &amp;quot;&lt;strong&gt;deleted_by&lt;/strong&gt;&amp;quot;, &amp;quot;&lt;strong&gt;created_by&lt;/strong&gt;&amp;quot; можно точно сказать, кто тронул запись и когда.&lt;/p&gt;
  &lt;p id=&quot;uDz8&quot;&gt;&lt;strong&gt;Пример: &lt;/strong&gt;Заказ удалён вчера в 14:52?&lt;/p&gt;
  &lt;p id=&quot;mAoT&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;W8oB&quot;&gt;Смотрим &amp;quot;deleted_by = 204&amp;quot;&lt;/blockquote&gt;
  &lt;blockquote id=&quot;sKUm&quot;&gt;204 — это оператор, уволенный вчера. Совпадение? Не думаем.&lt;/blockquote&gt;
  &lt;p id=&quot;Wr4r&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;HZUo&quot;&gt;&lt;strong&gt;3. Диагностика&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;t8Hh&quot;&gt;&lt;strong&gt;Сломалось? Быстрее поймёте где&lt;/strong&gt;&lt;br /&gt;Ищем последние изменения по &amp;quot;&lt;strong&gt;modified_at&lt;/strong&gt;&amp;quot;, анализируем ошибки.&lt;/p&gt;
  &lt;p id=&quot;WlgB&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; Вдруг перестали работать скидки по регионам.  &lt;/p&gt;
  &lt;p id=&quot;eQiy&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;cJeF&quot;&gt;Фильтруем &amp;quot;&lt;strong&gt;demo_products&lt;/strong&gt;&amp;quot; по &amp;quot;&lt;strong&gt;modified_at DESC&amp;quot;&lt;/strong&gt; — видим, кто внёс правку и в какой категории.&lt;/blockquote&gt;
  &lt;p id=&quot;4AWU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;hj97&quot;&gt;&lt;strong&gt;4. Откат&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;fnYu&quot;&gt;&lt;strong&gt;Данные остаются, откат возможен&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;0phV&quot;&gt;Пропала запись? А она просто &amp;quot;&lt;strong&gt;is_active = &amp;#x27;N&amp;#x27;&lt;/strong&gt;&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;Ba38&quot;&gt;&lt;strong&gt;Пример: &lt;/strong&gt;Восстановление удалённого клиента&lt;/p&gt;
  &lt;p id=&quot;er1B&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;jCOm&quot;&gt;UPDATE demo_customers 
   SET is_active = &amp;#x27;Y&amp;#x27;
     , deleted_at = NULL
     , deleted_by = NULL 
 WHERE customer_id = 5;&lt;/pre&gt;
  &lt;p id=&quot;SBvW&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;DD0R&quot;&gt;5. Соответствие регламентам&lt;/h3&gt;
  &lt;p id=&quot;fd8O&quot;&gt;&lt;strong&gt;Особенно важно в B2B и финтехе&lt;/strong&gt;&lt;br /&gt;Контроль версий, история изменений, soft delete — это не пожелание, а требование политики безопасности и аудита.&lt;/p&gt;
  &lt;p id=&quot;eWqQ&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; При проверке аудитором система обязана показать, кто создавал и редактировал ключевые данные (например, клиентов или заказы).&lt;/p&gt;
  &lt;p id=&quot;Hp34&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;GPlP&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;BIzu&quot;&gt;&lt;strong&gt;Технические поля — это не «для галочки». &lt;br /&gt;Это фундамент стабильности вашей БД.  &lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;B9yo&quot;&gt;
    &lt;li id=&quot;Ypp0&quot;&gt;&lt;em&gt;Что это вам даёт?&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;LjIC&quot;&gt;Логи в БД — это ваша &amp;quot;черная коробка&amp;quot;  &lt;/li&gt;
    &lt;li id=&quot;t3yA&quot;&gt;Удобство в отладке и расследованиях  &lt;/li&gt;
    &lt;li id=&quot;HL0H&quot;&gt;Простота при написании триггеров и аналитики  &lt;/li&gt;
    &lt;li id=&quot;sLiQ&quot;&gt;Меньше ручной работы, если всё автоматизировать&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;BQoY&quot;&gt;Даже если сейчас всё «маленькое и простое» — через полгода вы скажете себе спасибо, что добавили эти поля.&lt;/p&gt;
  &lt;p id=&quot;3jGy&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;aQ5h&quot;&gt;Файлы и скрипты&lt;/h2&gt;
  &lt;p id=&quot;Z4BZ&quot;&gt;Исходные файлы можно найти в &lt;a href=&quot;https://github.com/aldabaeva/blog/tree/main/create-database-tables/sql/users&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;owni&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;6inF&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;T3nq&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Jkz9&quot;&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;nodB&quot;&gt;P.S. Не усложняйте себе жизнь — добавьте пару колонок, и пусть база работает на вас, а не наоборот 😉&lt;/blockquote&gt;
  &lt;p id=&quot;NVSv&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;pMUe&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;автоматизация&quot;&gt;#автоматизация&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:2XrCjwEKU5d</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/2XrCjwEKU5d?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>5 способов посмотреть план выполнения запроса в Oracle SQL</title><published>2025-06-14T13:57:08.261Z</published><updated>2025-06-23T07:31:05.357Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f5/94/f594d588-2971-4467-96f3-ac737b695d39.png"></media:thumbnail><tt:hashtag>oracle</tt:hashtag><tt:hashtag>оптимизация</tt:hashtag><tt:hashtag>explain_plan</tt:hashtag><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/5c/a7/5ca79f86-4917-4680-9ecc-c2515bd4ba79.png&quot;&gt;План выполнения показывает, как Oracle обрабатывает SQL-запрос: какие индексы использует, в каком порядке соединяет таблицы, как фильтрует данные. Понимание плана — ключ к оптимизации запросов и устранению узких мест.</summary><content type="html">
  &lt;figure id=&quot;EuKf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5c/a7/5ca79f86-4917-4680-9ecc-c2515bd4ba79.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;mVLz&quot;&gt;Зачем анализировать план выполнения&lt;/h2&gt;
  &lt;p id=&quot;E3Nc&quot;&gt;План выполнения показывает, &lt;strong&gt;как Oracle обрабатывает SQL-запрос&lt;/strong&gt;: какие индексы использует, в каком порядке соединяет таблицы, как фильтрует данные. Понимание плана — ключ к оптимизации запросов и устранению узких мест.&lt;/p&gt;
  &lt;p id=&quot;F3yR&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;9dzA&quot;&gt;5 способов&lt;/h2&gt;
  &lt;h3 id=&quot;27aR&quot;&gt;1. EXPLAIN PLAN&lt;/h3&gt;
  &lt;p id=&quot;DEct&quot;&gt;Предсказывает план выполнения запроса. Не исполняет сам запрос.&lt;/p&gt;
  &lt;p id=&quot;MpTg&quot;&gt;Как использовать:&lt;/p&gt;
  &lt;pre id=&quot;TcV9&quot; data-lang=&quot;sql&quot;&gt;
EXPLAIN PLAN FOR 
SELECT * FROM demo_products WHERE NAME LIKE &amp;#x27;Товар%&amp;#x27;; 

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
&lt;/pre&gt;
  &lt;p id=&quot;MtSa&quot;&gt;Когда применять: Для предварительного анализа до запуска запроса.&lt;/p&gt;
  &lt;p id=&quot;AQmQ&quot;&gt;Отличие: Это &lt;strong&gt;план по предположению Optimizer&lt;/strong&gt;, без выполнения.&lt;/p&gt;
  &lt;figure id=&quot;MujK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/b0/0db012d8-e36a-43c6-b542-9ac3c5e1ec1d.png&quot; width=&quot;549&quot; /&gt;
    &lt;figcaption&gt;EXPLAIN PLAN&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fH6O&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;eitE&quot;&gt;2. UTOTRACE&lt;br /&gt;&lt;/h3&gt;
  &lt;p id=&quot;qjHa&quot;&gt;Автоматически выполняет запрос и сразу показывает план и статистику.&lt;/p&gt;
  &lt;p id=&quot;mbm0&quot;&gt;Как использовать:&lt;/p&gt;
  &lt;pre id=&quot;3fni&quot; data-lang=&quot;sql&quot;&gt;
SET AUTOTRACE ON 
SELECT * FROM demo_products WHERE NAME LIKE &amp;#x27;Товар%&amp;#x27;; 
&lt;/pre&gt;
  &lt;p id=&quot;adgr&quot;&gt;Инструменты: SQL*Plus, SQLcl, SQL Developer.&lt;/p&gt;
  &lt;p id=&quot;rwbC&quot;&gt;Преимущество: Быстро даёт общую картину — план и фактические затраты.&lt;/p&gt;
  &lt;p id=&quot;SvBI&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;4Pje&quot;&gt;3. DBMS_XPLAN.DISPLAY&lt;/h3&gt;
  &lt;p id=&quot;p3A0&quot;&gt;Что делает: Форматирует содержимое PLAN_TABLE.&lt;/p&gt;
  &lt;p id=&quot;haBN&quot;&gt;Как использовать:&lt;/p&gt;
  &lt;pre id=&quot;0mGJ&quot; data-lang=&quot;sql&quot;&gt;EXPLAIN PLAN FOR 
SELECT * FROM demo_orders WHERE REGION = &amp;#x27;Европа&amp;#x27;; 
 
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
&lt;/pre&gt;
  &lt;p id=&quot;1y8X&quot;&gt;Плюс: Используется совместно с EXPLAIN PLAN, но даёт &lt;strong&gt;удобный читаемый вывод.&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;C3Oi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/42/47/42476fcc-abc7-4ec5-88de-458ad8627a8a.png&quot; width=&quot;403&quot; /&gt;
    &lt;figcaption&gt;DBMS_XPLAN&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MBYK&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Lrau&quot;&gt;4. Real-Time SQL Monitoring&lt;/h3&gt;
  &lt;p id=&quot;HZlb&quot;&gt;Показывает фактический ход выполнения &amp;quot;тяжёлых&amp;quot; запросов.&lt;/p&gt;
  &lt;p id=&quot;ZnXA&quot;&gt;Условия: По умолчанию активируется при &amp;gt;5 сек выполнения или PARALLEL запросах.&lt;/p&gt;
  &lt;p id=&quot;bhZo&quot;&gt;Как использовать:&lt;/p&gt;
  &lt;pre id=&quot;aoVs&quot; data-lang=&quot;sql&quot;&gt;-- Получить активные запросы 
SELECT * FROM V$SQL_MONITOR; 

-- Посмотреть подробности 
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id =&amp;gt; &amp;#x27;...&amp;#x27;, type =&amp;gt; &amp;#x27;TEXT&amp;#x27;) 
FROM DUAL;&lt;/pre&gt;
  &lt;p id=&quot;pnIl&quot;&gt;Плюс: Подходит для анализа долгих или зависающих запросов.&lt;/p&gt;
  &lt;p id=&quot;vPZR&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;SYP2&quot;&gt;5. SQL Trace + TKPROF&lt;/h3&gt;
  &lt;p id=&quot;kE7Q&quot;&gt;Трассирует каждый шаг выполнения SQL, фиксирует затраты, вызовы, ожидания.&lt;/p&gt;
  &lt;p id=&quot;58iG&quot;&gt;Как использовать:&lt;/p&gt;
  &lt;pre id=&quot;BILo&quot; data-lang=&quot;sql&quot;&gt;ALTER SESSION SET SQL_TRACE = TRUE; 

-- выполнить нужный запрос 
ALTER SESSION SET SQL_TRACE = FALSE;

-- затем обработать трейс-файл через TKPROF&lt;/pre&gt;
  &lt;p id=&quot;6rXO&quot;&gt;Когда использовать: Для глубокой отладки, особенно при сложных сценариях.&lt;/p&gt;
  &lt;p id=&quot;wEc0&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;5Rkd&quot;&gt;Сравнения способов просмотра плана выполнения запроса в Oracle SQL&lt;/h2&gt;
  &lt;figure id=&quot;gel3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/3e/593e1176-1919-4976-be9e-417335eefd93.png&quot; width=&quot;991&quot; /&gt;
    &lt;figcaption&gt;Сравнения способов просмотра плана выполнения запроса в Oracle SQL&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;09c4&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;z4it&quot;&gt;Полезные ссылки&lt;/h2&gt;
  &lt;ol id=&quot;yGUC&quot;&gt;
    &lt;li id=&quot;CZSc&quot;&gt;Oracle® Database SQL Tuning Guide (&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/index.html&quot; target=&quot;_blank&quot;&gt;перейти&lt;/a&gt;)&lt;/li&gt;
    &lt;li id=&quot;48Gl&quot;&gt;DBMS_XPLAN Package перейти (&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XPLAN.html&quot; target=&quot;_blank&quot;&gt;перейти&lt;/a&gt;)&lt;/li&gt;
    &lt;li id=&quot;1WPV&quot;&gt;Технические столбцы в БД&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;IbIn&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Y1sX&quot;&gt;Файлы и скрипты&lt;/h2&gt;
  &lt;p id=&quot;W5kH&quot;&gt;Исходные файлы можно найти в &lt;a href=&quot;https://m.dzen.ru/away?to=https%3A%2F%2Fgithub.com%2Faldabaeva%2Fblog%2Ftree%2Fmain%2Fcreate-database-tables%2Fsql%2Fusers&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;CUO4&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;UEBS&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;79KX&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;u2pH&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;qhgl&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;оптимизация&quot;&gt;#оптимизация&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;explain_plan&quot;&gt;#explain_plan&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:Vyx0qV70nLv</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/Vyx0qV70nLv?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Ведем учет пользователей: от таблицы до аудита</title><published>2025-06-14T11:22:54.271Z</published><updated>2025-06-23T07:31:19.252Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1c/74/1c741bff-f0e3-4ccf-9518-14b086e9d6d4.png"></media:thumbnail><category term="oracle-database" label="Oracle database"></category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>автоматизация</tt:hashtag><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/93/b9/93b919e8-4aea-4cbc-94e8-8a775d121999.png&quot;&gt;Хранить пользователей в БД — это не просто привычка, а часть архитектуры. Централизованный учет помогает:</summary><content type="html">
  &lt;figure id=&quot;RV8D&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/93/b9/93b919e8-4aea-4cbc-94e8-8a775d121999.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;o4R9&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;rEV2&quot;&gt;Хранить пользователей в БД — это не просто привычка, а часть архитектуры. Централизованный учет помогает:&lt;/p&gt;
  &lt;ul id=&quot;wASA&quot;&gt;
    &lt;li id=&quot;vydK&quot;&gt;обеспечить уникальность логинов,&lt;/li&gt;
    &lt;li id=&quot;btf4&quot;&gt;отследить изменения,&lt;/li&gt;
    &lt;li id=&quot;RbDG&quot;&gt;стандартизировать работу с пользователями для всех приложений и скриптов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;uTqK&quot;&gt;Покажу, как грамотно реализовать это на Oracle SQL с проверкой, обработкой ошибок и аудитом.&lt;/p&gt;
  &lt;p id=&quot;hTjK&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;iM3h&quot;&gt;Таблица users: структура и ограничения&lt;/h2&gt;
  &lt;figure id=&quot;0Oh2&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/0f/ab0f5530-bd0a-4517-a3da-10ae5957a3cd.png&quot; width=&quot;182&quot; /&gt;
    &lt;figcaption&gt;Структура таблицы&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cfQJ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;yGgc&quot;&gt;Скрипт создания таблицы&lt;/h3&gt;
  &lt;pre id=&quot;tH5H&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE users (
    userid     NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    LOGIN      VARCHAR2(100) NOT NULL UNIQUE,
    created_at DATE DEFAULT SYSDATE,
    CONSTRAINT login_min_length CHECK (LENGTH(login) &amp;gt;= 3)
);
-- Add comments to the table
comment on table USERS is &amp;#x27;Таблицы пользователей&amp;#x27;;
  
-- Add comments to the columns
comment on column USERS.userid     is &amp;#x27;Идентификатор пользователя&amp;#x27;;
comment on column USERS.login      is &amp;#x27;Логин пользователя&amp;#x27;;
comment on column USERS.created_at is &amp;#x27;Дата создания пользователя&amp;#x27;;&lt;/pre&gt;
  &lt;p id=&quot;TLqN&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Nhyg&quot;&gt;Функция получения id пользователя&lt;/h3&gt;
  &lt;pre id=&quot;90uB&quot; data-lang=&quot;sql&quot;&gt;CREATE OR REPLACE FUNCTION f_get_user_id(p_login IN VARCHAR2)
	RETURN NUMBER IS
	v_user_id        NUMBER;
	e_user_not_found EXCEPTION;
	PRAGMA EXCEPTION_INIT(e_user_not_found, -20001);
BEGIN
	-- Проверка на NULL
	IF p_login IS NULL THEN
		RAISE_APPLICATION_ERROR(-20002, &amp;#x27;Логин не может быть NULL&amp;#x27;);
	END IF;

	-- Проверка на минимальную длину
	IF LENGTH(p_login) &amp;lt; 3 THEN
		RAISE_APPLICATION_ERROR(-20003, &amp;#x27;Логин должен содержать минимум 3 символа&amp;#x27;);
	END IF;

	-- Поиск пользователя
	BEGIN
		SELECT userid INTO v_user_id FROM users WHERE login = p_login;

		RETURN v_user_id;

	EXCEPTION
		WHEN NO_DATA_FOUND THEN
			RAISE e_user_not_found;
		WHEN TOO_MANY_ROWS THEN
			RAISE_APPLICATION_ERROR(-20004, &amp;#x27;Найдено несколько пользователей с таким логином&amp;#x27;);
	END;

EXCEPTION
	WHEN e_user_not_found THEN
		RAISE_APPLICATION_ERROR(-20001, &amp;#x27;Пользователь с логином &amp;#x27; || p_login || &amp;#x27; не найден&amp;#x27;);
	WHEN OTHERS THEN
		RAISE_APPLICATION_ERROR(-20000, &amp;#x27;Ошибка при получении ID пользователя: &amp;#x27; || SQLERRM);
END f_get_user_id;
&lt;/pre&gt;
  &lt;p id=&quot;tslv&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;WkY0&quot;&gt;Что делает:&lt;/p&gt;
  &lt;ul id=&quot;niCQ&quot;&gt;
    &lt;li id=&quot;oNMQ&quot;&gt;Проверяет вход: если &lt;code&gt;NULL&lt;/code&gt; или пусто — выбрасывает исключение &lt;code&gt;user_login_missing&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;D4wZ&quot;&gt;Если логин не найден — ошибка &lt;code&gt;user_not_found&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;PoLb&quot;&gt;Если найдено более одной записи (в теории) — ошибка &lt;code&gt;user_login_not_unique&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8QgW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Xqtl&quot;&gt;Пример вызова функции:&lt;/p&gt;
  &lt;pre id=&quot;mMzX&quot; data-lang=&quot;sql&quot;&gt;BEGIN                                                  
	DBMS_OUTPUT.PUT_LINE(f_get_user_id(&amp;#x27;admin&amp;#x27;));      
EXCEPTION                            
	WHEN OTHERS THEN      	
		DBMS_OUTPUT.PUT_LINE(&amp;#x27;Ошибка: &amp;#x27; || SQLERRM);	
END;&lt;/pre&gt;
  &lt;p id=&quot;OIUq&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;by5h&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/eb/a3/eba3017d-f362-4618-8518-1c290762b8b9.png&quot; width=&quot;470&quot; /&gt;
    &lt;figcaption&gt;Результат вызова функции f_get_user_id&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mntj&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;aQ5h&quot;&gt;Файлы и скрипты&lt;/h2&gt;
  &lt;p id=&quot;Z4BZ&quot;&gt;Исходные файлы можно найти в &lt;a href=&quot;https://github.com/aldabaeva/blog/tree/main/create-database-tables/sql/users&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;zelV&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;xshZ&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;AiLF&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;OmaY&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;2Z6l&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;автоматизация&quot;&gt;#автоматизация&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:iJiSwqs5GhR</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/iJiSwqs5GhR?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Оптимизация в Oracle. Коротко и по делу</title><published>2025-06-14T08:03:03.049Z</published><updated>2025-06-23T07:32:50.495Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e2/53/e2536ee4-0550-4732-b72f-0f038acdf0bb.png"></media:thumbnail><category term="oracle-optimizaciya" label="Oracle. Оптимизация"></category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>оптимизация</tt:hashtag><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/b3/4a/b34a9c55-f6d1-439e-840a-42862b151825.png&quot;&gt;Когда ты только учишься писать SQL — главное, чтобы «работало». А когда работаешь с таблицей в 15+ миллионов строк — важна **оптимизация**.</summary><content type="html">
  &lt;figure id=&quot;xl2E&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b3/4a/b34a9c55-f6d1-439e-840a-42862b151825.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iEkI&quot;&gt;Когда ты только учишься писать SQL — главное, чтобы «работало». А когда работаешь с таблицей в 15+ миллионов строк — важна **оптимизация**.&lt;/p&gt;
  &lt;p id=&quot;Q2SP&quot;&gt;Я когда-то обрабатывала по 300 строк в час.&lt;br /&gt;После оптимизации — 150 000+ за это же время.&lt;/p&gt;
  &lt;p id=&quot;CXYE&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;y90I&quot;&gt;Вот, что реально помогает:&lt;/p&gt;
  &lt;ol id=&quot;ZBQZ&quot;&gt;
    &lt;li id=&quot;RlK3&quot;&gt;Используй индексы (и проверь, что Oracle их применяет)&lt;/li&gt;
    &lt;li id=&quot;E2xr&quot;&gt;Не делай SELECT * — выбирай только нужные поля&lt;/li&gt;
    &lt;li id=&quot;kfsg&quot;&gt;Используй &amp;#x60;BULK COLLECT&amp;#x60; и &amp;#x60;FORALL&amp;#x60; в PL/SQL&lt;/li&gt;
    &lt;li id=&quot;RS0M&quot;&gt;Следи за &amp;#x60;execution plan&amp;#x60; (можно в SQL Developer)&lt;/li&gt;
    &lt;li id=&quot;zhgK&quot;&gt;Избегай вложенных подзапросов без нужды&lt;/li&gt;
    &lt;li id=&quot;Yvn2&quot;&gt;Следи за типами данных — не сравнивай строку с числом&lt;/li&gt;
    &lt;li id=&quot;PnHo&quot;&gt;Разбивай большие запросы на части (временные таблицы / WITH)&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;xkYk&quot;&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;dTzf&quot;&gt;Oracle — это мощно. Но только если ты умеешь использовать его грамотно.&lt;/blockquote&gt;
  &lt;p id=&quot;m97c&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;puSX&quot;&gt;Расскажу в следующих постах, как проверять план выполнения и индекс влияет ли вообще на что-то 💡&lt;/p&gt;
  &lt;p id=&quot;1YZm&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;seyX&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;d38V&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;OBCf&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;nm7W&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;оптимизация&quot;&gt;#оптимизация&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:LOqUbsHQc7O</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/LOqUbsHQc7O?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Отличие PIPELINED функций и TYPE в Oracle PL/SQL</title><published>2025-06-07T14:18:17.455Z</published><updated>2025-06-23T07:33:23.797Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/db/a9/dba9bdce-65cd-46cd-ace1-0936f1e138da.png"></media:thumbnail><category term="oracle-database" label="Oracle database"></category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>type</tt:hashtag><tt:hashtag>pipelined</tt:hashtag><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/c2/6f/c26f33e9-863b-4ec8-b473-73ec4868c4ee.png&quot;&gt;'TYPE' в Oracle — это способ определить собственные типы данных.</summary><content type="html">
  &lt;figure id=&quot;hIJu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c2/6f/c26f33e9-863b-4ec8-b473-73ec4868c4ee.png&quot; width=&quot;1876&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;fMFJ&quot;&gt;Что такое &amp;#x27;TYPE&amp;#x27;?&lt;/h2&gt;
  &lt;p id=&quot;5Z9p&quot;&gt;&amp;#x27;TYPE&amp;#x27; в Oracle — это способ определить собственные типы данных.&lt;/p&gt;
  &lt;p id=&quot;qF3C&quot;&gt;Чаще всего используется:&lt;/p&gt;
  &lt;ol id=&quot;JC8d&quot;&gt;
    &lt;li id=&quot;o2HB&quot;&gt;для создания PL/SQL-коллекций (таблиц/массивов),&lt;/li&gt;
    &lt;li id=&quot;1vXI&quot;&gt;объектов, если нужно работать со структурированными данными,&lt;/li&gt;
    &lt;li id=&quot;hcnK&quot;&gt;в pipelined-функциях — как возвращаемое значение.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;lTpX&quot;&gt;Пример:&lt;/p&gt;
  &lt;pre id=&quot;6EfI&quot;&gt;-- Объявляем тип таблицы
CREATE OR REPLACE TYPE t_num_tab AS TABLE OF NUMBER;&lt;/pre&gt;
  &lt;p id=&quot;CI66&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;PIA8&quot;&gt;Что такое PIPELINED FUNCTION?&lt;/h2&gt;
  &lt;p id=&quot;ihqd&quot;&gt;PIPELINED-функции позволяют возвращать набор данных построчно, как будто это обычная таблица, и использовать их напрямую в SQL-запросах. Выглядят как обычные функции, но с ключевым словом PIPELINED.&lt;/p&gt;
  &lt;p id=&quot;8AN3&quot;&gt;Это очень мощный инструмент, если:&lt;/p&gt;
  &lt;ol id=&quot;HdBx&quot;&gt;
    &lt;li id=&quot;JGel&quot;&gt;1нужно возвращать коллекции в SQL-стиле,&lt;/li&gt;
    &lt;li id=&quot;2PiK&quot;&gt;вы обрабатываете много данных в PL/SQL, но хотите использовать SQL-join/where/group by и т.д.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;jmWi&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;0N4F&quot;&gt;Пример: TYPE + PIPELINED FUNCTION&lt;/h3&gt;
  &lt;p id=&quot;KT6q&quot;&gt;1) Создаём тип строки и таблицы:&lt;/p&gt;
  &lt;pre id=&quot;zlle&quot;&gt;CREATE OR REPLACE TYPE emp_row_type AS OBJECT
(
  emp_name   VARCHAR2(100),
  emp_salary NUMBER
);
/  

CREATE OR REPLACE TYPE emp_table_type AS TABLE OF emp_row_type; 
/&lt;/pre&gt;
  &lt;p id=&quot;9niF&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9mUO&quot;&gt;2) Создаём PIPELINED-функцию:&lt;/p&gt;
  &lt;pre id=&quot;NNa2&quot;&gt;CREATE OR REPLACE FUNCTION get_employees
  RETURN emp_table_type
  PIPELINED
AS
BEGIN
  PIPE ROW(emp_row_type(&amp;#x27;Alice&amp;#x27;, 5000));
  PIPE ROW(emp_row_type(&amp;#x27;Bob&amp;#x27;, 7000));
  PIPE ROW(emp_row_type(&amp;#x27;Charlie&amp;#x27;, 6000));
  RETURN;
END;
/&lt;/pre&gt;
  &lt;p id=&quot;6MD2&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FBfy&quot;&gt;3) Вызываем как таблицу:&lt;/p&gt;
  &lt;pre id=&quot;PaKR&quot;&gt;SELECT * FROM TABLE(get_employees);&lt;/pre&gt;
  &lt;p id=&quot;DIIg&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Lvtq&quot;&gt;В результате получаем следующее:&lt;/p&gt;
  &lt;figure id=&quot;AkDo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/06/38/0638a8a1-10a5-40d1-b0d6-f3e754beebc3.png&quot; width=&quot;207&quot; /&gt;
    &lt;figcaption&gt;Результат выполнения SQL-запроса&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b0Pq&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yhd0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/e1/27e1f50a-dd12-4c07-988d-5007b8619ae2.png&quot; width=&quot;732&quot; /&gt;
    &lt;figcaption&gt;Главные отличия&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Rc8u&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;HeCk&quot;&gt;&lt;strong&gt;Важные особенности &lt;code&gt;PIPELINED FUNCTION&lt;/code&gt;&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;F1K3&quot;&gt;
    &lt;li id=&quot;sLxY&quot;&gt;&lt;strong&gt;Возвращает строки по одной&lt;/strong&gt; — удобно для обработки больших объемов данных.&lt;/li&gt;
    &lt;li id=&quot;6Emk&quot;&gt;&lt;strong&gt;Работает как виртуальная таблица&lt;/strong&gt; — можно использовать в &lt;code&gt;SELECT * FROM TABLE(...)&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;WRhc&quot;&gt;&lt;strong&gt;Ускоряет производительность&lt;/strong&gt; — результат не хранится целиком в памяти, строки «передаются по трубе».&lt;/li&gt;
    &lt;li id=&quot;BqJL&quot;&gt;&lt;strong&gt;Обязателен возврат типа (RETURN TABLE OF …)&lt;/strong&gt; — заранее объявленный &lt;code&gt;TYPE&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;Rxq7&quot;&gt;&lt;strong&gt;Поддерживает &lt;code&gt;PARALLEL_ENABLE&lt;/code&gt;&lt;/strong&gt; — можно распараллеливать выполнение.&lt;/li&gt;
    &lt;li id=&quot;628S&quot;&gt;&lt;strong&gt;Можно использовать в представлениях и APEX&lt;/strong&gt; — как источник данных.&lt;/li&gt;
    &lt;li id=&quot;SAwm&quot;&gt;&lt;strong&gt;Хорошо подходит для оборачивания курсоров&lt;/strong&gt; — &lt;code&gt;CURSOR → PIPE ROW&lt;/code&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;j0mR&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;mKeh&quot;&gt;&lt;strong&gt;Важные особенности &lt;code&gt;TYPE&lt;/code&gt;&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;ezAi&quot;&gt;
    &lt;li id=&quot;k1Su&quot;&gt;&lt;strong&gt;Создает пользовательские типы данных&lt;/strong&gt; — объекты (&lt;code&gt;OBJECT TYPE&lt;/code&gt;) и коллекции (&lt;code&gt;TABLE OF OBJECT&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;Wy1K&quot;&gt;&lt;strong&gt;Может использоваться в SQL и PL/SQL&lt;/strong&gt; — как в теле запроса, так и для переменных.&lt;/li&gt;
    &lt;li id=&quot;hdvt&quot;&gt;&lt;strong&gt;Бывает в памяти (&lt;code&gt;PL/SQL TYPE&lt;/code&gt;) и в БД (&lt;code&gt;CREATE TYPE&lt;/code&gt;)&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;3vF5&quot;&gt;
      &lt;li id=&quot;iLHD&quot;&gt;PL/SQL типы — только внутри блоков, не видны из SQL.&lt;/li&gt;
      &lt;li id=&quot;XxdJ&quot;&gt;SQL типы — можно использовать в таблицах, функциях и т.д.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;5qfb&quot;&gt;&lt;strong&gt;Незаменим для &lt;code&gt;PIPELINED&lt;/code&gt; функций&lt;/strong&gt; — обязательно описывать структуру возвращаемых данных.&lt;/li&gt;
    &lt;li id=&quot;dr6q&quot;&gt;&lt;strong&gt;Работает с BULK COLLECT и FORALL&lt;/strong&gt; — помогает ускорять массовые операции.&lt;/li&gt;
    &lt;li id=&quot;gMi5&quot;&gt;&lt;strong&gt;Можно использовать в параметрах процедур/функций&lt;/strong&gt; — передавать таблицы значений.&lt;/li&gt;
    &lt;li id=&quot;JhIM&quot;&gt;&lt;strong&gt;Совместим с JSON/XML генерацией&lt;/strong&gt; — часто используется в Web API.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Ttzt&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;NoBr&quot;&gt;🧙‍♂️ Если хочешь прокачать навыки до гуру — этот раздел для тебя:&lt;/p&gt;
  &lt;h3 id=&quot;bmOg&quot;&gt;1. &lt;code&gt;PIPELINED FUNCTION + CURSOR&lt;/code&gt;&lt;/h3&gt;
  &lt;ul id=&quot;YJ1S&quot;&gt;
    &lt;li id=&quot;0jhD&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Используется, когда нужно &amp;quot;развернуть&amp;quot; данные из курсора в таблицу.&lt;/li&gt;
    &lt;li id=&quot;bhqR&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;rZIn&quot;&gt;	FOR rec IN (SELECT * FROM emp) LOOP
		PIPE ROW(emp_row_type(rec.ename, rec.sal));
	END LOOP;&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;Q1Fa&quot;&gt;🔹 2. &lt;code&gt;PIPELINED FUNCTION + PIPELINED FUNCTION&lt;/code&gt;&lt;/h3&gt;
  &lt;ul id=&quot;QWh5&quot;&gt;
    &lt;li id=&quot;nea6&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Когда одна pipelined функция вызывает другую (например, постобработка).&lt;/li&gt;
    &lt;li id=&quot;TuHr&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;br /&gt; Внешняя функция вызывает внутреннюю через &lt;code&gt;SELECT * FROM TABLE(...)&lt;/code&gt;, применяя фильтрацию, сортировку и т.д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;dEtJ&quot;&gt;🔹 3. &lt;code&gt;RETURN TYPE&lt;/code&gt; в функциях&lt;/h3&gt;
  &lt;ul id=&quot;L3XB&quot;&gt;
    &lt;li id=&quot;KdiM&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Используется для указания возвращаемого типа — чаще всего &lt;code&gt;TABLE OF OBJECT TYPE&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;rb8v&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;KANj&quot;&gt;RETURN emp_table_type PIPELINED &lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;GJlp&quot;&gt;🔹 4. &lt;code&gt;TYPE&lt;/code&gt; в &lt;code&gt;SELECT&lt;/code&gt;&lt;/h3&gt;
  &lt;ul id=&quot;E14E&quot;&gt;
    &lt;li id=&quot;pCux&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Используется для явного создания объекта &amp;quot;на лету&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;VFIW&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;AGDQ&quot;&gt;SELECT emp_row_type(&amp;#x27;John&amp;#x27;, 5000) FROM DUAL;&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;wKG2&quot;&gt;🔹 5. Использование &lt;code&gt;TYPE&lt;/code&gt; в PL/SQL переменных&lt;/h3&gt;
  &lt;ul id=&quot;M3ud&quot;&gt;
    &lt;li id=&quot;cXm0&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Создание переменных, массивов и структур для промежуточной обработки данных.&lt;/li&gt;
    &lt;li id=&quot;Lytw&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; &lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;TFiu&quot;&gt;v_emp emp_row_type := emp_row_type(&amp;#x27;Alice&amp;#x27;, 4000); &lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;7Uui&quot;&gt;🔹 6. &lt;code&gt;TYPE&lt;/code&gt; как параметр в процедурах / функциях&lt;/h3&gt;
  &lt;ul id=&quot;WT2u&quot;&gt;
    &lt;li id=&quot;rAGn&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Передача таблицы значений как параметра.&lt;/li&gt;
    &lt;li id=&quot;XeyS&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;iiO9&quot;&gt;PROCEDURE process_emps(p_list IN emp_table_type) &lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;PD3T&quot;&gt;🔹 7. &lt;code&gt;TYPE&lt;/code&gt; + JSON/XML&lt;/h3&gt;
  &lt;ul id=&quot;Cz2T&quot;&gt;
    &lt;li id=&quot;RcNh&quot;&gt;&lt;strong&gt;Сценарий:&lt;/strong&gt; Преобразование объектного типа в JSON или XML для API-интеграций.&lt;/li&gt;
    &lt;li id=&quot;s86v&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;5Fgo&quot;&gt;SELECT JSON_OBJECT(emp_name, emp_salary) FROM TABLE(get_employees());&lt;/pre&gt;
  &lt;p id=&quot;JsXd&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;moHF&quot;&gt;Полезные ссылки&lt;/h2&gt;
  &lt;p id=&quot;wSMp&quot;&gt;1. &lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-subprograms.html#GUID-6FFDC003-3B1C-43D1-A1CE-59A8DA47145E&quot; target=&quot;_blank&quot;&gt;Oracle Docs — Pipelined Functions&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;t56O&quot;&gt;2. &lt;a href=&quot;https://livesql.oracle.com/&quot; target=&quot;_blank&quot;&gt;Oracle Live SQL Demo&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;QF4K&quot;&gt;3. &lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-collections-and-records.html&quot; target=&quot;_blank&quot;&gt;Oracle TYPE и COLLECTIONS&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;hT4w&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ZjNU&quot;&gt;Файлы и скрипты&lt;/h2&gt;
  &lt;p id=&quot;KgOA&quot;&gt;Исходные файлы можно найти в &lt;a href=&quot;https://github.com/aldabaeva/blog/tree/main/oracle-pipelined-vs-type&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;GmTp&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;NSM9&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;WwhC&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;KzMO&quot;&gt;&lt;/p&gt;
  &lt;tt-tags id=&quot;bSGj&quot;&gt;
    &lt;tt-tag name=&quot;oracle&quot;&gt;#oracle&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;type&quot;&gt;#type&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;pipelined&quot;&gt;#pipelined&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>apworks:46mpuG3V0gT</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/46mpuG3V0gT?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Hello, world! в Oracle PL/SQL 👋</title><published>2025-05-18T18:18:05.079Z</published><updated>2025-06-23T07:33:12.455Z</updated><summary type="html">Если вы начали изучать Oracle PL/SQL, то, по традиции, первый шаг — это вывести простое сообщение &quot;Hello, world!&quot;. Даже в языках для работы с базами данных хочется сделать этот символичный старт. 😄</summary><content type="html">
  &lt;p id=&quot;4fMM&quot;&gt;Если вы начали изучать &lt;strong&gt;Oracle PL/SQL&lt;/strong&gt;, то, по традиции, первый шаг — это вывести простое сообщение &lt;strong&gt;&amp;quot;Hello, world!&amp;quot;&lt;/strong&gt;. Даже в языках для работы с базами данных хочется сделать этот символичный старт. 😄&lt;/p&gt;
  &lt;p id=&quot;0IsP&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;oPfj&quot;&gt;Что такое PL/SQL?&lt;/h2&gt;
  &lt;p id=&quot;qT4N&quot;&gt;&lt;strong&gt;PL/SQL (Procedural Language/SQL)&lt;/strong&gt; — это процедурное расширение языка SQL, разработанное Oracle. Он позволяет писать:&lt;/p&gt;
  &lt;ul id=&quot;KVQS&quot;&gt;
    &lt;li id=&quot;mx7y&quot;&gt;процедуры,&lt;/li&gt;
    &lt;li id=&quot;nNAd&quot;&gt;функции,&lt;/li&gt;
    &lt;li id=&quot;RLml&quot;&gt;триггеры,&lt;/li&gt;
    &lt;li id=&quot;dz68&quot;&gt;пакеты&lt;/li&gt;
    &lt;li id=&quot;PtsQ&quot;&gt;и даже целые приложения на стороне базы данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;57Js&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;njIa&quot;&gt;Первый пример: &amp;quot;Hello, world!&amp;quot;&lt;/h2&gt;
  &lt;p id=&quot;SRgF&quot;&gt;Пример программы на PL/SQL, которая выведет «Hello, world!» в &lt;strong&gt;DBMS Output&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;m1KJ&quot; data-lang=&quot;sql&quot;&gt;BEGIN
  DBMS_OUTPUT.PUT_LINE(&amp;#x27;Hello, world!&amp;#x27;);
END;&lt;/pre&gt;
  &lt;figure id=&quot;8TXE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/48/e5/48e5fb48-5e1a-4766-928a-67dfce1f8afb.png&quot; width=&quot;632&quot; /&gt;
    &lt;figcaption&gt;Результат выполнения SQL-запроса&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;3SrE&quot;&gt;Как выполнить код?&lt;/h2&gt;
  &lt;h3 id=&quot;50KX&quot;&gt;В &lt;strong&gt;SQL Developer&lt;/strong&gt; или &lt;strong&gt;PL/SQL Developer&lt;/strong&gt;&lt;/h3&gt;
  &lt;ol id=&quot;35mP&quot;&gt;
    &lt;li id=&quot;mASU&quot;&gt;Откройте новое окно SQL.&lt;/li&gt;
    &lt;li id=&quot;I7yB&quot;&gt;Вставьте код.&lt;/li&gt;
    &lt;li id=&quot;KmWw&quot;&gt;Нажмите &amp;quot;Run&amp;quot; или F5.&lt;/li&gt;
    &lt;li id=&quot;Ogeu&quot;&gt;Убедитесь, что &lt;strong&gt;DBMS Output&lt;/strong&gt; включен (кнопка &amp;quot;DBMS Output: On&amp;quot;).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;ToyQ&quot;&gt;В &lt;strong&gt;Oracle APEX&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;pkmz&quot;&gt;
    &lt;li id=&quot;xq2m&quot;&gt;Перейдите в &lt;strong&gt;SQL Workshop → SQL Commands&lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;WdtE&quot;&gt;Вставьте и выполните код.&lt;/li&gt;
    &lt;li id=&quot;3ePh&quot;&gt;Просмотрите вывод в &amp;quot;DBMS Output&amp;quot;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fDjV&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;WLxr&quot;&gt;Что такое &lt;code&gt;DBMS_OUTPUT.PUT_LINE&lt;/code&gt;?&lt;/h2&gt;
  &lt;p id=&quot;3HkN&quot;&gt;Это встроенная процедура Oracle, которая выводит данные в консоль разработчика.&lt;br /&gt;Она используется для отладки, сообщений и тестов.&lt;/p&gt;
  &lt;p id=&quot;yFxq&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Xpbp&quot;&gt;А если с переменными?&lt;/h2&gt;
  &lt;p id=&quot;7UUz&quot;&gt;Можно усложнить немного:&lt;/p&gt;
  &lt;pre id=&quot;hLV5&quot; data-lang=&quot;sql&quot;&gt;DECLARE
  v_message VARCHAR2(100) := &amp;#x27;Hello, world!&amp;#x27;;
BEGIN
  DBMS_OUTPUT.PUT_LINE(v_message);
END;&lt;/pre&gt;
  &lt;figure id=&quot;ASEH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/76/9676f836-940e-4364-a379-814e270ba215.png&quot; width=&quot;623&quot; /&gt;
    &lt;figcaption&gt;Результат выполнения PL/SQL-скрипта&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;55Ht&quot;&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h2 id=&quot;1qHq&quot;&gt;Итого:&lt;/h2&gt;
  &lt;ul id=&quot;Ks2y&quot;&gt;
    &lt;li id=&quot;FisY&quot;&gt;Это базовая конструкция для старта с PL/SQL.&lt;/li&gt;
    &lt;li id=&quot;PiXO&quot;&gt;Очень удобно использовать для отладки.&lt;/li&gt;
    &lt;li id=&quot;b6im&quot;&gt;Убедитесь, что DBMS Output включён — иначе не увидите результат 😉&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;CFF8&quot;&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h2 id=&quot;VDW1&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;Nhqq&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;https://t.me/skiperkrut&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://aldabaeva.com/&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;wC9g&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;n1Su&quot;&gt;💬 Пишите в комментариях, какой язык программирования был у вас первым для “Hello, world!”!&lt;/p&gt;

</content></entry><entry><id>apworks:DWJkLY_9Qip</id><link rel="alternate" type="text/html" href="https://teletype.in/@apworks/DWJkLY_9Qip?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=apworks"></link><title>Hello, world! в Oracle SQL 👋</title><published>2025-05-14T12:27:18.898Z</published><updated>2025-06-14T11:40:40.725Z</updated><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/15/e9/15e9c3d1-e02d-48e5-b3c2-cb954c7f8014.png&quot;&gt;Когда осваиваешь новый язык программирования, первое, что делают — выводят фразу &quot;Hello, world!&quot;.  
А как это сделать в Oracle SQL? Всё просто:</summary><content type="html">
  &lt;p id=&quot;PJmI&quot;&gt;Когда осваиваешь новый язык программирования, первое, что делают — выводят фразу &amp;quot;&lt;strong&gt;&lt;em&gt;Hello, world!&lt;/em&gt;&lt;/strong&gt;&amp;quot;.  &lt;br /&gt;А как это сделать в &lt;strong&gt;Oracle SQL&lt;/strong&gt;? Всё просто:&lt;/p&gt;
  &lt;p id=&quot;0ZaH&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;155T&quot; data-lang=&quot;sql&quot;&gt;SELECT &amp;#x27;Hello, world!&amp;#x27; AS message 
  FROM dual;&lt;/pre&gt;
  &lt;p id=&quot;faWU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;rUqZ&quot;&gt;Что происходит в этом запросе?&lt;br /&gt;🔹 Мы пишем &amp;#x60;SELECT&amp;#x60; и указываем текст в кавычках (одинарных, не в двойных - иначе, будет ошибка).  &lt;br /&gt;🔹 &amp;#x60;AS message&amp;#x60; — задаём имя столбца для результата.  &lt;br /&gt;🔹 &amp;#x60;FROM dual&amp;#x60; — обращаемся к магической таблице &amp;#x60;DUAL&amp;#x60;, о которой я недавно рассказывала.&lt;/p&gt;
  &lt;p id=&quot;IjpL&quot;&gt;&lt;strong&gt;Результат запроса:&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;TUjP&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/15/e9/15e9c3d1-e02d-48e5-b3c2-cb954c7f8014.png&quot; width=&quot;375&quot; /&gt;
    &lt;figcaption&gt;Результат выполнения &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;Q7dq&quot;&gt;Почему нужен &amp;#x60;FROM dual&amp;#x60;?&lt;/h2&gt;
  &lt;p id=&quot;MYcX&quot;&gt;&lt;br /&gt;В Oracle синтаксис требует, чтобы в &amp;#x60;SELECT&amp;#x60; всегда был указан источник данных.  &lt;br /&gt;&lt;strong&gt;DUAL &lt;/strong&gt;— это виртуальная таблица с одной строкой, созданная специально для таких случаев.&lt;/p&gt;
  &lt;p id=&quot;5xXG&quot;&gt;Подробнее о DUAL я рассказывала [&lt;a href=&quot;https://m.dzen.ru/a/aBZc_QaU_wt_fTAh&quot; target=&quot;_blank&quot;&gt;в этом посте&lt;/a&gt;].&lt;/p&gt;
  &lt;p id=&quot;2lMI&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;ut9i&quot;&gt;Полезные ссылки&lt;/h3&gt;
  &lt;p id=&quot;9LVS&quot;&gt;- Документация Oracle SQL SELECT(&lt;a href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html&quot; target=&quot;_blank&quot;&gt;читать&lt;/a&gt;)&lt;br /&gt;    &lt;/p&gt;
  &lt;h2 id=&quot;Tway&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;Ch9P&quot;&gt;&lt;br /&gt;Порой даже в профессиональных инструментах всё начинается с простого шага — одной строки кода и &amp;quot;Hello, world!&amp;quot;. 👋  &lt;br /&gt;И это отличный способ почувствовать, что работа с базой данных — это не страшно, а интересно!&lt;/p&gt;
  &lt;p id=&quot;xhvr&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;DTUo&quot;&gt;Контакты&lt;/h2&gt;
  &lt;p id=&quot;YZAT&quot;&gt;&lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Написать автору&lt;/a&gt; | &lt;a href=&quot;mailto:personal@aldabaeva.com&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt; | &lt;a href=&quot;https://m.dzen.ru/away?to=http%3A%2F%2Faldabaeva.com%2F&quot; target=&quot;_blank&quot;&gt;Сайт автора&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;ByHG&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Ojvz&quot;&gt;✨ А вы помните, на каком языке написали свой первый &amp;quot;Hello, world!&amp;quot;? Делитесь в комментариях! 👇&lt;/p&gt;

</content></entry></feed>