Spec-Zone.ru › MySQL 8.4

15.2.1 Оператор CALL

CALL sp_name([parameter[,...]])
CALL sp_name[()]

Оператор CALL вызывает сохранённую процедуру, которая была определена ранее с помощью CREATE PROCEDURE.

Сохранённые процедуры, которые не принимают аргументы, могут быть вызваны без скобок. То есть, CALL p() и CALL p эквивалентны.

CALL может возвращать значения своему вызывающему элементу с помощью параметров, объявленных как OUT или INOUT параметры. При возврате процедуры клиентская программа также может получить количество изменённых строк для последнего выполненного оператора внутри процедуры: на уровне SQL вызовите функцию ROW_COUNT(); из C API вызовите функцию.

Сведения об эффекте необработанных условий на параметры процедуры см. в разделе 15.6.7.8 «Обработка условий и параметры OUT или INOUT».

Чтобы получить значение из процедуры с помощью параметра OUT или INOUT, передайте параметр через переменную пользователя и затем проверьте значение переменной после возврата процедуры. (Если вы вызываете процедуру из другой сохранённой процедуры или функции, вы также можете передать параметр процедуры или локальную переменную процедуры как IN или INOUT параметр.) Для параметра INOUT инициализируйте его значение перед передачей в процедуру. Следующая процедура имеет параметр OUT, который процедура устанавливает в текущую версию сервера, и значение INOUT, которое процедура увеличивает на единицу от его текущего значения:

DELIMITER //

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
  # Set value of OUT parameter
  SELECT VERSION() INTO ver_param;
  # Increment value of INOUT parameter
  SET incr_param = incr_param + 1;
END //

DELIMITER ;

Перед вызовом процедуры инициализируйте переменную, которая будет передана в качестве параметра INOUT. После вызова процедуры вы можете увидеть, что значения двух переменных установлены или изменены:

mysql> SET @increment = 10;
mysql> CALL p(@version, @increment);
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.4.4   |         11 |
+----------+------------+

В подготовленных операторах CALL, используемых с PREPARE и EXECUTE, могут использоваться плейсхолдеры для IN параметров, OUT и INOUT параметров. Эти типы параметров могут быть использованы следующим образом:

mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.4.4   |         11 |
+----------+------------+

Для написания программ на языке C, которые используют оператор SQL CALL для выполнения сохранённых процедур, которые производят наборы результатов, необходимо включить флаг CLIENT_MULTI_RESULTS. Это связано с тем, что каждый CALL возвращает результат для указания статуса вызова, помимо любых наборов результатов, которые могут быть возвращены операторами, выполняемыми внутри процедуры. CLIENT_MULTI_RESULTS также должен быть включён, если CALL используется для выполнения любой сохранённой процедуры, которая содержит подготовленные операторы. Нельзя определить при загрузке такой процедуры, производят ли эти операторы наборы результатов, поэтому необходимо предположить, что они это делают.

CLIENT_MULTI_RESULTS может быть включено при вызове , либо явно, передавая сам флаг CLIENT_MULTI_RESULTS, либо неявно, передавая CLIENT_MULTI_STATEMENTS (что также включает CLIENT_MULTI_RESULTS). CLIENT_MULTI_RESULTS включен по умолчанию.

Для обработки результата оператора CALL, выполненного с использованием или , используйте цикл, который вызывает для определения наличия дополнительных результатов. Пример см. в .

Программы на языке C могут использовать интерфейс подготовленных операторов для выполнения операторов CALL и доступа к параметрам OUT и INOUT. Это делается путём обработки результата оператора CALL с помощью цикла, который вызывает для определения наличия дополнительных результатов. Пример см. в . Языки, которые предоставляют интерфейс MySQL, могут использовать подготовленные операторы CALL для прямого извлечения OUT и INOUT параметров процедуры.

Изменения метаданных объектов, на которые ссылаются сохранённые программы, обнаруживаются и вызывают автоматическое повторное парсинг затронутых операторов при следующем выполнении программы. Дополнительную информацию см. в разделе 10.10.3 «Кэширование подготовленных операторов и сохранённых программ».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/call.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API