MySQL ストアド プロシージャの原理と使用法の詳細な説明

MySQL ストアド プロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考までに、詳細は以下の通りです。

ストアド プロシージャには、一連の実行可能な SQL ステートメントが含まれています。ストアド プロシージャは MySQL に保存され、その名前を呼び出すことで実行できます。

ストアドプロシージャの利点

#1. プログラムによって書かれたSQL文を置き換えて、プログラムをSQLから切り離すために使用する

#2. サーバーを再起動せずにストアドプロシージャを直接変更することで、ビジネスロジック(またはバグ)を修正できます。

#3. 実行速度が速い。ストアド プロシージャをコンパイルすると、1 つずつ実行するよりも高速になります。

#4. 特に同時実行性の高い状況では、ネットワーク転送を削減します。これは大きな利点です。ストアド プロシージャはデータベース サーバー上で直接実行され、すべてのデータ アクセスはサーバー内で実行されます。他の端末にデータを転送する必要はありません。

ストアドプロシージャの欠点

1. SQL 自体は、いくつかの制御 (割り当て、ループ、例外処理など) を備えた構造化クエリ言語ですが、オブジェクト指向ではなく、本質的には手続き型です。複雑なビジネス ロジックに直面すると、手続き型処理は非常に困難になります。これは致命的な欠陥であり、単純なロジックを持つビジネスにしか適用できないということです。

2. デバッグが容易ではない。基本的に優れたデバッガーはなく、デバッグには print がよく使用されますが、この方法を使用して数百行に及ぶストアド プロシージャをデバッグするのは悪夢です。まあ、それは大したことではありません。C#/Java でも悪夢のようなコードを書くことができます。

3. キャッシュを適用する方法はありません。キャッシュにはグローバル一時テーブルなどの方法もありますが、これもデータベースへの負担を増加させます。キャッシュの同時実行性が深刻で、頻繁にロックが必要な場合は、効率が心配になります。

4. データベースのカット(水平カットまたは垂直カット)に対応できません。データベースが分割されると、ストアド プロシージャはデータがどのデータベースに格納されているかを認識しなくなります。

パラメータなしのストアドプロシージャ

区切り文字 //
プロシージャ p1() を作成する
始める
  ブログから*を選択します。
  blog(name,sub_time) に値 ("xxx",now()) を挿入します。
終わり //
区切り文字 ;

#mysqlでp1()を呼び出す

#Python で pymysql に基づいて cursor.callproc('p1') を呼び出す
print(カーソル.fetchall())

パラメータ付きストアドプロシージャ

ストアド プロシージャの場合、次の 3 つのカテゴリに分類されるパラメーターを受け取ることができます。

#inはパラメータを渡すためにのみ使用されます
#outは戻り値にのみ使用されます
#inoutを渡して戻り値として使用することができます

ストアドプロシージャ

mysql> emp から * を選択します。
+----+----------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+----------+-----+--------+
| 1 | 張さん | 18 | 1 |
| 2 | リシ | 19 | 1 |
| 3 | エゴン | 20 | 2 |
| 5 | アレックス | 18 | 2 |
+----+----------+-----+--------+
4 列セット (0.30 秒)
mysql> 区切り文字 //
mysql> プロシージャ p2 を作成します (n1 には int、n2 には int)
  -> 開始
  -> id >n1 かつ id <n2 の場合、emp から * を選択します。
  -> 終了 //
クエリは正常、影響を受けた行は 0 行 (0.28 秒)
mysql> 区切り文字;
mysql> p2(1,3) を呼び出す
  -> ;
+----+------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+------+-----+--------+
| 2 | リシ | 19 | 1 |
+----+------+-----+--------+
セット内の1行(0.07秒)
クエリは正常、影響を受けた行は 0 行 (0.07 秒)

#Python で pymysql に基づいて cursor.callproc('p2',(1,3)) を呼び出す
print(カーソル.fetchall())

それなし

mysql> 区切り文字 //
mysql> プロシージャ p3 を作成します (in n1 int、out res int)
  -> 開始
  -> id >n1 の場合、emp から * を選択します。
  ->res=1 を設定します。
  -> 終了 //
クエリは正常、影響を受けた行は 0 行 (0.28 秒)
mysql> 区切り文字;
mysql> @res=0 を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> p3(3,@res); を呼び出します。
+----+------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+------+-----+--------+
| 5 | アレックス | 18 | 2 |
+----+------+-----+--------+
セット内の 1 行 (0.00 秒)
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> @res を選択します。
+------+
| @res |
+------+
| 1 |
+------+
セット内の 1 行 (0.00 秒)

#python の pymysql に基づいて cursor.callproc('p3',(3,0)) を呼び出します #0 は set @res=0 と同等です
print(cursor.fetchall()) #select のクエリ結果を照会します。cursor.execute('select @_p3_0,@_p3_1;') #@p3_0 は最初のパラメータを表し、@p3_1 は 2 番目のパラメータ、つまり戻り値を表します。print(cursor.fetchall())

inout の例

区切り文字 //
プロシージャp4を作成します(
  入出力 n1 int
)
始める
  id > n1 のブログから * を選択します。
  n1 = 1 に設定します。
終わり //
区切り文字 ;
#mysqlでset @x=3を呼び出します。
p4(@x) を呼び出します。
@x を選択;
#Python で pymysql に基づいて cursor.callproc('p4',(3,)) を呼び出す
print(cursor.fetchall()) #select のクエリ結果を照会します。cursor.execute('select @_p4_0;')
print(カーソル.fetchall())

取引

