php チュートリアル ストアド ルーチン、ストアド プロシージャ入門チュートリアル
ストアド ルーチンとは何ですか?
ストアド ルーチンは、データベース チュートリアル サーバーに保存されている一連の SQL ステートメントであり、クエリ Order で指定された名前を呼び出すことで実行されます。
なぜストアドプロシージャを使用するのですか?
アプリケーションには 2 種類あり、1 つは Web ベース、もう 1 つはデスクトップ ベースであることは誰もが知っています。どちらもデータベースと対話してデータ アクセスを完了します。これら 2 つのタイプを含むアプリケーションがあるとします。次に、クエリ SQL ステートメントの 1 つを変更する必要があるとします。アプリケーションが大きくて複雑な場合、問題が発生することがあります。これを維持するのは簡単ではありません。さらに、Web プログラムまたはデスクトップに SQL クエリ ステートメントを配置すると、SQL インジェクションによって簡単に破損する可能性があります。ストアド ルーチンは、これらの問題の解決に役立ちます。
ストアド プロシージャ、ストアド ルーチン、ストアド ファンクションの違い
Mysql ストアド ルーチンには、実際にはストアド プロシージャとストアド ファンクションが含まれており、これらを総称してストアド ルーチンと呼びます。
このうち、ストアド プロシージャは主にレコードの取得、レコードの挿入、レコードの更新、またはレコードの削除の作業、つまり選択、挿入、削除、更新などの作業を完了します。ストアド関数はクエリ作業を完了し、入力パラメータを受け入れて結果を返すだけです。
ストアド プロシージャとストアド関数の作成
プロシージャの作成 ストアド プロシージャ名 (パラメーター)
ストアド プロシージャの本体
関数の作成 ストアド関数名 (パラメーター)
ストアド関数の本体
データベース omcmc にテーブル db_info があるとします。構造は次のとおりです :
SET FOREIGN_KEY_CHECKS=0;
-----------------------------
-- db_news のテーブル構造
-- -- ------------------------
DROP TABLE IF EXISTS `db_news`;
CREATE TABLE `db_news` (
`id ` int(10) NOT NULL auto_increment,
`title` varchar(200) NOT NULL,
`editor` varchar(20) デフォルト NULL,
`origin` varchar(20) デフォルト NULL,
`tags` varchar(200)デフォルト NULL,
`content` text NOT NULL,
`hits` int(10) デフォルト '0',
`ip` varchar(15) NOT NULL,
`time` int(10) NOT NULL,
主キー ( `id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
----------------------------
-- レコード
- - ----------------------------
`db_news` の値に挿入 ('1'、最初のアプリ' , 'xqbar.com' , 'xqbar.com', 'omcmc', 'detail. ', '100', '127.0.0.1', '1215051225');
上記の表を使用して、単純なストアド プロシージャを作成します
プロシージャ select_news( ) を作成します
タイトル、db_news からのヒットを選択します;
ターミナルで実行して
を呼び出します
上のスクリーンショットから、ストアド プロシージャを呼び出す方法がわかります
ストアド プロシージャを呼び出す
ストアド プロシージャ name() を呼び出す;
上記では、単純なストアド プロシージャを作成しました。もちろん、アプリケーションではそのような単純なストアド プロシージャを使用できません。必要なのは、必要な結果データを返すためにパラメータをストアド プロシージャに渡すことができることです。ストアド プロシージャのパラメータについて学習しましょう。
ストアド プロシージャのパラメータ
通常、ストアド プロシージャはユーザー パラメータを受け入れ、呼び出し元のユーザーに結果を返します。 MySQL チュートリアルでは、ストアド プロシージャのパラメータについて、各パラメータがそのパラメータ名、データ型、およびパラメータが入力パラメータであるか、情報を返すために使用されるか、またはその両方であるかを宣言する必要があると規定しています。ストアド関数の場合、php は入力パラメータのみをサポートします。
パラメータを宣言するときは、キーワード IN、OUT、INOUT を使用する必要があります。
その中に:
IN: 入力パラメータに使用されます
OUT: 戻りパラメータに使用されます
INOUT: ストアド プロシージャにパラメータ値を渡し、値が変化した場合に返すために使用されます
さらに、宣言されたパラメータについては、次のように規定されていますプロシージャを保存するときは、パラメータがプロシージャの外で呼び出されるように、パラメータ名の前に @ を追加する必要があります。 次に、ストアド プロシージャに情報番号を渡すように上記のストアド プロシージャを変更します。 select_news を選択し、表示できる対応する情報タイトルを返します。
プロシージャを作成 select_news(IN id int,OUT title varchar(200))
select db_news.title from db_news where db_news.id=id;
注意してください呼び出し形式に
call select_news(1,@title);
ここで、1 は渡したい情報番号、title は返される対応する情報番号 title です。OUT であるため、前に @ を追加する必要があります。再度呼び出すときにそれを削除し、手順外で呼び出します。 (以下の例を参照)
存在する場合はプロシージャを削除 getNum;
プロシージャを作成 getNum(OUT num int)
select 100 into num;
select @num;
スクリーンショット:
PHP ストアド ルーチンとストアド プロシージャの高度な学習 パート 2
前回の記事に引き続き、戻り値を指定して前の例を呼び出す場合、次のメソッドを使用してストアド プロシージャを呼び出すことができます:
select @return パラメータ;
私たちは使用しますこのメソッドを今すぐ呼び出して、上で作成した select_news を呼び出して見てみましょう
返されるタイトルが、select_news(1,@title) のようにデータベース番号に対応するデータを返すのではなく、なぜ null なのか疑問に思う人もいるかもしれません。ストアド プロシージャ本体は、タイトルのパラメータ戻り値を返しません。
ストレージ関数を見てみましょう
引き続き db_news テーブルを例に挙げますが、ストアド ルーチンに関するその他の知識をこのストレージ関数に追加して、今回説明する学習オブジェクトを紹介します。
drop function if possible count_news;
delimiter //
create function count_news(hits int) returns int
comment '受信クリック数に応じて、この数を超えるメッセージの数をカウントします'
begin
destroy total_news int;
hits_num int デフォルト 0 を宣言します;
if hits>=0 then
set hits_num=hits;
select count(id) into total_news from db_news where db_news.hits>hits_num;
else
set total_news=0;
end if;
return total_news;
end;
//
delimiter ;
上記のストアド関数では、ストアド ルーチン変数の宣言、その値、判定ステートメント、ストアド関数固有の戻り値の型、およびストアド ルーチンがどのようなものであるか 説明 (コメント)。
ストアド プロシージャの戻りパラメータとの違いは、ストアド ファンクションを定義するときに、どの変数が戻りパラメータであるかを直接宣言する必要はなく、データ型を宣言するために return のみを使用することです。 return パラメータは関数本体内で返されるデータ変数を返す形式で表現されます。ここで注意する必要があるのは:
ストレージ関数は入力パラメーターのみをサポートし、入力パラメーターの前に IN または INOUT はありません
上記のストレージ関数に戻り、コードの意味を説明します:
drop 関数。 if doesn't count_news;
ストレージが存在する場合 関数 count_news はストアド プロシージャと同様に、次のステートメントを使用してストアド プロシージャまたは関数を削除できます
drop プロシージャ|関数 [存在する場合] ストアド プロシージャ名|ストアド関数名;
delimiter //
mysql のデフォルトを変更するには、セミコロン (;) を使用します。デリミタを使用すると、元のデフォルトのセミコロン (;) 終了記号は最後まで機能しなくなります。シンボルが復元されました。
create function count_news(hits int) returns int
storage 関数のパラメータは入力パラメータのみであり、返す前に IN または INOUT を宣言しないことに注意してください。返されるデータ型を宣言するだけで済みます
コメントによると。受信クリック数まで、このクリック以上をカウントする情報の数'
ストアド プロシージャまたはストアド関数の機能情報を説明するには、コメントを使用します。フォーマット コメント '説明文字列' を使用します
begin
begin を使用して処理モジュールを定義します
declare total_news int;
変数を宣言します format 変数名データ型を宣言します [デフォルト デフォルト値]
hits_num int を宣言します デフォルト 0;
変数を宣言します format 変数を宣言します名前のデータ型 [デフォルトのデフォルト値]
if hits>=0 then
set hits_num=hits;
set を使用して変数に値を割り当てます
select count(id) into total_news from db_news where db_news.hits>hits_num;
sqlステートメントは、変数に値を割り当てます
else
set total_news=0;
end if;
上記は、形式が if-else-end if または if –else if-else-end であることに注意してください。 if
セミコロン (;) に注意してください
return total_news;
ストレージ関数によって返される値を返すには return を使用します。値は 1 つだけであることに注意してください。
end;
//
delimiter ;
上記の概念的知識を要約すると、次のようになります。
1. ストアド関数とストアド プロシージャのパラメータの違いは何ですか。
2. ストアドルーチンでの mysql のデフォルトの終了記号を変更する方法。
3. ストアドルーチンに機能情報を記述する方法。
4. 変数を宣言して設定します。
5. begin-end ステートメントブロック。
6. 条件判定 if-else if-else-end if または if-else-end if または if-end if