Les procédures stockées

La base de données MySQL supporte les procédures stockées. Une procédure stockée est une sous routine stockée dans le catalogue de la base de données. Les applications peuvent appeler et exécuter une procédure stockée. La requête SQL CALL est utilisée pour exécuter une procédure stockées.

Paramètre

Les procédures stockées peuvent avoir des paramètres IN, INOUT and OUT, suivant la version de MySQL. L'interface mysqli n'a pas de notion spécifique des différents types de paramètres.

Paramètre IN

Les paramètres d'entrée sont fournis avec la requête CALL. Assurez-vous d'échapper correctement les valeurs.

Exemple #1 Appel d'une procédure stockée

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
	echo "Echec lors de la connexion à MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
	!$mysqli->query("CREATE PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;")) {
	echo "Echec lors de la création de la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$mysqli->query("CALL p(1)")) {
	echo "Echec lors de l'appel à la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!($res = $mysqli->query("SELECT id FROM test"))) {
	echo "Echec de la requête : (" . $mysqli->errno . ") " . $mysqli->error;
}

var_dump($res->fetch_assoc());
?>
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
	echo "Echec lors de la connexion à MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
	!$mysqli->query('CREATE PROCEDURE p(OUT msg VARCHAR(50)) BEGIN SELECT "Hi!" INTO msg; END;')) {
	echo "Echec lors de la création de la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}


if (!$mysqli->query("SET @msg = ''") || !$mysqli->query("CALL p(@msg)")) {
	echo "Echec de l'appel à la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!($res = $mysqli->query("SELECT @msg as _p_out"))) {
	echo "Echec lors de la récupération : (" . $mysqli->errno . ") " . $mysqli->error;
}

$row = $res->fetch_assoc();
echo $row['_p_out'];
?>
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
	echo "Echec lors de la connexion à MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
	!$mysqli->query("CREATE TABLE test(id INT)") ||
	!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
	!$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;')) {
	echo "Echec lors de la création de la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$mysqli->multi_query("CALL p()")) {
	echo "Echec lors de l'appel à CALL : (" . $mysqli->errno . ") " . $mysqli->error;
}

do {
	if ($res = $mysqli->store_result()) {
		printf("---\n");
		var_dump($res->fetch_all());
		$res->free();
	} else {
		if ($mysqli->errno) {
			echo "Echec de STORE : (" . $mysqli->errno . ") " . $mysqli->error;
		}
	}
} while ($mysqli->more_results() && $mysqli->next_result());
?>
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
	echo "Echec lors de la connexion à MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
	!$mysqli->query("CREATE TABLE test(id INT)") ||
	!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
	!$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;')) {
	echo "Echec lors de la création de la procédure stockée : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!($stmt = $mysqli->prepare("CALL p()"))) {
	echo "Echec lors de la préparation : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
	echo "Echec lors de l'exécution : (" . $stmt->errno . ") " . $stmt->error;
}

do {
	if ($res = $stmt->get_result()) {
		printf("---\n");
		var_dump(mysqli_fetch_all($res));
		mysqli_free_result($res);
	} else {
		if ($stmt->errno) {
			echo "Echec de STORE : (" . $stmt->errno . ") " . $stmt->error;
		}
	}
} while ($stmt->more_results() && $stmt->next_result());
?>

Bien sûr, l'utilisation de l'API de liage pour la récupération est également supportée.

Exemple #5 Procédures stockées et requête préparée en utilisant l'API de liage

<?php
if (!($stmt = $mysqli->prepare("CALL p()"))) {
	echo "Echec lors de la préparation : (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
	echo "Echec lors de l'exécution : (" . $stmt->errno . ") " . $stmt->error;
}

do {

	$id_out = NULL;
	if (!$stmt->bind_result($id_out)) {
		echo "Echec lors du liage : (" . $stmt->errno . ") " . $stmt->error;
	}
 
	while ($stmt->fetch()) {
		echo "id = $id_out\n";
	}
} while ($stmt->more_results() && $stmt->next_result());
?>

Voir aussi

LoadingChargement en cours