#導入区切り文字 //
      プロシージャp4を作成します(
        アウトステータス int
      )
      始める
        1. 例外が発生した場合に{を実行することを宣言します。
          ステータスを 1 に設定します。
          ロールバック;
        }
        取引開始 - Qin Bing のアカウントから 100 を減算
          -- ファン・シャオウェイのアカウントに90を追加
          -- 張根のアカウントプラス10
          専念;
        終了ステータスを 2 に設定します。
      終わり //
      区切り文字 ;
#区切り文字を実装する //
プロシージャp5を作成します(
  OUT p_return_code tinyint
)
始める 
  sqlexception の終了ハンドラを宣言する 
  始める 
     -  エラー 
    p_return_codeを1に設定します。 
    ロールバック; 
  終わり; 
  sqlwarning の終了ハンドラを宣言する 
  始める 
     - 警告 
    p_return_codeを2に設定します。 
    ロールバック; 
  終わり; 
  トランザクションを開始します。 
    DELETE from tb1; #実行に失敗しました insert into blog(name,sub_time) values('yyy',now());
  専念; 
   - 成功 
  p_return_code = 0 を設定します。#0 は実行成功を表します END //
区切り文字 ;

#mysql のストアド プロシージャを呼び出します。@res=123 を設定します。
p5(@res) を呼び出します。
@res を選択します。

#python で pymysql に基づくストアド プロシージャを呼び出す cursor.callproc('p5',(123,))
print(cursor.fetchall()) #select のクエリ結果を照会します。cursor.execute('select @_p5_0;')
print(カーソル.fetchall())

ストアドプロシージャの実行

mysqlで実行

-- パラメータなしでproc_name()を呼び出す
-- パラメータ付き、すべて
proc_name(1,2)を呼び出す
-- パラメータはin、out、inoutです
@t1=0 を設定します。
@t2=3 を設定します。
proc_name(1,2,@t1,@t2) を呼び出す

pymsqlで実行

#!/usr/bin/env python
# -*- コーディング:utf-8 -*-
pymysqlをインポートする
conn = pymysql.connect(ホスト='127.0.0.1'、ポート=3306、ユーザー='root'、パスワード='123'、データベース='t1')
カーソル = conn.cursor(cursor=pymysql.cursors.DictCursor)
# ストアドプロシージャを実行します。cursor.callproc('p1', args=(1, 22, 3, 4))
# 実行後にパラメータを取得して保存します cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
結果 = cursor.fetchall()
conn.commit()
カーソルを閉じる()
接続を閉じる()
印刷(結果)

ストアドプロシージャの削除

プロシージャ proc_name を削除します。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の if 文と case 文の概要
  • MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明
  • 複数の値を返す MySQL ストアド プロシージャ メソッドの例
  • MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法
  • ストアド プロシージャでエラー状態をトリガーする mysql ストアド プロシージャの分析例 (SIGNAL および RESIGNAL ステートメント)
  • MySQL ストアド プロシージャのエラー処理例の詳細な説明
  • MySQL ストアド プロシージャでの変数の定義と割り当て
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySQL ストアド プロシージャの例 (トランザクション、出力パラメータ、ネストされた呼び出しを含む)
  • MySql ストアド プロシージャと関数の詳細な説明
  • MySQL ストアド プロシージャで if ステートメントを使用する詳細な例

<<:  VirtualBox ソフトウェアのダウンロードとインストール、および Linux 環境でのインストールと展開に関する詳細なグラフィック チュートリアル

>>:  Vueルーティング相対パスジャンプメソッド

推薦する

Zabbix動的実行監視収集スクリプトの実装原理

Zabbix カスタム スクリプトを使用して監視データを収集する場合、通常、次の問題が発生します。サ...

体験をデザインする: ボタンには何があるか

<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...

MySQL トランザクション自動コミット自動コミット操作

MySQL のデフォルトの動作モードは自動コミット モードです。つまり、明示的にトランザクションを開...

HTML ファイルにファイルの内容を含める方法の概要

フォーラムでは、ネットユーザーから「HTML ファイル内の別の HTML ファイルの内容を読み取るこ...

mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)

1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...

InnoDBのインデックスページ構造、挿入バッファ、適応ハッシュインデックスについての簡単な説明

InnoDB インデックスの物理構造すべての InnoDB インデックスは Btree インデックス...

コメント付きのスネークゲームを実装する js

この記事の例では、スネークゲームを実装するためのjsの具体的なコードを参考までに共有しています。具体...

Alibaba Cloud CentOS7 サーバーの nginx 構成と FAQ の分析

序文:この記事は、jackyzm のブログ https://www.cnblogs.com/jack...

JavaScript関数の詳細な紹介

任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...

波効果を作成するための CSS のトリック

純粋な CSS を使用して波の効果を実現することは、常に非常に困難でした。 波形曲線を実現するにはベ...

Linuxでバージョン情報を表示する方法

Linux でバージョン情報を表示する方法。ビット数、バージョン情報、CPU コア情報、CPU 固有...

jQueryは、マウスをドラッグしてdivの位置とサイズを変更する方法を実装しています。

Windows フォームと同様の効果を得るには、中央をドラッグして div の位置を変更し、端をド...

スキン効果を実現するJavaScript(背景の変更)

この記事では、スキン変更効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

jQueryは広告を上下にスクロールする効果を実現します

この記事では、広告を上下にスクロールする効果を実現するためのjQueryの具体的なコードを参考までに...

MySQLで適切なインデックスを選択する方法

まずは栗を見てみましょう EXPLAIN select * from employees where...