프로시저를 호출할 때 단순하게 프로시저의 이름만 지정하는 방법과 이름 뒤에 소괄호를 붙여서 실행하는 방법 두 가지를 배웠습니다.
프로시저 이름 뒤에 소괄호를 붙여서 호출을 한다는 것은 소괄호 안에 매개변수 인자와 같은 값을 전달할 수 있다는 확장된 의미일 것입니다. 프로시저는 마치 함수와 유사하기 도 합니다. 차이점이라면 반환값이 없다는 것입니다.
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 )