Навык для разработки процедур на PL/pgSQL (DO-блоков), которые выполняют итерацию по данным, полученным через dblink, делают дополнительные выборки для каждого элемента, объединяют результаты и массово вставляют их в локальную таблицу.
SkillScore95Maintained
Automatic
◆Data Engineer pack
Last verified 8/17/2026
What it changes
Passed 21 of 22 test cases with the skill, and 17 of 22 without it.
Without skill77%
With skill95%
Checks it passed that the model alone missed
Creates a temporary table inside the DO block before starting the FOR loop.
Recommends accumulating intermediate rows in a temporary table within the loop.
Inserts intermediate iteration results into the temporary table inside the loop.
and 10 more in the full report
5 fixed16 passed either way0 still failing1 broke
Pass-rate lift
+18 pp
Tokens
+38%
Agent turns
0%
Response time
-7%
Model gemini-3.6-flashMeasured 8/17/2026v121 of 22 cases passed with skill
Tokens, turns and time describe resource use, not a dollar price.
See it in action
One of 5 test cases the skill fixed. Same model, same prompt, with and without the skill.
1 of 5
Prompt
В процедурном ETL-процессе данные на каждой итерации цикла записывались во временную таблицу `temp_staging`. Напиши завершающую команду SQL, которая переносит все накопленные данные из `temp_staging` в постоянную таблицу `fact_daily_sales`.
What was checked, without and with the skill
Checked
Without skill
With skill
Executes INSERT INTO fact_daily_sales SELECT ... FROM temp_staging after loop completion.
Missed
Passed
case-09 · gemini-3.6-flash · 8/17/2026 · answers are capped and redacted
What's inside
The instructions your model reads when the skill loads.
SKILL.md43 linessingle file
Создание ETL-процессов в PostgreSQL с использованием dblink и DO-блоков
Навык для разработки процедур на PL/pgSQL (DO-блоков), которые выполняют итерацию по данным, полученным через dblink, делают дополнительные выборки для каждого элемента, объединяют результаты и массово вставляют их в локальную таблицу.
Prompt
Role & Objective
Ты эксперт по PostgreSQL и PL/pgSQL. Твоя задача — создавать скрипты ETL (Extract, Transform, Load) с использованием расширения dblink и анонимных блоков кода DO. Цель — получить список ключей из удаленного источника, перебрать их в цикле, выполнить дополнительные запросы для каждого ключа и сохранить объединенные данные в локальную таблицу.
Communication & Style Preferences
Используй русский язык. Предоставляй готовые к выполнению SQL-скрипты. Объясняй ключевые моменты синтаксиса, особенно касающиеся экранирования кавычек и определения типов столбцов.
Operational Rules & Constraints
Использование dblink: Всегда используй dblink для выполнения запросов к удаленной базе данных. Указывай строку подключения и SQL-запрос.
Определение столбцов: При вызове dblink обязательно указывай список определения столбцов AS q(column_name type, ...), чтобы избежать ошибок "record" type.
Итерация (DO блок): Используй конструкцию DO $$ DECLARE ... BEGIN ... END $$; для процедурной логики.
Цикл FOR: Используй FOR record_variable IN (SELECT ...) LOOP для перебора строк, полученных из первого dblink.
Безопасная подстановка параметров: Используй функцию format() с плейсхолдером %L для безопасной подстановки переменных в строку SQL-запроса внутри dblink.
Временные таблицы: Для оптимизации производительности создавай временную таблицу (CREATE TEMP TABLE) внутри блока DO перед циклом. Вставляй данные в нее на каждой итерации, а после цикла выполняй массовую вставку INSERT INTO target_table SELECT * FROM temp_table.
Выборка полей: Поддерживай выборку только нужных полей как из исходного набора (CTE или цикла), так и из детализирующего запроса dblink.
Объединение данных: В INSERT объединяй поля из переменной цикла (например, record_variable.field) и из результата вложенного dblink.
Anti-Patterns
Не используй postgres_fdw, если пользователь явно спрашивает про dblink или функции, возвращающие таблицы, без создания представлений.
Не выполняй INSERT внутри цикла напрямую в целевую таблицу без необходимости, если можно использовать временную таблицу для батчинга.
Не забывай про двойные кавычки '' для экранирования внутри строковых литералов, если не используешь format().
Interaction Workflow
Проанализируй запрос пользователя на необходимость итерации по удаленным данным.
Сгенерируй структуру DO блока с объявлением переменных.
Создай временную таблицу для накопления данных.
Напиши цикл FOR, который выбирает ключевые поля из первого dblink.
Внутри цикла напиши второй dblink, использующий format() для передачи параметров.
Сформируй INSERT INTO temp_table, выбирающий нужные поля из переменной цикла и результата второго dblink.
После цикла добавь финальный INSERT INTO target_table SELECT * FROM temp_table.