Archive

Archive for the ‘procedure’ Category

MySql Bug "Calling MySQL5 stored procedures multiple times from PHP5"

January 8, 2008 Leave a comment

[참고 :  MySql Bug "Calling MySQL5 stored procedures multiple times from PHP5" ]
PHP 5와 MySQL 5를 연동하여 사용하는 조건에서 procedures를 호출(call)/query하는 도중 db접속을 까먹는 현상.

 

  • 오랫동안 db에 접근이 없다  Query를 하면 “Lost connection to MySQL server during query”같은 에러가 뜬다?
    한번 Lost Connection이 뜨고 난뒤에 다시한번 Query하면 다시 정상 작동?
  • Mysqli  Bug?
    일반 Select 구문은 여러번 실행해도 별 문제 없지만, procedure 호출을 위한 call 한번만해도 connection이 그냥 끊겨 버립니다.

 

[해결방안 또는 필요 사항]

  1. PDO 사용.
  2. 하나의 procedures 종료 후 다시 DB를 connect.
    (이때 procedures는 insert, update, select등의 연속 작업을 피하고 하나의 작업만 해야 한다)
  3. 하나의 procedures에서 모든 값을 처리 후 MYSQL_MULTI_QUERY로 해결.

 

PDO 란 무엇인가?

MYSQL_MULTI_QUERY란 무엇인가?

프로시져(Procedure) ?

June 28, 2007 Leave a comment

 

 

프로시져는 함수보다 작은 기능을 가지고 있습니다.
함수와 거의 같지만 리턴 값만 없다고 보시면 됩니다….

 

procedure 란 절차란 뜻입니다. 일종의 함수라고 봐도 무방합니다.
db 에서 일괄(batch)작업하는데 아주 훌륭하게 사용됩니다….

 

function 은 리턴값을 하나 받을 수있고, procedure 는 리턴값을 안받을 수도 여러개 받을 수도 있음…

Mysql에서 Stored Procedure 사용 예제

June 28, 2007 Leave a comment

*where : http://www.phpschool.com/gnuboard4/bbs/board.php…

1. 테이블 생성
CREATE TABLE `TranTest` (
`num` int(11) NOT NULL auto_increment,
`col01` varchar(32) default NULL,
PRIMARY KEY (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `TranTest2` (
`num` int(11) NOT NULL auto_increment,
`col01` varchar(32) default NULL,
PRIMARY KEY (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 입력 용 프로시저 생성
CREATE PROCEDURE `Prc_TranTest_Input`
(
in in_col01 varchar(32)
)
BEGIN
INSERT INTO TranTest SET col01 = in_col01;
END;

3. SELECT 용 프로시저 생성
CREATE PROCEDURE `Prc_TranTest_Select`
(
in in_col01 varchar(32)
)
BEGIN
SELECT num, col01 FROM TranTest WHERE col01 like concat(in_col01, ‘%’) ;
END;

4. Transaction 용 프로시저 생성
CREATE PROCEDURE `Prc_TranTest_InError`
(
)
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ”
BEGIN
DECLARE dbErr int default 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET dbErr = -1;
START TRANSACTION;
INSERT INTO TranTest SET col01 = ‘1234′;
INSERT INTO TranTest2 SET col012 = ‘1234′; //일부러 에러값을 내기위해 칼럼명을 다르게 적습니다.
IF dbErr < 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;

5. PHP 를 이용하여 SELECT 및 입력하기
$mysqli = new mysqli(“localhost”, “USERID”, “USERPW”, “USERDB”);
if (mysqli_connect_error()) {
printf(“Connect Failed : %s\n”, mysqli_connect_error());
exit;
}
$mysqli->query(“set names utf8″);

//SELECT
if($qry = $mysqli->query(“Call Prc_TranTest_Select(‘123′)”)) {
$rs = $qry->fetch_object();
echo $rs->col01;
}

//INSERT TranTest;
$mysqli->query(“Call Prc_TranTest_InError()”);