저장 프로 시저를 호출하는 것은 PHP를 사용하여 MySQL 데이터베이스를 조작 할 때, 특히 데이터베이스 수준에서 복잡한 비즈니스 로직을 캡슐화하려는 경우 일반적인 관행입니다. 그러나 많은 개발자는 ** 출력 매개 변수 (Out 매개 변수)로 저장 프로 시저를 호출 할 때 출력 매개 변수 값을 읽을 수없는 상황에 종종 발생합니다.
핵심 사항 중 하나는 Next_Result () 를 사용하는 것입니다. 이 기사에서는이 기능을 호출 해야하는 이유와 저장 프로 시저의 출력 매개 변수를 올바르게 읽는 방법을 자세히 설명합니다.
MySQLI 드라이버를 사용하여 여러 결과 세트 (예 : 다중 선택 또는 출력 매개 변수)를 반환하는 저장 프로 시저를 호출 할 때 MySQL은 "다중 결과 세트"형식으로 데이터를 반환합니다. next_result () 메소드는 MySQLI 드라이버가 다음 결과 세트를 읽을 준비를하는 데 사용됩니다.
next_result ()가 명시 적으로 호출되지 않고 모든 결과 세트가 통과되는 경우 일부 데이터베이스 결과 (예 : 출력 매개 변수 또는 최종 결과 세트)에 액세스 할 수 없습니다.
먼저 입력 매개 변수와 출력 매개 변수가있는 간단한 MySQL 저장 프로 시저를 살펴 보겠습니다.
DELIMITER $$
CREATE PROCEDURE get_user_email(IN user_id INT, OUT email VARCHAR(255))
BEGIN
SELECT user_email INTO email FROM users WHERE id = user_id;
END $$
DELIMITER ;
이 저장된 프로 시저는 사용자 ID를 기반으로 사서함을 쿼리하고 Out 매개 변수를 통해 반환합니다.
<?php
$mysqli = new mysqli("localhost", "username", "password", "your_database");
// 연결을 확인하십시오
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 1. 설정 OUT 매개 변수
$mysqli->query("SET @email = ''");
// 2. 통화 저장 절차
$mysqli->query("CALL get_user_email(1, @email)");
// 3. 사용해야합니다 next_result() 결과 세트를 지우십시오
while ($mysqli->more_results()) {
$mysqli->next_result();
$result = $mysqli->store_result();
if ($result) {
$result->free();
}
}
// 4. 얻다 OUT 매개 변수
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();
echo "사용자의 이메일 주소는 다음과 같습니다: " . $row['user_email'];
$mysqli->close();
?>
Call 문을 호출 한 후 MySQL은 실제로 하나 이상의 암시 적 결과 세트를 반환 할 수 있습니다. Next_result () 가 이러한 결과 세트를 지우는 데 사용되지 않으면 후속 쿼리 (예 : Select @Email )가 차단되거나 실행되지 않을 수 있습니다.
일부 개발자는 "출력 파라미터 읽기가 비어있는 문제"의 문제에 직면합니다. 실제로 저장된 절차가 성공적으로 실행되지 않았지만 이전 결과 세트가 지워지지 않았으므로 후속 쿼리가 전혀 실행되지 않습니다.
전처리 명령문을 사용하는 경우 유사한 논리를 사용할 수도 있습니다.
$stmt = $mysqli->prepare("CALL get_user_email(?, @email)");
$stmt->bind_param("i", $userId);
$userId = 1;
$stmt->execute();
// 모든 결과 세트를 정리하십시오
do {
if ($result = $stmt->get_result()) {
$result->free();
}
} while ($stmt->more_results() && $stmt->next_result());
// 얻다输出매개 변수
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();
echo "사용자의 이메일 주소는 다음과 같습니다: " . $row['user_email'];
Call을 사용하여 저장 프로 시저를 실행하는 경우 출력 매개 변수를 사용하는지 여부에 관계없이 모든 잠재적 결과 세트를 반복하려면 Next_Result ()를 호출해야합니다.
이것은 좋은 관행 일뿐 만 아니라 Out 매개 변수를 올바르게 읽을 수 있도록 전제 조건입니다. 이를 염두에두면 "결과가 읽지 않음"문제의 많은 두통을 피할 수 있습니다.
저장 프로 시저 통화에 대한 모범 사례를 보려면 개발 안내서를 방문하십시오 : https://gitbox.net/docs/mysql/stored-procedures