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ルーティング相対パスジャンプメソッド

推薦する

vue3.0共通コンポーネントの自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

ネイティブ JS で音楽プレーヤーを実装するためのサンプル コード

この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...

Youku 動画から 30 秒の広告コードを削除する 2 つの方法

誰もがこんな気持ちになったことがあると思います。30 秒の広告が入った動画を見ると、とても不快に感じ...

MySQLでSELECT文が実行される仕組み

目次1. マクロの観点からMySQLを分析する2. SQL ステートメントを実行するには、どの程度の...

トランザクションとロックを表示するための MySQL の一般的なステートメント

データベース内のトランザクションとロックを表示するための一般的なステートメントトランザクションの待機...

HTMLでのラジオ値の取得、割り当て、登録の詳細な説明

1. ラジオのグループ化名前が同じであれば、それらはグループであり、つまり、次のようにグループ内で選...

vue3 コンポーネントでの v-model の使用と詳細な説明

目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...

Vue3 (パート 2) Ant Design Vue の統合

目次1. Ant Design Vueを統合する2. コンポーネントの使用1. 完全な引用2. コン...

Vue プロジェクトで axios をカプセル化する方法 (http リクエストの統合管理)

1. 要件Vue.js フレームワークを使用してフロントエンド プロジェクトを開発する場合、サーバ...

MySql データベースにリモートでログインするにはどうすればよいですか?

はじめに: プロジェクトを開発するために、サーバーに MySql データベース サーバーを展開し、ロ...

MySQL 8.0.15 バージョンのインストールチュートリアル Navicat.list への接続

落とし穴1. ネット上の多くのチュートリアルでは環境変数を設定するファイル名はmy.iniと書いてあ...

HTML フォームを送信するいくつかの方法_PowerNode Java Academy

方法1: 送信ボタンから送信する <!DOCTYPE html> <html>...

IE8 互換性について: X-UA-compatible 属性の説明

問題の説明:コードをコピーコードは次のとおりです。 <meta http-equiv=&quo...