Spec-Zone.ru › MySQL 9.2

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 |
+----------+------------+
| 9.2.0   |         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 |
+----------+------------+
| 9.2.0   |         11 |
+----------+------------+

Для написания C-программ, использующих оператор CALL SQL для выполнения хранимых процедур, которые возвращают наборы результатов, должен быть включён флаг 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-9.2-en/call.html

Spec-Zone.ru

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