현재 위치: > 최신 기사 목록> 저장 프로 시저의 출력 매개 변수를 읽으려면 Next_result ()를 사용하는 방법

저장 프로 시저의 출력 매개 변수를 읽으려면 Next_result ()를 사용하는 방법

gitbox 2025-05-02

저장 프로 시저를 호출하는 것은 PHP를 사용하여 MySQL 데이터베이스를 조작 할 때, 특히 데이터베이스 수준에서 복잡한 비즈니스 로직을 캡슐화하려는 경우 일반적인 관행입니다. 그러나 많은 개발자는 ** 출력 매개 변수 (Out 매개 변수)로 저장 프로 시저를 호출 할 때 출력 매개 변수 값을 읽을 수없는 상황에 종종 발생합니다.

핵심 사항 중 하나는 Next_Result () 를 사용하는 것입니다. 이 기사에서는이 기능을 호출 해야하는 이유와 저장 프로 시저의 출력 매개 변수를 올바르게 읽는 방법을 자세히 설명합니다.

1. Next_result () 란 무엇입니까?

MySQLI 드라이버를 사용하여 여러 결과 세트 (예 : 다중 선택 또는 출력 매개 변수)를 반환하는 저장 프로 시저를 호출 할 때 MySQL은 "다중 결과 세트"형식으로 데이터를 반환합니다. next_result () 메소드는 MySQLI 드라이버가 다음 결과 세트를 읽을 준비를하는 데 사용됩니다.

next_result ()가 명시 적으로 호출되지 않고 모든 결과 세트가 통과되는 경우 일부 데이터베이스 결과 (예 : 출력 매개 변수 또는 최종 결과 세트)에 액세스 할 수 없습니다.

2. 저장된 프로세스 예제

먼저 입력 매개 변수와 출력 매개 변수가있는 간단한 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 매개 변수를 통해 반환합니다.

3. PHP는 저장된 절차를 호출합니다

 <?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();
?>

4. 다음 _result () 가 키 인 이유는 무엇입니까?

Call 문을 호출 한 후 MySQL은 실제로 하나 이상의 암시 적 결과 세트를 반환 할 수 있습니다. Next_result () 가 이러한 결과 세트를 지우는 데 사용되지 않으면 후속 쿼리 (예 : Select @Email )가 차단되거나 실행되지 않을 수 있습니다.

일부 개발자는 "출력 파라미터 읽기가 비어있는 문제"의 문제에 직면합니다. 실제로 저장된 절차가 성공적으로 실행되지 않았지만 이전 결과 세트가 지워지지 않았으므로 후속 쿼리가 전혀 실행되지 않습니다.

5. 고급 : 전처리 문을 사용하십시오

전처리 명령문을 사용하는 경우 유사한 논리를 사용할 수도 있습니다.

 $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'];

6. 요약

Call을 사용하여 저장 프로 시저를 실행하는 경우 출력 매개 변수를 사용하는지 여부에 관계없이 모든 잠재적 결과 세트를 반복하려면 Next_Result ()를 호출해야합니다.

이것은 좋은 관행 일뿐 만 아니라 Out 매개 변수를 올바르게 읽을 수 있도록 전제 조건입니다. 이를 염두에두면 "결과가 읽지 않음"문제의 많은 두통을 피할 수 있습니다.

저장 프로 시저 통화에 대한 모범 사례를 보려면 개발 안내서를 방문하십시오 : https://gitbox.net/docs/mysql/stored-procedures