프로시저를 호출할 때 단순하게 프로시저의 이름만 지정하는 방법과 이름 뒤에 소괄호를 붙여서 실행하는 방법 두 가지를 배웠습니다.

프로시저 이름 뒤에 소괄호를 붙여서 호출을 한다는 것은 소괄호 안에 매개변수 인자와 같은 값을 전달할 수 있다는 확장된 의미일 것입니다. 프로시저는 마치 함수와 유사하기 도 합니다. 차이점이라면 반환값이 없다는 것입니다.

22.4.1 매개변수 선언

프로시저는 호출할 때 매개변수를 전달하여 실행할 수 있습니다. 매개변수는 프로시저 작성 시에 프로시저명 뒤에 있는 소괄호 안에 작성하면 됩니다.

| 쿼리 문법 |

CREATE PROCEDURE 프로시저명(변수명 데이터 타입) 

프로시저의 매개변수 선언은 변수명 + 데이터 타입 형태로 선언합니다. 프로시저의 데이터 타입은 변수명 뒤에 선언하는 것이 기존 PHP 함수와 약간의 차이점이 있습니다.

| 예제 쿼리 |

CREATE PROCEDURE mem(a INT) 
BEGIN 
SELECT * FROM members WHERE Id=a; 
END 

22.4.2 인자 전달

매개변수를 포함한 프로시저를 실행할 수 있습니다. 매개변수를 전달할 때는 프로시저에 서 지정한 데이터의 타입과 동일한 형태의 값을 사용해야 합니다.

| 쿼리 문법 |

CALL 프로시저(값); 

매개변수를 포함하고 있는 프로시저는 인자값을 넣어서 호출합니다. 인자값은 프로시저 명()의 소괄호 안에 넣으면 됩니다.

22.4.3 쿼리 실습

매개변수를 포함하는 프로시저를 생성해 보고 실행합니다.

| 콘솔 실습 화면 |

// 프로시저를 호출합니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE mem(a INT)
    -> BEGIN
    -> SELECT * FROM members WHERE Id=a;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ; 

매개변수로는 회원의 Id 값을 전달받습니다. 회원 아이디를 이용하여 회원의 정보를 출력합니다.

| 콘솔 실습 화면 |

// 프로시저를 호출합니다.
mysql> CALL mem(1);
+----+----------+-----------+----------+-------+---------+-----------+-------------------+
| Id | LastName | FirstName | Address  | City  | Country | manager   | email             |
+----+----------+-----------+----------+-------+---------+-----------+-------------------+
|  1 | hojin    | lee       | shinchon | seoul | korea   | infohojin | hojin@jinyphp.com |
+----+----------+-----------+----------+-------+---------+-----------+-------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)

매개변수를 통하여 회원 목록을 출력했습니다.

22.4.4 PHP 실습

PHP 코드를 통하여 프로시저 호출을 실습해 보도록 하겠습니다.

| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.

public function callProcedure($name,$args)
{
            if ($name) {
                $queryString = "CALL $name($args);";

                if($result = mysqli_query($this->dbcon, $queryString)) {
                    $this->msgEcho("쿼리성공] ".$queryString);
                    $rowss = "";
                    $row_cnt = mysqli_num_rows($result);
                    for ($i=0; $i<$row_cnt; $i++) {
                        $rowss[$i] = mysqli_fetch_object($result);
                    }

                    $result->free();
                    return $rowss;
                } else {
                    $this->msgEcho("Error] ".$queryString);
                }

            } else {
                $this->msgEcho("Error] 프로시저명을 적어주세요.");
            }

}

예제 파일 | pro-02.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$name = "mem";
	if($rowss = $db->callProcedure($name,1)){
		echo "tables fields = ". count($rowss) . "<br>";
 
		for($i=0;$i<count($rowss);$i++){
			echo $i."=";            
			print_r($rowss[$i]);
			echo "<br>";
		}
        
	}
 
?>

화면 출력

mysql connected!
쿼리성공] CALL mem(1);
tables fields = 1
0=stdClass Object ( [Id] => 1 [LastName] => hojin [FirstName] => lee [Address] => shinchon [City] => seoul [Country] => Korea [manager] => infohojin [email] => hojin@jinyphp.com )