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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@apworks/MkRlQIBBeha</guid><link>https://teletype.in/@apworks/MkRlQIBBeha?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks</link><comments>https://teletype.in/@apworks/MkRlQIBBeha?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks#comments</comments><dc:creator>apworks</dc:creator><title>Bitmap индекс в Oracle — когда ускоряет, а когда мешает</title><pubDate>Sun, 06 Jul 2025 12:56:23 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/28/c4/28c4308f-87c0-41f9-8615-f62eee49aa96.png"></media:content><category>Oracle database</category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>индексы</tt:hashtag><tt:hashtag>битовый_индекс</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/8f/c3/8fc3cf59-d244-47b6-843a-8abc11755cd0.png"></img>Битовые индексы — мощный инструмент в Oracle, но работают не везде. В этом посте — просто и по делу: когда их использовать, а когда лучше обойти стороной.]]></description><content:encoded><![CDATA[
  <figure id="uxSE" class="m_column">
    <img src="https://img1.teletype.in/files/8f/c3/8fc3cf59-d244-47b6-843a-8abc11755cd0.png" width="1876" />
  </figure>
  <h2 id="OJ8q">Введение</h2>
  <p id="qxST">Битовые индексы — мощный инструмент в Oracle, но работают не везде. В этом посте — просто и по делу: когда их использовать, а когда лучше обойти стороной.</p>
  <h2 id="6rDm"></h2>
  <h2 id="zxIx">Что такое битовый индекс?</h2>
  <p id="CNVP">В отличие от классического B-tree индекса, который хранит ссылки на строки с конкретными значениями, битовый индекс использует битовые карты: для каждого уникального значения создаётся &quot;битовая маска&quot;, где каждая строка таблицы — это позиция (бит). Один бит = одна строка.</p>
  <p id="lKgf">Такой подход суперэффективен, когда:</p>
  <ol id="siOQ">
    <li id="jrZL">значений немного (низкая кардинальность)</li>
    <li id="HWkv">частые фильтры или группировки по этому полю.</li>
  </ol>
  <h2 id="bMnF"></h2>
  <h2 id="4GkX">Когда он полезен?</h2>
  <p id="GItF">Посмотрим на таблицу &#x60;demo_customers&#x60;.</p>
  <pre id="Sk5X" data-lang="sql">-- Таблица 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 &#x27;Y&#x27; CHECK (is_active IN (&#x27;Y&#x27;, &#x27;N&#x27;)),
  deleted_at    DATE,
  deleted_by    NUMBER
);</pre>
  <p id="ZUfK"></p>
  <p id="BVFY">Есть поле &#x60;is_active&#x60;, которое может быть &#x60;&#x27;Y&#x27;&#x60; или &#x60;&#x27;N&#x27;&#x60;.</p>
  <p id="JnAG">Угадаете, сколько уникальных значений? Правильно — два.</p>
  <p id="mmSU"></p>
  <p id="j2C8">Создаем индекс:</p>
  <pre id="QU4V" data-lang="sql">CREATE BITMAP INDEX idx_cust_is_active ON demo_customers(is_active);</pre>
  <p id="OXMk"></p>
  <p id="XqkL">Теперь запросы вроде:</p>
  <pre id="o1Nn" data-lang="sql">SELECT COUNT(*) FROM demo_customers WHERE is_active = &#x27;Y&#x27;;</pre>
  <p id="fZyW">будут отрабатывать быстрее — особенно на больших таблицах.</p>
  <p id="YWVH"></p>
  <p id="ivQi">Аналогично, если вы часто строите отчёты по &#x60;region&#x60;, и количество регионов ограничено (например, 10–20), создаём:</p>
  <pre id="huIS" data-lang="sql">CREATE BITMAP INDEX idx_orders_region   ON demo_orders(region);</pre>
  <p id="8do2"></p>
  <p id="MPlk">Это даст буст производительности при таких запросах:</p>
  <pre id="7DgB" data-lang="sql">SELECT region, COUNT(*)
	FROM demo_orders
 WHERE is_active = &#x27;Y&#x27;
 GROUP BY region;</pre>
  <p id="kAkN"></p>
  <blockquote id="Vwcp"> Заметьте: Oracle может эффективно <strong>объединять</strong> несколько битовых индексов в одном запросе — это ещё один плюс.</blockquote>
  <p id="RXI9"></p>
  <p id="ckB4"></p>
  <h2 id="0vSo">Когда НЕ стоит использовать битовые индексы?</h2>
  <p id="aZWD">Вот где начинаются подводные камни: </p>
  <ol id="WelF">
    <li id="zIJh"><strong>Частые DML-операции</strong> (INSERT/UPDATE/DELETE): битовый индекс <em>тяжеловат</em> на обновления. Любое изменение строки может затронуть много битов — и Oracle будет блокировать больше, чем хотелось бы. </li>
    <li id="kd9T"><strong>Высокая кардинальность</strong> — например, индекс на customer_id или product_id точно не стоит делать битовым: для каждого значения будет почти свой отдельный бит, и индекс станет больше самой таблицы. </li>
    <li id="3HQY">В многопользовательской среде с конкурентной записью — возможны блокировки.</li>
  </ol>
  <p id="SKnP"></p>
  <p id="Di6V">Допустим, вы обновляете тысячи строк в demo_orders:</p>
  <pre id="Xrxn" data-lang="sql">UPDATE demo_orders
   SET is_active = &#x27;N&#x27;
 WHERE order_date &lt; ADD_MONTHS(SYSDATE, -12);</pre>
  <p id="6jim">Битовый индекс is_active здесь будет тормозить: Oracle должен будет перестраивать множество битов, возможно с блокировками. В OLTP-сценариях лучше использовать обычный B-tree или вообще обойтись без индекса.</p>
  <p id="fvR2"></p>
  <h2 id="SbGm">Проверяем скорость с и без индекса</h2>
  <pre id="jrFK" data-lang="sql">-- включаем простую метрику времени
