ホームページ >バックエンド開発 >PHPチュートリアル >mysql ストアド プロシージャの詳細な説明と、PHP から MYSQL ストアド プロシージャを呼び出す例
この記事では主に mysql ストアド プロシージャの詳細な説明と、PHP による MYSQL ストアド プロシージャの呼び出し例を紹介します。必要な方はぜひ参考にしてください。 mysql ストアド プロシージャの説明
1. 过 ストレージ プロシージャの概要
よく使用される操作データベース言語 SQL ステートメントは、まずコンパイルしてから ストアド プロシージャ を実行する必要があります。特定の関数を完了するための SQL
ステートメントのセット。これはコンパイルされてデータベースに保存され、ユーザーはストアド プロシージャの名前を指定し、(ストアド プロシージャにパラメータがある場合) 呼び出して実行します。それ。 ストアド プロシージャは、作成されてデータベースに保存されるプログラム可能な関数です。これは、SQL ステートメントといくつかの特別な制御構造で構成されます。ストアド プロシージャは、異なるアプリケーションやプラットフォームで同じ機能を実行する場合、または特定の機能をカプセル化する場合に便利です。データベース内のストアド プロシージャは、プログラミングにおけるオブジェクト指向アプローチのシミュレーションとみなすことができます。これにより、データへのアクセス方法を制御できます。 ストアド プロシージャには通常、次の利点があります:
(1) ストアド プロシージャは、SQL
言語の機能と柔軟性を強化します。ストアド プロシージャはフロー制御ステートメントを使用して作成でき、柔軟性が高く、複雑な判断やより複雑な操作を実行できます。
(2).ストアド プロシージャを使用すると、標準コンポーネントをプログラムできます。ストアド プロシージャを作成した後は、ストアド プロシージャの SQL ステートメントを書き直すことなく、プログラム内で複数回呼び出すことができます。また、データベースの専門家は、アプリケーションのソース コードに影響を与えることなく、いつでもストアド プロシージャを変更できます。 (3).ストアド プロシージャにより、より高速な実行速度を実現できます。特定の操作に大量の Transaction-SQL コードが含まれている場合、または複数回実行される場合、ストアド プロシージャはバッチ処理よりもはるかに高速に実行されます。ストアド プロシージャはプリコンパイルされているためです。ストアド プロシージャが初めて実行されるとき、オプティマイザによってクエリが分析および最適化され、最終的に実行プランがシステム テーブルに保存されます。バッチ処理された Transaction-SQL ステートメントは、実行されるたびにコンパイルおよび最適化する必要があり、速度は比較的遅くなります。 (4).ストアド プロシージャにより、ネットワーク トラフィックを大幅に削減できます。同じデータベース オブジェクトに対する操作 (クエリ、変更など) の場合、この操作に含まれる Transaction-SQL ステートメントがストアド プロシージャに編成されている場合、そのストアド プロシージャがクライアント コンピューターで呼び出されるときに、その呼び出しステートメントのみがネットワーク上で送信されるため、ネットワーク トラフィックが大幅に増加し、ネットワーク負荷が軽減されます。 (5).ストアドプロシージャはセキュリティメカニズムとして十分に活用できます。システム管理者は、特定のストアドプロシージャの実行権限を制限することで、対応するデータへのアクセス権限を制限し、権限のないユーザーによるデータへのアクセスを回避し、データのセキュリティを確保することができます。 2.MySQLについてストアドプロシージャ ストアドプロシージャはデータベースストレージの重要な機能です。 MySQL ストアド プロシージャ5.0より前ではサポートされていなかったため、MySQLのアプリケーションが大幅に削減されました。幸いなことに、MySQL 5.0 はついにストアド プロシージャのサポートを開始しました。これにより、データベースの処理速度が大幅に向上し、データベース プログラミングの柔軟性も向上します。 3. MySQLストアドプロシージャの作成 (1). フォーマット MySQLストアドプロシージャによって作成された形式: CREATE PROCEDURE プロセス名([プロセスパラメータ[,...]]) こちらまず例を挙げてみましょう: 注: (1) ) ここで注意が必要なのは DELIMITER / / と DELIMITER ;、DELIMITER は区切り文字を意味します。これは、MySQL が区切り文字としてデフォルトで ";" を宣言しないためです。コンパイラストアド プロシージャは SQL ステートメントとして処理され、ストアド プロシージャのコンパイル プロセスでエラーが報告されるため、DELIMITER キーワードを使用して現在のセグメント区切り文字を事前に宣言する必要があります。 MySQL は ";" をストアド プロシージャ内のコードとして扱います。これらのコードは使用後に復元する必要があります。 (2) ストアド プロシージャには、必要に応じて入力パラメータ、出力パラメータ、入力パラメータ、および出力パラメータがある場合があります。ここに出力パラメータ s があり、型は int 型です。複数のパラメータは","を使用して区切ります。 (3) プロセス本体の開始と終了は、BEGINとENDでマークされます。 このようにして、MySQLストアドプロシージャの1つが完成しました。理解できなくても大丈夫です。詳しく説明します。 (2). 宣言区切り文字 実際、宣言区切り文字に関しては、上記の注釈は非常に明確です。これ以上言う必要はありませんが、少しだけ注意してください。はい: MySQL の Administrator 管理ツールを使用している場合は、直接作成できるため、宣言する必要はありません。 (3).Parameters MySQL ストアドプロシージャのパラメータは、、IN、の3種類があります。 OUT、INOUT、次のような形式: CREATE PROCEDURE([[IN |OUT |INOUT ] パラメータ名 データ型...]) IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT 输出参数:该值可在存储过程内部被改变,并可返回 INOUT 输入输出参数:调用时指定,并且可被改变和返回 Ⅰ. IN参数例子 创建: 执行结果: 以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值 Ⅱ.OUT参数例子 创建: Ⅲ. INOUT参数例子 创建: 执行结果:
(4). 变量 Ⅰ. 变量定义 DECLARE variable_name [,variable_name...] datatype [DEFAULT value]; 其中,datatype为MySQL的数据类型,如:int, float, date, varchar(length) 例如: Ⅱ. 变量赋值 Ⅲ. 用户变量 ⅰ. 在MySQL客户端使用用户变量 ⅱ. 在存储过程中使用用户变量 ⅲ. 在存储过程间传递全局范围的用户变量 注意: ①用户变量名一般以@开头 ②滥用用户变量会导致程序难以理解及管理 (5). 注释 MySQL存储过程可使用两种风格的注释 双模杠:-- 该风格一般用于单行注释 c风格: 一般用于多行注释 例如: 4. MySQL存储过程的调用 用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。 5. MySQL存储过程的查询 我们像知道一个数据库下面有那些表,我们一般采用show tables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。 我们可以用 进行查询。 如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢? 答案是:我们可以查看存储过程的详细,但是需要用另一种方法: SHOW CREATE PROCEDURE 数据库.存储过程名; 就可以查看当前存储过程的详细。 6. MySQL存储过程的修改 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。 7. MySQL存储过程的删除 删除一个存储过程比较简单,和删除表一样: 从MySQL的表格中删除一个或多个存储过程。 8. MySQL存储过程的控制语句 (1). 变量作用域 内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储 (2). 条件语句 Ⅰ. if-then -else语句 (3). 循环语句 Ⅰ. while ···· end while: Ⅱ. repeat···· end repeat: 它在执行操作后检查结果,而while则是执行前进行检查。 Ⅲ. loop ·····end loop: loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。 Ⅳ. LABLES 标号: 标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。 (4). ITERATE迭代 Ⅰ. ITERATE: 通过引用复合语句的标号,来从新开始复合语句 9. MySQL存储过程的基本函数 (1).字符串类 CHARSET(str) //文字列文字セットを返します (2).数学类 ABS (number2 ) //绝对值 注:返回类型并非均为整数,如: (3).日期时间类 ADDTIME (date2 ,time_interval ) //time_intervalをdate2 SQRT(number2) //开平方 PHP调用MYSQL存储过程实例 实例一:无参的存储过程 实例二:传入参数的存储过程 实例三:传出参数的存储过程 实例四:传出参数的inout存储过程 实例五:使用变量的存储过程 实例六:case语法 实例七:循环语句
实例八:repeat语句 实例九:loop语句 实例十:删除存储过程 以上就是本篇文章的全部内容了,更多相关内容请关注PHP中文网。 相关推荐:
[特性...]プロセス本体mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM user;
-> END
-> //
mysql> DELIMITER ;
mysql > DELIMITER //
mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)
-> BEGIN
-> SELECT p_in;
-> SET p_in=2;
-> SELECT p_in;
-> END;
-> //
mysql > DELIMITER ;
mysql > SET @p_in=1;
mysql > CALL demo_in_parameter(@p_in);
+------+
| p_in |
+------+
| 1 |
+------+
+------+
| p_in |
+------+
| 2 |
+------+
mysql> SELECT @p_in;
+-------+
| @p_in |
+-------+
| 1 |
+-------+
mysql > DELIMITER //
mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)
-> BEGIN
-> SELECT p_out;
-> SET p_out=2;
-> SELECT p_out;
-> END;
-> //
mysql > DELIMITER ;
执行结果:
mysql > SET @p_out=1;
mysql > CALL sp_demo_out_parameter(@p_out);
+-------+
| p_out |
+-------+
| NULL |
+-------+
+-------+
| p_out |
+-------+
| 2 |
+-------+
mysql> SELECT @p_out;
+-------+
| p_out |
+-------+
| 2 |
+-------+
mysql > DELIMITER //
mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)
-> BEGIN
-> SELECT p_inout;
-> SET p_inout=2;
-> SELECT p_inout;
-> END;
-> //
mysql > DELIMITER
mysql
mysql > CALL demo_inout_parameter(@p_inout) ;
+---------+
| p_inout |
+---------+
| 1 |
+---------+
+---------+
| p_inout |
+---------+
| 2 |
+---------+
mysql > SELECT @p_inout;
+----------+
| @p_inout |
+----------+
| 2 |
+----------+
DECLARE l_int int unsigned default 4000000;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
SET 变量名 = 表达式值 [,variable_name = expression ...]
mysql > SELECT 'Hello World' into @x;
mysql > SELECT @x;
+-------------+
| @x |
+-------------+
| Hello World |
+-------------+
mysql > SET @y='Goodbye Cruel World';
mysql > SELECT @y;
+---------------------+
| @y |
+---------------------+
| Goodbye Cruel World |
+---------------------+
mysql > SET @z=1+2+3;
mysql > SELECT @z;
+------+
| @z |
+------+
| 6 |
+------+
mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
mysql > SET @greeting='Hello';
mysql > CALL GreetWorld( );
+----------------------------+
| CONCAT(@greeting,' World') |
+----------------------------+
| Hello World |
+----------------------------+
mysql> CREATE PROCEDURE p1() SET @last_procedure='p1';
mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);
mysql> CALL p1( );
mysql> CALL p2( );
+-----------------------------------------------+
| CONCAT('Last procedure was ',@last_proc |
+-----------------------------------------------+
| Last procedure was p1 |
+-----------------------------------------------+
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc1 --name存储过程名
-> (IN parameter1 INTEGER)
-> BEGIN
-> DECLARE variable1 CHAR(10);
-> IF parameter1 = 17 THEN
-> SET variable1 = 'birds';
-> ELSE
-> SET variable1 = 'beasts';
-> END IF;
-> INSERT INTO table1 VALUES (variable1);
-> END
-> //
mysql > DELIMITER ;
select name from mysql.proc where db=’数据库名’;
或者
select routine_name from information_schema.routines where routine_schema='数据库名';
或者
show procedure status where db='数据库名';
ALTER PROCEDURE
DROP PROCEDURE
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3()
-> begin
-> declare x1 varchar(5) default 'outer';
-> begin
-> declare x1 varchar(5) default 'inner';
-> select x1;
-> end;
-> select x1;
-> end;
-> //
mysql > DELIMITER
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc2(IN parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> if var=0 then
-> insert into t values(17);
-> end if;
-> if parameter=0 then
-> update t set s1=s1+1;
-> else
-> update t set s1=s1+2;
-> end if;
-> end;
-> //
mysql > DELIMITER ;
Ⅱ. case语句:
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3 (in parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> case var
-> when 0 then
-> insert into t values(17);
-> when 1 then
-> insert into t values(18);
-> else
-> insert into t values(19);
-> end case;
-> end;
-> //
mysql > DELIMITER ;
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc4()
-> begin
-> declare var int;
-> set var=0;
-> while var<6 do
-> insert into t values(var);
-> set var=var+1;
-> end while;
-> end;
-> //
mysql > DELIMITER ;
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc5 ()
-> begin
-> declare v int;
-> set v=0;
-> repeat
-> insert into t values(v);
-> set v=v+1;
-> until v>=5
-> end repeat;
-> end;
-> //
mysql > DELIMITER ;
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc6 ()
-> begin
-> declare v int;
-> set v=0;
-> LOOP_LABLE:loop
-> insert into t values(v);
-> set v=v+1;
-> if v >=5 then
-> leave LOOP_LABLE;
-> end if;
-> end loop;
-> end;
-> //
mysql > DELIMITER ;
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc10 ()
-> begin
-> declare v int;
-> set v=0;
-> LOOP_LABLE:loop
-> if v=3 then
-> set v=v+1;
-> ITERATE LOOP_LABLE;
-> end if;
-> insert into t values(v);
-> set v=v+1;
-> if v>=5 then
-> leave LOOP_LABLE;
-> end if;
-> end loop;
-> end;
-> //
mysql > DELIMITER ;
CONCAT (string2 [,... ]) //接続文字列
INSTR (string ,substring ) // substringがstring内で最初に出現する位置を返します。は存在しません。 Returns 0
LCASE (string2 ) //小文字に変換します
左(string2 ,length ) // length 文字をstring2の左から取得します
LENGTH (string ) //stringlength
LOAD_ファイル (ファイル名) //ファイルからコンテンツを読み取ります
LOCATE (substring , string [,start_position ] ) INSTR,と同じですが、開始位置を指定できます
LPAD (string2 , length , Pad ) //文字列の長さがlengthLTRIM (string2 )になるまでstring,の先頭にpad
を繰り返し追加します // 削除先頭のスペース
REPEAT (string2 ,count ) //repeatcounttimes
REPLACE (str ,search_str ,replace_str ) //はで使用されますストラ replace_str Replacesearch_str
RPAD (string2 , length ,pad) //strの後、長さがになるまでpadを追加します長さRTRIM ( string2 ) / /バックエンドスペースを削除
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1 mysql> select substring('abcd',0,2);
+-----------------------+
| substring('abcd',0,2) |
+-----------------------+
| |
+-----------------------+
1 row in set (0.00 sec)
mysql> select substring('abcd',1,2);
+-----------------------+
| substring('abcd',1,2) |
+-----------------------+
| ab |
+-----------------------+
1 row in set (0.02 sec)
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格
BIN (decimal_number ) //十进制转二进制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //进制转换
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小数位数
HEX (DecimalNumber ) //转十六进制
注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指数
RAND([seed]) //随机数
ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]
(1)默认变为整形值mysql> select round(1.23);
+-------------+
| round(1.23) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
mysql> select round(1.56);
+-------------+
| round(1.56) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
(2)可以设定小数位数,返回浮点型数据
mysql>
+----------------+
| round(1.567,2) |
+----------------+
| 1.57 |
+----------------+
1 row in set (0.00 sec)
SIGN (number2 ) //
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //タイムゾーンを変換
CURRENT_DATE ( ) //現在Date
CURRENT_TIME ( ) //現在時刻
CURRENT_TIMESTAMP ( ) //現在のタイムスタンプ
DATE (datetime ) //日付部分を返しますdatetime
DATE_ADD ( date2 , INTERVAL d_value d_type ) //日付または時刻を date2 に追加します
DATE_FORMAT (datetime ,FormatCodes ) //formatcodes 形式を使用して datetime を表示しますDATE_SUB (日付2、 INTERVAL d_value d_type ) //
date2から時間を減算しますDATEDIFF (date1 ,date2 ) //
2つの日付の差DAY (date ) //
Return の日日付DAYNAME (日付) //
英語の週DAYOFWEEK (日付) //週(1-7)、1は日曜日です
DAYOFYEAR (日付) //今年の日
EXTRACT (interval_name FROM date) / / date
MAKEDATE (year ,day ) から日付の指定部分を抽出します //は年と日を与えます,は日付文字列を生成します
MAKETIME (時、分、秒) //時刻文字列を生成
MONTHNAME (日付) //英語の月名
NOW () //現在時刻
SEC_TO_TIME (秒) // 秒を時間に変換
STR_TO_DATE (string ,format ) //文字列を時間に変換、formatで表示TIMEDIFF (datetime1 ,datetime2 ) //の間2 回
TIME_TO_SEC (time ) //秒までの時間]
WEEK (date_time [,start_of_week ]) //week
YEAR (datetime ) //year
DAYO F月( datetime) //その月の日
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分返回符号,正负或0$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
mysql_select_db('test',$conn);
$sql = "
create procedure myproce()
begin
INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0');
end;
";
mysql_query($sql);//创建一个myproce的存储过程
$sql = "call test.myproce();";
mysql_query($sql);//调用myproce的存储过程,则数据库中将增加一条新记录。
$sql = "
create procedure myproce2(in score int)
begin
if score >= 60 then
select 'pass';
else
select 'no';
end if;
end;
";
mysql_query($sql);//创建一个myproce2的存储过程
$sql = "call test.myproce2(70);";
mysql_query($sql);//调用myproce2的存储过程,看不到效果,可以在cmd下看到结果。
$sql = "
create procedure myproce3(out score int)
begin
set score=100;
end;
";
mysql_query($sql);//创建一个myproce3的存储过程
$sql = "call test.myproce3(@score);";
mysql_query($sql);//调用myproce3的存储过程
$result = mysql_query('select @score;');
$array = mysql_fetch_array($result);
echo '<pre class="brush:php;toolbar:false">';print_r($array);
$sql = "
create procedure myproce4(inout sexflag int)
begin
SELECT * FROM user WHERE sex = sexflag;
end;
";
mysql_query($sql);//创建一个myproce4的存储过程
$sql = "set @sexflag = 1";
mysql_query($sql);//设置性别参数为1
$sql = "call test.myproce4(@sexflag);";
mysql_query($sql);//调用myproce4的存储过程,在cmd下面看效果
$sql = "
create procedure myproce5(in a int,in b int)
begin
declare s int default 0;
set s=a+b;
select s;
end;
";
mysql_query($sql);//创建一个myproce5的存储过程
$sql = "call test.myproce5(4,6);";
mysql_query($sql);//调用myproce5的存储过程,在cmd下面看效果
$sql = "
create procedure myproce6(in score int)
begin
case score
when 60 then select '及格';
when 80 then select '及良好';
when 100 then select '优秀';
else select '未知分数';
end case;
end;
";
mysql_query($sql);//创建一个myproce6的存储过程
$sql = "call test.myproce6(100);";
mysql_query($sql);//调用myproce6的存储过程,在cmd下面看效果
$sql = "
create procedure myproce7()
begin
declare i int default 0;
declare j int default 0;
while i<10 do
set j=j+i;
set i=i+1;
end while;
select j;
end;
";
mysql_query($sql);//创建一个myproce7的存储过程
$sql = "call test.myproce7();";
mysql_query($sql);//调用myproce7的存储过程,在cmd下面看效果
$sql = "
create procedure myproce8()
begin
declare i int default 0;
declare j int default 0;
repeat
set j=j+i;
set i=i+1;
until j>=10
end repeat;
select j;
end;
";
mysql_query($sql);//创建一个myproce8的存储过程
$sql = "call test.myproce8();";
mysql_query($sql);//调用myproce8的存储过程,在cmd下面看效果
$sql = "
create procedure myproce9()
begin
declare i int default 0;
declare s int default 0;
loop_label:loop
set s=s+i;
set i=i+1;
if i>=5 then
leave loop_label;
end if;
end loop;
select s;
end;
";
mysql_query($sql);//创建一个myproce9的存储过程
$sql = "call test.myproce9();";
mysql_query($sql);//调用myproce9的存储过程,在cmd下面看效果
mysql_query("drop procedure if exists myproce");//删除test的存储过程
实例十:存储过程中的游标
以上がmysql ストアド プロシージャの詳細な説明と、PHP から MYSQL ストアド プロシージャを呼び出す例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。