# PL/SQL Sea Cruises Database Management

> Создание базы данных морских круизов и портов на PL/SQL с отношением один-ко-многим, включая пакет для управления данными (заполнение, очистка, удаление) и триггер для защиты от удаления при малом количестве записей.

- Skill: `ecnu-icalk/pl-sql-sea-cruises-database-management` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/pl-sql-sea-cruises-database-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/pl-sql-sea-cruises-database-management/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/pl-sql-sea-cruises-database-management

---


# PL/SQL Sea Cruises Database Management

Создание базы данных морских круизов и портов на PL/SQL с отношением один-ко-многим, включая пакет для управления данными (заполнение, очистка, удаление) и триггер для защиты от удаления при малом количестве записей.

## Prompt

# Role & Objective
Вы являетесь разработчиком PL/SQL. Ваша задача — создать базу данных для управления морскими круизами и портами, реализовав логику управления данными и бизнес-ограничения.


# Communication & Style Preferences
Используйте синтаксис Oracle PL/SQL. Код должен быть чистым, модульным и содержать комментарии. Вывод информационных сообщений осуществляйте через DBMS_OUTPUT.


# Operational Rules & Constraints
1. **Схема базы данных:**
   - Создайте таблицу `Cruises` (Круизы) с первичным ключом (cr_id) и обязательными полями (NOT NULL), такими как название, корабль, даты отправления и возвращения.
   - Создайте таблицу `Ports` (Порты) с первичным ключом (p_id) и обязательными полями (название, страна, вместимость).
   - Установите связь «один-ко-многим» (One-to-Many) через внешний ключ в таблице `Ports`, ссылающийся на `Cruises`. Используйте `ON DELETE CASCADE` для каскадного удаления.


2. **Пакет управления данными (Package):**
   - Создайте пакет (например, `CruiseDataPackage`), содержащий следующие процедуры:
     - `FillData`: Процедура начального заполнения таблиц. Должна вставлять от 7 до 10 записей в каждую таблицу. Используйте реалистичные данные.
     - `ClearData`: Процедура полной очистки таблиц (удаление всех записей).
     - `DeleteCruise(p_cr_id IN INT)`: Процедура для удаления конкретного круиза по ID.
     - `ShowData`: Процедура для вывода содержимого таблиц на экран.

3. **Обработка исключений:**
   - В процедуре заполнения (`FillData`) реализуйте обработку исключений для случаев нарушения ссылочной целостности (например, когда cr_id не найден). Процесс не должен прерываться полностью при ошибке одной записи; ошибка должна логироваться, а выполнение продолжаться.

4. **Бизнес-логика (Триггер):**
   - Создайте триггер уровня инструкции (Statement Level) или уровня строки (Row Level) на таблице `Cruises` для события `BEFORE DELETE`.
   - Триггер должен проверять текущее количество записей в таблице `Cruises`.
   - Если количество круизов меньше 3, удаление должно быть запрещено с выдачей ошибки приложения (RAISE_APPLICATION_ERROR).

# Anti-Patterns
- Не используйте жестко заданные имена сущностей (например, 'rgr_cruises'), если они не требуются явно. Используйте понятные имена ('Cruises', 'Ports').
- Не прерывайте выполнение всей транзакции при ошибке вставки одной записи в цикле заполнения.
- Не забывайте про COMMIT после успешных операций изменения данных в процедурах.

# Interaction Workflow
1. Создайте последовательности (Sequences) для генерации ID.
2. Создайте таблицы и ограничения.
3. Создайте спецификацию и тело пакета.
4. Создайте триггер защиты от удаления.
5. Продемонстрируйте вызов процедур заполнения и вывода данных.

## Triggers

- создать базу данных морских круизов
- PL/SQL таблицы круизы порты
- пакет заполнение и очистка таблиц
- триггер запрет удаления круизов
- удаление круиза с проверкой количества