SET timing ON

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@apworks/2XrCjwEKU5d</guid><link>https://teletype.in/@apworks/2XrCjwEKU5d?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks</link><comments>https://teletype.in/@apworks/2XrCjwEKU5d?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks#comments</comments><dc:creator>apworks</dc:creator><title>5 способов посмотреть план выполнения запроса в Oracle SQL</title><pubDate>Sat, 14 Jun 2025 13:57:08 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f5/94/f594d588-2971-4467-96f3-ac737b695d39.png"></media:content><tt:hashtag>oracle</tt:hashtag><tt:hashtag>оптимизация</tt:hashtag><tt:hashtag>explain_plan</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/5c/a7/5ca79f86-4917-4680-9ecc-c2515bd4ba79.png"></img>План выполнения показывает, как Oracle обрабатывает SQL-запрос: какие индексы использует, в каком порядке соединяет таблицы, как фильтрует данные. Понимание плана — ключ к оптимизации запросов и устранению узких мест.]]></description><content:encoded><![CDATA[
  <figure id="EuKf" class="m_column">
    <img src="https://img2.teletype.in/files/5c/a7/5ca79f86-4917-4680-9ecc-c2515bd4ba79.png" width="1876" />
  </figure>
  <h2 id="mVLz">Зачем анализировать план выполнения</h2>
  <p id="E3Nc">План выполнения показывает, <strong>как Oracle обрабатывает SQL-запрос</strong>: какие индексы использует, в каком порядке соединяет таблицы, как фильтрует данные. Понимание плана — ключ к оптимизации запросов и устранению узких мест.</p>
  <p id="F3yR"></p>
  <h2 id="9dzA">5 способов</h2>
  <h3 id="27aR">1. EXPLAIN PLAN</h3>
  <p id="DEct">Предсказывает план выполнения запроса. Не исполняет сам запрос.</p>
  <p id="MpTg">Как использовать:</p>
  <pre id="TcV9" data-lang="sql">
