mysql 学習メモ: ストアド プロシージャ

黄舟
リリース: 2017-02-15 10:57:54
オリジナル
990 人が閲覧しました

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) に注目してください。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート