MySql5.0 以降ではストアド プロシージャがサポートされています。最近、これを勉強する時間がありました。
形式:
CREATE PROCEDURE プロセス名 ([プロセスパラメータ[,...]]) 【特徴…】 プロセスボディ |
CREATE FUNCTION 関数名 ([関数パラメータ[,...]]) RETURNS 戻り値の型 【特徴…】 機能本体 |
プロシージャパラメータ:
[ IN | INOUT ] パラメータ名 パラメータタイプ
関数パラメータ:
パラメータ名 パラメータタイプ
戻り値のタイプ:
有効な MYSQL データタイプ
特性:
言語 SQL | [そうではない] 決定的 | { SQL を含みません SQL データを読み取ります | | SQL セキュリティ { 定義者 | 実行者 } | コメント '文字列' |
プロシージャ本体/関数本体: 形式は次のとおりです。
ここでは独自の機能については気にしません。これらは SQL 仕様と互換性がないため、特性 (機能) の関連内容は考慮されません。
//
開発プロセス中に注意すべき点がいくつかあります。
1. ストアド プロシージャのコメント: MySQL は -- または /**/ コメントの使用をサポートします。前者は行コメント、後者はセグメント コメントです
。変数は最初に宣言で宣言され、参照用に @ プレフィックスを付けて直接変更できます。
ただし、MySQL 管理者マネージャーを使用して直接編集する場合、
ストアド プロシージャまたは関数を自動的にインポートする場合は、
次の関数テキストを直接入力できます。 MySQL のデフォルトでは " ";" が区切り文字であるため、スクリプト内では、プロシージャ本体の各文が
MySQL によってストアド プロシージャとしてコンパイルされ、コンパイル プロセスでエラーが報告されるため、DELIMITER キーワードを使用する必要があります。
現在のセグメント区切り文字が使い果たされたときに区切り文字が復元されること
を事前に宣言します
。 以下に示すように:
区切り文字 $$ ストアド プロシージャとストアド関数 デリミタ; |
4. MySQL は多数の組み込み関数をサポートしており、その一部は oracle、informix、sybase などの大規模な商用データベースと一貫性がありますが、名前が一致しない関数や一貫した関数を持つ関数もあります。これは、データベース開発から移行した DBA にとって特に便利です。これらの点に注意してください。
5. ストアド プロシージャまたは関数のデバッグ: MySQL が提供するさまざまなツールキットをまだ研究していないため、デバッグ ツールが提供されているかどうかはわかりませんが、ビジネス プロセスのデバッグに関しては、コンパイル エラーを見つけるのは比較的簡単です。比較を使用する 愚かな方法は、デバッグ テーブルを作成し、パッケージ本体の各プロセス ポイントにレコードを挿入して、プログラムの実行プロセスを観察することです。これは、より便利で愚かな方法でもあります。 ^_^
以下は、文字列暗号化アルゴリズムを提供する 2 つの例です。同じ入力パラメーターを使用して呼び出すたびに、異なる暗号化結果が得られます。
このアルゴリズムは比較的単純ですが、強力ではありません。これらは、次のような関数とプロシージャの形式で実装されます。
(1) 関数
例:
/**/ セット len=LENGTH(インパス); if((len<=0) または (len>10)) then 戻る ""; 次の場合は終了します。
セットしますffset=(SECOND(NOW()) mod 39)+1; /*秒に基づくモジュロ*/ /*testb 値に挿入(offset,'offset: ');*/ set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_'; /*キー*/ set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
セットしますutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1)); /* testtb に挿入 value(2,outpass);*/ set string_out=CONCAT(string_out,string_out); @i=0 を設定します。 繰り返す @i=@i+1 を設定します。 セットしますutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING) (inpass,@i,1))+offset,1)); /* testtb 値に挿入 (@i+2,outpass);*/ まで (@i>=len) 繰り返しを終了します。
リターンアウトパス。 終わり |
CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)
BEGIN
宣言 string_in varchar(39)
;
宣言 オフセットtinyint
(30) デフォルト '
;
/*declare i tinyint;*/
(2) 処理
CREATE PROCEDURE `pro_addmm`(IN インパス varchar(10),OUT アウトパス varchar(11)) 始める string_in varchar(39) を宣言します。 string_out varchar(78) を宣言します。 オフセット tinyint(2) を宣言します。 len tinyint を宣言します。
セットしますutpass=';
セット len=LENGTH(インパス); if((len<=0) または (len>10)) then セットしますutpass='; それ以外 セットしますffset=(SECOND(NOW()) mod 39)+1;
set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_'; set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
セットしますutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
set string_out=CONCAT(string_out,string_out); @i=0 を設定します。 繰り返す @i=@i+1 を設定します。 セットしますutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING) (inpass,@i,1))+offset,1)); まで (@i>=len) 繰り返しを終了します。 次の場合は終了します。 終わり |
実行結果は以下の通りです。
mysql> call pro_addmm('zhouys',@a); クエリは OK、影響を受ける行は 0 (0.00 秒)
mysql> SELECT @a; +--------+ | @a | +--------+ | U_PI6$4 | +--------+ セット内の 1 行 (0.00 秒)
mysql> call pro_addmm('zhouys',@a); クエリは OK、影響を受ける行は 0 (0.00 秒)
mysql> SELECT @a; +--------+ | @a | +--------+ | 9P8UEGM | +--------+ セット内の 1 行 (0.00 秒)
mysql> select fun_submm('U_PI6$4'); +---------------------+ | fun_submm('U_PI6$4') | +---------------------+ | チョウイ | +---------------------+ セット内の 1 行 (0.00 秒) |
暗号化アルゴリズムにはいくつかの弱点があります。
1. 大文字と小文字をサポートしていない
2. 中国語をサポートしていない
3. 暗号化の強度が十分ではない
興味のある人は復号関数の書き方を勉強してください。ここでは詳細に立ち入りません。