mysqlチュートリアルのストアドプロシージャの作成と注意事項
最初のmysqlストアドプロシージャは、sqlserver2005で記述されたストアドプロシージャとは少し異なります。
次に、mysqlサードパーティエンタープライズマネージャーsqlyogent.exeを使用してデバッグする場合、ストアドプロシージャと一般的なクエリステートメントの記述を分離する必要があります。後で気付いたので、とても怒っていました(sqlserver2005エンタープライズマネージャーを使用することもあります。習慣エディターの)。ナンセンスな話をやめ、ストアドプロシージャを作成し、次の点に注意してください。
1つ目は、区切り文字//を定義することです。これは、//を文の終わりとして使用することを意味します(これは非常に重要です。私が書いたストアドプロシージャの構文はまったく間違っていませんが、失敗するだけです。元のセミコロン:;区切り文字は通知ですmysqlクライアントが完了記号を入力し、ストアドプロシージャの多くにセミコロンがあります。結果が実行されると、ストアドプロシージャのセクションが実行のために多くのセクションに分割されます。
次に、「残念ながら」サードパーティのmysqlクライアントsqlyogent.exeを選択する場合は、データベースチュートリアルディレクトリのストアドプロシージャを右クリックして[新しいストアドプロシージャ]を選択し、ストアドプロシージャステートメントを右側のポップアップウィンドウ、通常のクエリアナライザでは入力が無効です。これは面倒なレッスンです。
第3に、ストアドプロシージャのパラメータを中国語で入力する場合は、ストアドプロシージャの定義後に文字セットgbkコードを追加する必要があります。そうしないと、次のような中国語のパラメータを使用してストアドプロシージャを呼び出すときにエラーが発生します。
create procedure countpro(out a_out int、in b_date date、in unit_name varchar(45)character set gbk)
4番目に、ストアドプロシージャでファジークエリが必要な場合は、selectステートメントのどこからでも「%content%」のように使用します。 % ';パラメータを定義するには、次を使用します:set wherestr = "'%" + wherestr + "% '";スプライシングステートメントの5番目、最後にターミネータを復元します:delimiter; is;ステートメントのターミネータとして
mysqlストアドプロシージャの例を見てみましょう
- インスタンスデータベースの
作成データベースdb5の作成;
db5の使用;
2.簡単なワークシートを作成し、データを挿入します
。createtable t(s1 int);
t values(5);に挿入します。
3.プログラムインスタンスの作成手順の作成例
作成手順p1()select * from t;
sqlステートメントのストアドプロシージャの最初の部分はcreateprocedureで、
2番目の部分はプロシージャ名です。上記の新しいストアドプロシージャの名前はp1です。 。
3番目の部分はパラメータリスト()で、4番目の部分はプログラムの本体である「select * fromt」です。
*****ストアドプロシージャ本体ではどのような種類のmysqlステートメントが有効ですか?
ストアドプロシージャの本体には、
(set、commit、rollback)を含むすべての有効なSQLデータベース定義言語、挿入、更新、削除、削除、作成、置換などのステートメントを含めることができます。ただし、コードにmysql拡張機能が含まれている場合は、コードは移植できません。
- ストアドプロシージャを呼び出すには、callとプロシージャ名と角かっこだけを入力する必要があります。
p1();を呼び出します。
5.プロセス
作成プロシージャp2()言語sqlの特性句
は決定論的
SQLセキュリティ定義者
コメントではありません''
select current_date、rand()from t;
6.parameters parameter
create procedure p5()------; //パラメータリストは空ですcreateprocedure
p5([in] name data-type)---- //入力パラメータinはオプションであり、デフォルトはパラメータです
。increateプロシージャp5(out name data-type)----- //出力パラメータ
outcreate procedure p5(inout then data-type)----- //入力パラメータまたは出力パラメータ
----例の入力パラメータ。
create procedure p5(p int)set @ x = p;
call p5(12345);
select @x;
----出力パラメータoutの例createprocedure
p6(out p int)set p = -5;
call p6(@y);
select @y;
-
複合ステートメント:プロシージャに複数のステートメントがある場合は、開始/終了ブロックが必要です。ここで変数を定義し、フローを制御できます。
最初にコマンド区切り文字を実行し
ます//プロシージャを作成しますp7()
begin
set @ a = 6;
set @ b = 5;
insert into t values(@a);
select s1 * @ a from t where s1> = @b;
end; //-----複合文で宣言変数
プロシージャP8を(作成)が
始まる
INTを宣言;
宣言B INTを、
設定= 5;
セットB = 5;
t値への挿入();
セレクトS1 *からt where s1> = b;
end; //含有default默认语句舌设定语句的例子 create procedure p9() begin declare a ,b int default 5;
t値に挿入(a);
s1> = bであるtからs1 * aを選択します。
終わり;// -
スコープスコープの問題:内部変数は、そのスコープのスコープ内でより高い優先度を享受します。実行が終了
変数に達すると、内部変数は消えます。この時点で、内部変数はすでにスコープ外にあり、変数は表示されなくなります。
宣言された変数は、ストアドプロシージャの外部では見つかりませんが、outパラメータを使用して
その値を保存するか、セッション変数にその値を割り当てることができます。
プロシージャp11()の作成
開始
宣言x1 char(5)デフォルト「外部」;
開始
宣言x1 char(5)デフォルト「内部」;
選択x1;
終了;
選択x1;
終了; //
/ *********************************ストアドプロシージャの条件ステートメント********** **************************** /
-
if-then -else语句
createプロシージャp12(パラメータint内)はvarintの宣言を
開始
します。
set var = parameter + 1;
var = 0の場合
、t値に挿入します(17);
次の場合に終了します。
parameter = 0の場合、
t set s1 = s1 +1を更新します。
それ以外の場合は、
t set s1 = s1 +2を更新します。
次の場合に終了します。
終わり;// -
ケース命令:我々は真と偽の条件についての詳細な判断をする必要がある場合は、我々はcase文を使用することができます
(パラメータint型で)手続きP13を作成
開始
宣言のvar int型;
セットVAR =パラメータ+ 1;
ケースVAR
0はその後に挿入するときt values(17);
1の場合はtvalues(18)に
挿入し、それ以外の
場合はt values(19)に挿入し
ます。endcase ; end; //
/ *****************************ループステートメント****************** ****************** /
-
while····終了while; 循環语句
createプロシージャp14()はvarintの宣言を
開始
します。
var = 0に設定します。
var <6は
t値(var)に挿入します。
set var = var + 1;
終了します。
終わり;// -
繰り返し····末端反復は、操作が行われた後は、結果を確認チェックしながら実行する前に、結果ながら
()プロシージャP15を作成
開始
宣言V INTを、
集合V = 0;
繰り返し
t値への挿入(V)
セットv = v + 1;
v> = 5
まで終了リピート;
終了; // -
ループ·····終了ループ;ループループは、whileループと同様の初期条件を必要と
せず、繰り返しループのような終了条件も必要ありません。leaveステートメントの意味は、ループを終了し、
プロシージャp16()を作成することです。
開始
;宣言V INTを
、集合V = 0
ループ:loop_lable
t値への挿入(V)
;セットV = V + 1
、V> = 5、次いで場合
loop_lableを残す;
エンド場合は、
エンドループ;
END; // -
Lablesラベル:begin repeat whileまたはloopステートメントの前にラベルを使用でき、ステートメントラベルは
正当なステートメントの前にのみ使用できます。ループから飛び出して、実行命令を複合ステートメントの最後のステップに到達させることができます。
/ ***************************** Iterate Iteration ***************** * ******************** /
- 反復:複合文のラベルを引用することにより、
()プロシージャP20を作成
開始
宣言V INTを、
集合V = 0;
loop_lable:ループ
場合V = 3次に
セットV = V + 1;
; loop_lable反復
END IF;
Tへの挿入values(v);
set v = v + 1;
if v> = 5 then
Leave loop_lable;
end if;
end loop;
end; //