<?php
// Store procedure call without params
$MyConnection = new mysqli ("DB_SERVER", "DB_USER", "DB_PASS", "DB_NAME");
mysqli_multi_query ($MyConnection, "CALL MyStoreProcedure") OR DIE (mysqli_error($MyConnection));
while (mysqli_more_results($MyConnection)) {
if ($result = mysqli_store_result($MyConnection)) {
while ($row = mysqli_fetch_assoc($result)) {
// i.e.: DBTableFieldName="userID"
echo "row = ".$row["DBTableFieldName"]."<br />";
....
}
mysqli_free_result($result);
}
mysqli_next_result($conn);
}
?>
*******************************************************************
<?php
// Store procedure call using params
$MyConnection = new mysqli ("DB_SERVER", "DB_USER", "DB_PASS", "DB_NAME");
mysqli_query($MyConnection ,"SET @p0='".$MyParam1."'");
mysqli_query($MyConnection ,"SET @p1='".$MyParam2."'");
mysqli_multi_query ($MyConnection, "CALL MyStoreProcedure (@p0,@p1)") OR DIE (mysqli_error($MyConnection));
while (mysqli_more_results($MyConnection)) {
if ($result = mysqli_store_result($MyConnection)) {
while ($row = mysqli_fetch_assoc($result)) {
// i.e.: DBTableFieldName="userID"
echo "row = ".$row["DBTableFieldName"]."<br />";
....
}
mysqli_free_result($result);
}
mysqli_next_result($conn);
}
?>Зачувани процедури
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Зачувани процедури
Референца за `mysqli.quickstart.stored-procedures.php` со подобрена типографија и навигација.
Зачувани процедури
The MySQL database supports stored procedures. A stored procedure is a subroutine stored in the database catalog. Applications can call and execute the stored procedure. The CALL
MySQL базата на податоци поддржува складирани процедури. Складирана процедура е подпрограма зачувана во каталогот на базата на податоци. Апликациите можат да ја повикаат и извршат складираната процедура.
Параметар
SQL изјавата се користи за извршување на складирана процедура. IN,
INOUT and OUT Складираните процедури можат да имаат
параметри, во зависност од верзијата на MySQL. mysqli интерфејсот нема посебна нотација за различните видови параметри.
IN параметар CALL Влезните параметри се обезбедени со
изјава. Ве молиме, проверете дали вредностите се правилно избегнати.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$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;");
$mysqli->query("CALL p(1)");
$result = $mysqli->query("SELECT id FROM test");
var_dump($result->fetch_assoc());Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(1) {
["id"]=>
string(1) "1"
}
Пример #1 Повикување на складирана процедура
INOUT/OUT параметар INOUT/OUT
Вредностите на
параметрите се пристапуваат со користење на сесиски променливи.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query('CREATE PROCEDURE p(OUT msg VARCHAR(50)) BEGIN SELECT "Hi!" INTO msg; END;');
$mysqli->query("SET @msg = ''");
$mysqli->query("CALL p(@msg)");
$result = $mysqli->query("SELECT @msg as _p_out");
$row = $result->fetch_assoc();
echo $row['_p_out'];Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Hi!
Пример #2 Користење на сесиски променливи
Развивачите на апликации и рамки можеби ќе можат да обезбедат поудобен API користејќи мешавина од сесиски променливи и инспекција на каталогот на базата на податоци. Сепак, ве молиме имајте предвид можното влијание на перформансите на прилагодено решение базирано на инспекција на каталогот.
Ракување со множества резултати mysqli::__construct()ќе треба да се прилагоди, и mysqli::__construct() Складираните процедури можат да вратат множества резултати. Множествата резултати вратени од складирана процедура не можат правилно да се преземат со користење на mysqli::__construct() функцијата комбинира извршување на изјавата и преземање на првото множество резултати во тампонирано множество резултати, ако има. Сепак, постојат дополнителни множества резултати од складирани процедури скриени од корисникот што предизвикуваат
да не успее враќајќи ги очекуваните множества резултати од корисникот.
Множествата резултати вратени од складирана процедура се преземаат со користење на or - Проверете дали има повеќе резултати од прашање од повеќекратно прашањеmysqli::real_query() CALL. Failing to fetch all result sets returned by a stored procedure causes an error.
. Неуспешното преземање на сите множества резултати вратени од процедура за складирање предизвикува грешка.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
$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;');
$mysqli->multi_query("CALL p()");
do {
if ($result = $mysqli->store_result()) {
printf("---\n");
var_dump($result->fetch_all());
$result->free();
}
} while ($mysqli->next_result());Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
---
array(3) {
[0]=>
array(1) {
[0]=>
string(1) "1"
}
[1]=>
array(1) {
[0]=>
string(1) "2"
}
[2]=>
array(1) {
[0]=>
string(1) "3"
}
}
---
array(3) {
[0]=>
array(1) {
[0]=>
string(1) "2"
}
[1]=>
array(1) {
[0]=>
string(1) "3"
}
[2]=>
array(1) {
[0]=>
string(1) "4"
}
}
Пример #3 Преземање резултати од процедури за складирање
Користење на подготвени изјави CALL Не е потребно посебно ракување при користење на интерфејсот за подготвени изјави за преземање резултати од истата процедура за складирање како погоре. Интерфејсите за подготвени и неподготвени изјави се слични. Ве молиме имајте предвид дека не секоја верзија на MYSQL сервер може да поддржува подготовка на
SQL изјава.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
$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;');
$stmt = $mysqli->prepare("CALL p()");
$stmt->execute();
do {
if ($result = $stmt->get_result()) {
printf("---\n");
var_dump($result->fetch_all());
$result->free();
}
} while ($stmt->next_result());Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
---
array(3) {
[0]=>
array(1) {
[0]=>
int(1)
}
[1]=>
array(1) {
[0]=>
int(2)
}
[2]=>
array(1) {
[0]=>
int(3)
}
}
---
array(3) {
[0]=>
array(1) {
[0]=>
int(2)
}
[1]=>
array(1) {
[0]=>
int(3)
}
[2]=>
array(1) {
[0]=>
int(4)
}
}
Пример #4 Процедури за складирање и подготвени изјави
Се разбира, поддржана е и употребата на API за врзување за преземање.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
$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;');
$stmt = $mysqli->prepare("CALL p()");
$stmt->execute();
do {
if ($stmt->store_result()) {
$stmt->bind_result($id_out);
while ($stmt->fetch()) {
echo "id = $id_out\n";
}
}
} while ($stmt->next_result());Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
id = 1 id = 2 id = 3 id = 2 id = 3 id = 4
Види исто така