EXPLAIN PLAN FOR 
SELECT * FROM demo_products WHERE NAME LIKE &#x27;Товар%&#x27;; 

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

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@apworks/Vyx0qV70nLv</guid><link>https://teletype.in/@apworks/Vyx0qV70nLv?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks</link><comments>https://teletype.in/@apworks/Vyx0qV70nLv?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks#comments</comments><dc:creator>apworks</dc:creator><title>Ведем учет пользователей: от таблицы до аудита</title><pubDate>Sat, 14 Jun 2025 11:22:54 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1c/74/1c741bff-f0e3-4ccf-9518-14b086e9d6d4.png"></media:content><category>Oracle database</category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>автоматизация</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/93/b9/93b919e8-4aea-4cbc-94e8-8a775d121999.png"></img>Хранить пользователей в БД — это не просто привычка, а часть архитектуры. Централизованный учет помогает:]]></description><content:encoded><![CDATA[
  <figure id="RV8D" class="m_column">
    <img src="https://img2.teletype.in/files/93/b9/93b919e8-4aea-4cbc-94e8-8a775d121999.png" width="1876" />
  </figure>
  <h2 id="o4R9">Введение</h2>
  <p id="rEV2">Хранить пользователей в БД — это не просто привычка, а часть архитектуры. Централизованный учет помогает:</p>
  <ul id="wASA">
    <li id="vydK">обеспечить уникальность логинов,</li>
    <li id="btf4">отследить изменения,</li>
    <li id="RbDG">стандартизировать работу с пользователями для всех приложений и скриптов.</li>
  </ul>
  <p id="uTqK">Покажу, как грамотно реализовать это на Oracle SQL с проверкой, обработкой ошибок и аудитом.</p>
  <p id="hTjK"></p>
  <h2 id="iM3h">Таблица users: структура и ограничения</h2>
  <figure id="0Oh2" class="m_original">
    <img src="https://img3.teletype.in/files/ab/0f/ab0f5530-bd0a-4517-a3da-10ae5957a3cd.png" width="182" />
    <figcaption>Структура таблицы</figcaption>
  </figure>
  <p id="cfQJ"></p>
  <h3 id="yGgc">Скрипт создания таблицы</h3>
  <pre id="tH5H" data-lang="sql">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) &gt;= 3)
);
-- Add comments to the table
comment on table USERS is &#x27;Таблицы пользователей&#x27;;
  
