use test; drop table if exists t8; CREATE TABLE t8(s1 INT,PRIMARY KEY(s1)); drop procedure if exists handlerdemo; DELIMITER $$ CREATE PROCEDURE handlerdemo() BEGIN declare xx int default 4; DECLARE oh_no condition for sqlstate '23000'; #DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1; declare exit handler for oh_no set @info='违反主键约束'; SET @X=1; INSERT INTO t8 VALUES(1); SET @X=2; INSERT INTO t8 VALUES(1); SET @X=3; END
저장 프로시저 호출
/* 调用存储过程*/ CALL handlerdemo(); /* 查看调用存储过程结果*/ SELECT @X,@info;
경험:
1. 명령문 종결자
아마도 mysql은 저장 프로시저와 사용자 정의 함수를 하나의 명령문으로 간주하므로 저장 프로시저의 여러 명령문은 ";"으로 구분하여 재정의하면 됩니다. 터미네이터.
일반적으로 저장 프로시저가 시작되기 전에
delimiter //
저장 프로시저가 작성된 후 정의를 복원하는 것과 같이 새 종료자를 정의할 수 있습니다. delimiter;
2. 변수
MySQL 변수는 SQL SERVER와 동일하며 @X 형식이지만 선언이 필요하지 않고 사용할 수 있습니다. 곧장.
저장 프로시저에서 변수는 @일 필요는 없지만 선언해야 합니다. 그리고 이 명령문은 이 예와 같이 저장 프로시저(?)의 헤드에 배치되어야 합니다. 그렇지 않으면 오류가 보고됩니다. 정말 이상합니다. 한편으로는 변수를 선언하지 않고 사용할 수 있는 경우도 있고, 다른 한편으로는 선언 위치를 제한해야 하는 경우도 있는데, 이는 혼란스럽고 약간 캐주얼해 보입니다.
저장 프로시저 내부의 변수는 해당 범위가 저장 프로시저로 제한됩니다. 하지만 @가 붙은 변수는 세션과 연결에 걸쳐 있는 것처럼 보이고 전역 변수처럼 보입니까? 위의 예와 같습니다.
3. 조건 및 처리
통화 처리 조건을 정의합니다. 위 예시와 같습니다:
DECLARE oh_no condition for sqlstate '23000'; #DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1; declare exit handler for oh_no set @info='违反主键约束';
위 내용은 더 많은 관련 내용을 보시려면 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요. )! 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!