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はストアドプロシージャとカスタム関数を1つのステートメントとして扱うため、ストアドプロシージャは複数のステートメントを「;」で区切ります。競合を避けるために、区切り文字を使用してターミネータを再定義する必要があります。
通常、
delimiter //
ストアド プロシージャが作成された後、定義を復元します: delimiter;
変数
MySQL 変数 2. , 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 中国語 Web サイト (www.php.cn) に注目してください。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。