Spec-Zone.ru › MySQL 5.7

13.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, вызовите соответствующую функцию.

Информацию о влиянии необработанных условий на параметры процедуры см. в разделе 13.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 |
+----------+------------+
| 5.7.44   |         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 |
+----------+------------+
| 5.7.44   |         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.

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

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

Spec-Zone.ru

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