Глава 46. Интерфейс программирования сервера
Содержание
- 46.1. Интерфейсные функции
 - SPI_connect — подключить функцию на C к менеджеру SPI
- SPI_finish — отключить функцию на C от менеджера SPI
 - SPI_execute — выполнить команду
 - SPI_exec — выполнить команду чтения/записи
 - SPI_execute_extended — выполнить команду с выделенными параметрами
 - SPI_execute_with_args — выполнить команду с выделенными параметрами
 - SPI_prepare — подготовить оператор, но пока не выполнять его
 - SPI_prepare_cursor — подготовить оператор, но пока не выполнять его
 - SPI_prepare_extended — подготовить оператор, но пока не выполнять его
 - SPI_prepare_params — подготовить оператор, но пока не выполнять его
 - SPI_getargcount — получить число аргументов, требующихся оператору, подготовленному функцией
 SPI_prepare- SPI_getargtypeid — получить OID типа аргумента для оператора, подготовленного функцией
 SPI_prepare- SPI_is_cursor_plan — выдать
 true, если оператор, подготовленный функциейSPI_prepare, можно использовать сSPI_cursor_open- SPI_execute_plan — выполнить оператор, подготовленный функцией
 SPI_prepare- SPI_execute_plan_extended — выполнить оператор, подготовленный функцией
 SPI_prepare- SPI_execute_plan_with_paramlist — выполнить оператор, подготовленный функцией
 SPI_prepare- SPI_execp — выполнить оператор в режиме чтения/записи
 - SPI_cursor_open — открыть курсор для оператора, созданного функцией
 SPI_prepare- SPI_cursor_open_with_args — открывает курсор для запроса с параметрами
 - SPI_cursor_open_with_paramlist — открыть курсор с параметрами
 - SPI_cursor_parse_open — открывает курсор для строки запроса и набора параметров
 - SPI_cursor_find — найти существующий курсор по имени
 - SPI_cursor_fetch — выбрать строки через курсор
 - SPI_cursor_move — переместить курсор
 - SPI_scroll_cursor_fetch — выбрать строки через курсор
 - SPI_scroll_cursor_move — переместить курсор
 - SPI_cursor_close — закрыть курсор
 - SPI_keepplan — сохранить подготовленный оператор
 - SPI_saveplan — сохранить подготовленный оператор
 - SPI_register_relation — сделать эфемерное именованное отношение доступным по имени в запросах SPI
 - SPI_unregister_relation — удалить эфемерное именованное отношение из реестра
 - SPI_register_trigger_data — сделать эфемерные данные триггера доступными в запросах SPI
  - SPI_finish — отключить функцию на C от менеджера SPI
 
- SPI_connect — подключить функцию на C к менеджеру SPI
 - 46.2. Вспомогательные интерфейсные функции
 - SPI_fname — определить имя столбца с заданным номером
- SPI_fnumber — определить номер столбца с заданным именем
 - SPI_getvalue — получить строковое значение указанного столбца
 - SPI_getbinval — получить двоичное значение указанного столбца
 - SPI_gettype — получить имя типа данных указанного столбца
 - SPI_gettypeid — получить OID типа данных указанного столбца
 - SPI_getrelname — возвращает имя указанного отношения
 - SPI_getnspname — возвращает пространство имён указанного отношения
 - SPI_result_code_string — возвращает код ошибки в виде строки
  - SPI_fnumber — определить номер столбца с заданным именем
 
- SPI_fname — определить имя столбца с заданным номером
 - 46.3. Управление памятью
 - SPI_palloc — выделить память в верхнем контексте исполнителя
- SPI_repalloc — поменять блок памяти в верхнем контексте исполнителя
 - SPI_pfree — освободить память в верхнем контексте исполнителя
 - SPI_copytuple — скопировать строку в верхнем контексте исполнителя
 - SPI_returntuple — подготовить строку для возврата в виде Datum
 - SPI_modifytuple — создать строку, заменяя отдельные поля в данной
 - SPI_freetuple — освободить строку, размещённую в верхнем контексте исполнителя
 - SPI_freetuptable — освободить набор строк, созданный
 SPI_executeили подобной функцией- SPI_freeplan — освободить ранее сохранённый подготовленный оператор
  - SPI_repalloc — поменять блок памяти в верхнем контексте исполнителя
 
- SPI_palloc — выделить память в верхнем контексте исполнителя
 - 46.4. Управление транзакциями
 - SPI_commit — зафиксировать текущую транзакцию
- SPI_rollback — прервать текущую транзакцию
 - SPI_start_transaction — устаревшая функция
  - SPI_rollback — прервать текущую транзакцию
 
- SPI_commit — зафиксировать текущую транзакцию
 - 46.5. Видимость изменений в данных
- 46.6. Примеры
  
Интерфейс программирования сервера (SPI, Server Programming Interface) даёт разработчикам пользовательских функций на C возможность запускать команды SQL из своих функций или процедур. SPI представляет собой набор интерфейсных функций, упрощающих доступ к анализатору, планировщику и исполнителю запросов. В SPI есть также функции для управления памятью.
Примечание
Доступные процедурные языки предоставляют различные средства для выполнения SQL-команд из функций. Большинство этих средств основаны на SPI, так что эта документация будет полезна и тем, кто использует эти языки.
Учтите, что если команда, вызванная через SPI, прерывается ошибкой, управление не возвращается в вашу функцию на C. Вместо этого происходит откат транзакции или подтранзакции, из которой вызывалась ваша функция. (Это может показаться удивительным с учётом того, что для большинства функций SPI описаны соглашения по возврату ошибок. Однако эти соглашения применимы только к ошибкам, выявляемым в самих функциях SPI.) Получить управление после ошибки можно, только организовав собственную подтранзакцию, окружающую вызовы SPI, в которых возможна ошибка.
Функции SPI выдают неотрицательный результат в случае успеха (либо через возвращаемое целочисленное значение, либо в глобальной переменной SPI_result, как описано ниже). В случае ошибки выдаётся отрицательный результат или NULL.
Файлы исходного кода, использующие SPI, должны включать заголовочный файл executor/spi.h.