ホームページ > データベース > mysql チュートリアル > Mysql 変数、カーソル、ストアド プロシージャの適用

Mysql 変数、カーソル、ストアド プロシージャの適用

齐天大圣
リリース: 2020-05-29 10:41:29
オリジナル
1762 人が閲覧しました

Mysql は 5.0 からストアド プロシージャをサポートしています。平たく言えば、ストアド プロシージャはカプセル化された SQL ですが、SQL だけではなく、通常、変数、条件判断、ループ本体、カーソルなども含まれます。

ストアド プロシージャの役割

多くのシナリオでは、必要な新しいデータを生成するために複数のテーブルのデータを処理する必要があります。これら複数のテーブルのデータは、接続などの問い合わせ方法では与えることができず、判定とループによってのみ生成することができます。現時点では、ストアド プロシージャを使用してこれを実現できます。

さらに、ストアド プロシージャには、パフォーマンスの向上やネットワーク リクエストの削減などの利点もあります。ストアド プロシージャを使用せずに実装する場合、PHP を使用して実装する場合は、MySQL を複数回呼び出して複数のリクエストを生成する必要があります。

もちろん、このストアド プロシージャには欠点がないわけではなく、比較的デバッグされており、クラスタリングはサポートされていません。

ストアド プロシージャの作成

ストアド プロシージャを作成するための構文は次のとおりです。

CREATE PROCEDURE 过程名(参数) 
BEGIN
 过程体
END
ログイン後にコピー

パラメータに関しては、パラメータを設定するための構文は

[IN|OUT|INOUT] パラメータ名のタイプ

  • IN は、変数がプロシージャ本体内でのみ使用できることを示します

  • OUT は、変数 Variables がプロセスの外部でのみ使用できることを示します。

  • INOUT は、変数がプロセスの内部と外部で使用できることを示します

次に、最も単純なストアド プロシージャを作成しましょう。

CREATE PROCEDURE p1(IN x INT) 
BEGIN
  SELECT x;
END;
ログイン後にコピー

変数

MySQL の変数は、グローバル変数とローカル変数に分類されます。

グローバル変数は @ で始まり、宣言する必要はありません。直接使用できます。たとえば、

SET @name='gwx';
ログイン後にコピー

のようにローカル変数を最初に宣言する必要があります。ローカル変数の初期化方法は次のとおりです。次のように:

DECLARE x int DEFAULT 0;
ログイン後にコピー

に従ってみましょう 保存されたプロセスを完了するには、距離に応じて運賃を計算します。3 キロメートル以内の距離は 6 元として計算され、それを超える距離は 1 キロメートルあたり 1.2 元として計算されます。 ##

-- distance 路程
CREATE PROCEDURE p1(in distance FLOAT)
BEGIN
  DECLARE d_money FLOAT DEFAULT 0; 
    IF distance>3 THEN 
       SET d_money=6+(distance-3)*1.2;
    ELSE
      SET d_money=6;
    END IF;
    SELECT d_money;
END;
ログイン後にコピー

Cursor

PHP と比較すると、カーソルは foreach に似ており、ループするたびに 1 つのレコードを取得します。

カーソルの定義:

declare 游标名 CURSOR FOR SELECT 语句
ログイン後にコピー

カーソルの開閉:

  • カーソル名を開く

  • close Cursor Name

Get Cursor data:

FETCH 游标名 INTO 变量名
ログイン後にコピー

とても簡単に導入できますが、使い方が分からず誰しも疑問に思うでしょう。 。次に、例を見て、その例からカーソルの使用方法を学びましょう。

カーソルを使用して、test_cursor テーブル内のすべての数値を累積するという非常に単純な関数を実行します。

CREATE TABLE IF NOT EXISTS test_cursor(
  num1 INT(10) UNSIGNED NOT NULL DEFAULT 0,
  num2 INT(10) UNSIGNED NOT NULL DEFAULT 0
);    
INSERT INTO test_cursor(num1,num2) VALUES(1,1),(2,2),(3,3);
 
CREATE PROCEDURE `test_cursor`()
BEGIN
    DECLARE sum INT(10) DEFAULT 0;
    DECLARE n1,n2 INT(10);
    DECLARE done INT DEFAULT 0;
    
    DECLARE cur CURSOR FOR SELECT num1,num2 FROM test_cursor; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
    
    OPEN cur; -- 打开游标
    WHILE done=0 DO      
        FETCH cur INTO n1,n2;
        
        IF done=0 THEN -- 注意这里为什么加IF条件,不加的话,最后一个值会被多加一遍         
      SET sum=sum+n1+n2;
        END IF;
    END WHILE;
    CLOSE cur;  -- 关闭游标
    
    SELECT sum;
END
ログイン後にコピー
ここで注意すべき点がいくつかありますが、まず、カーソルを宣言する前にローカル変数の定義を宣言する必要があります。

さらに、ここで DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET doned=1; は、カーソルが終了してループを終了した後、done が 1 に設定されることを意味します。

以上がMysql 変数、カーソル、ストアド プロシージャの適用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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