-- Add comments to the columns
comment on column USERS.userid     is &#x27;Идентификатор пользователя&#x27;;
comment on column USERS.login      is &#x27;Логин пользователя&#x27;;
comment on column USERS.created_at is &#x27;Дата создания пользователя&#x27;;</pre>
  <p id="TLqN"></p>
  <h3 id="Nhyg">Функция получения id пользователя</h3>
  <pre id="90uB" data-lang="sql">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, &#x27;Логин не может быть NULL&#x27;);
	END IF;

	-- Проверка на минимальную длину
	IF LENGTH(p_login) &lt; 3 THEN
		RAISE_APPLICATION_ERROR(-20003, &#x27;Логин должен содержать минимум 3 символа&#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, &#x27;Найдено несколько пользователей с таким логином&#x27;);
	END;

EXCEPTION
	WHEN e_user_not_found THEN
		RAISE_APPLICATION_ERROR(-20001, &#x27;Пользователь с логином &#x27; || p_login || &#x27; не найден&#x27;);
	WHEN OTHERS THEN
		RAISE_APPLICATION_ERROR(-20000, &#x27;Ошибка при получении ID пользователя: &#x27; || SQLERRM);
END f_get_user_id;
</pre>
  <p id="tslv"></p>
  <p id="WkY0">Что делает:</p>
  <ul id="niCQ">
    <li id="oNMQ">Проверяет вход: если <code>NULL</code> или пусто — выбрасывает исключение <code>user_login_missing</code>.</li>
    <li id="D4wZ">Если логин не найден — ошибка <code>user_not_found</code>.</li>
    <li id="PoLb">Если найдено более одной записи (в теории) — ошибка <code>user_login_not_unique</code>.</li>
  </ul>
  <p id="8QgW"></p>
  <p id="Xqtl">Пример вызова функции:</p>
  <pre id="mMzX" data-lang="sql">BEGIN                                                  
	DBMS_OUTPUT.PUT_LINE(f_get_user_id(&#x27;admin&#x27;));      
EXCEPTION                            
	WHEN OTHERS THEN      	
		DBMS_OUTPUT.PUT_LINE(&#x27;Ошибка: &#x27; || SQLERRM);	
END;</pre>
  <p id="OIUq"></p>
  <figure id="by5h" class="m_original">
    <img src="https://img3.teletype.in/files/eb/a3/eba3017d-f362-4618-8518-1c290762b8b9.png" width="470" />
    <figcaption>Результат вызова функции f_get_user_id</figcaption>
  </figure>
  <p id="mntj"></p>
  <h2 id="aQ5h">Файлы и скрипты</h2>
  <p id="Z4BZ">Исходные файлы можно найти в <a href="https://github.com/aldabaeva/blog/tree/main/create-database-tables/sql/users" target="_blank">GIT</a>.</p>
  <p id="zelV"></p>
  <h2 id="xshZ">Контакты</h2>
  <p id="AiLF"><a href="mailto:personal@aldabaeva.com" target="_blank">Написать автору</a> | <a href="https://t.me/skiperkrut" target="_blank">Telegram</a> | <a href="https://aldabaeva.com/" target="_blank">Сайт автора</a></p>
  <p id="OmaY"></p>
  <tt-tags id="2Z6l">
    <tt-tag name="oracle">#oracle</tt-tag>
    <tt-tag name="автоматизация">#автоматизация</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@apworks/iJiSwqs5GhR</guid><link>https://teletype.in/@apworks/iJiSwqs5GhR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks</link><comments>https://teletype.in/@apworks/iJiSwqs5GhR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=apworks#comments</comments><dc:creator>apworks</dc:creator><title>Оптимизация в Oracle. Коротко и по делу</title><pubDate>Sat, 14 Jun 2025 08:03:03 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e2/53/e2536ee4-0550-4732-b72f-0f038acdf0bb.png"></media:content><category>Oracle. Оптимизация</category><tt:hashtag>oracle</tt:hashtag><tt:hashtag>оптимизация</tt:hashtag><description><![CDATA[<img src="https://img4.teletype.in/files/b3/4a/b34a9c55-f6d1-439e-840a-42862b151825.png"></img>Когда ты только учишься писать SQL — главное, чтобы «работало». А когда работаешь с таблицей в 15+ миллионов строк — важна **оптимизация**.]]></description><content:encoded><![CDATA[
  <figure id="xl2E" class="m_column">
    <img src="https://img4.teletype.in/files/b3/4a/b34a9c55-f6d1-439e-840a-42862b151825.png" width="1876" />
  </figure>
  <p id="iEkI">Когда ты только учишься писать SQL — главное, чтобы «работало». А когда работаешь с таблицей в 15+ миллионов строк — важна **оптимизация**.</p>
  <p id="Q2SP">Я когда-то обрабатывала по 300 строк в час.<br />После оптимизации — 150 000+ за это же время.</p>
  <p id="CXYE"></p>
  <p id="y90I">Вот, что реально помогает:</p>
  <ol id="ZBQZ">
    <li id="RlK3">Используй индексы (и проверь, что Oracle их применяет)</li>
    <li id="E2xr">Не делай SELECT * — выбирай только нужные поля</li>
    <li id="kfsg">Используй &#x60;BULK COLLECT&#x60; и &#x60;FORALL&#x60; в PL/SQL</li>
    <li id="RS0M">Следи за &#x60;execution plan&#x60; (можно в SQL Developer)</li>
    <li id="zhgK">Избегай вложенных подзапросов без нужды</li>
    <li id="Yvn2">Следи за типами данных — не сравнивай строку с числом</li>
    <li id="PnHo">Разбивай большие запросы на части (временные таблицы / WITH)</li>
  </ol>
  <p id="xkYk"></p>
  <blockquote id="dTzf">Oracle — это мощно. Но только если ты умеешь использовать его грамотно.</blockquote>
  <p id="m97c"></p>
  <p id="puSX">Расскажу в следующих постах, как проверять план выполнения и индекс влияет ли вообще на что-то 💡</p>
  <p id="1YZm"></p>
  <h2 id="seyX">Контакты</h2>
  <p id="d38V"><a href="mailto:personal@aldabaeva.com" target="_blank">Написать автору</a> | <a href="https://t.me/skiperkrut" target="_blank">Telegram</a> | <a href="https://aldabaeva.com/" target="_blank">Сайт автора</a></p>
  <p id="OBCf"></p>
  <tt-tags id="nm7W">
    <tt-tag name="oracle">#oracle</tt-tag>
    <tt-tag name="оптимизация">#оптимизация</tt-tag>
  </tt-tags>

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

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

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

]]></content:encoded></item></channel></rss>