mysql------ストレージプロセス


データベース内のストアド・プロシージャ
一、ストレージプロセス
1、概念
1)データベースに名前で格納された、事前にコンパイルされた、特定の機能を完了するためのsql文のセット
2)独立して実行したり、アプリケーションから呼び出したりすることができ、ユーザーが変数を宣言できるようにする
3)一旦作成すると、サーバーがコンパイルされ、必要に応じて複数回使用できる
4)プロセスネストをサポートし、パラメータを受け入れて出力し、ストレージプロセスを実行する状態値を返すことができる
5)は,制御フローとsql文によって書かれるプロセスである.
2、メリット
1)ストアド・プロシージャは作成時にのみコンパイルされ、以降はストアド・プロシージャを実行するたびに再コンパイルする必要はありませんが、一般的なsql文はこのように一度にコンパイルすることはできませんので、データベースの実行速度を向上させることができます.
2)重複使用により、データベース開発者の作業量を削減
3)特定のストレージ・プロシージャに対する使用権を持つユーザのみを設定し、セキュリティを向上させる
二、ストアド・プロシージャp 1//「DELIMITER$$」を定義するのは、解析器に「$$」を終了フラグとするためである(そうでなければデフォルトでは「;「番号を終了フラグとする」;「番号を終了フラグとする」;「できない
プロセスの終了フラグとして使用します.
<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p1()
BEGIN
   SELECT * FROM stud;
   INSERT INTO stud(id,sname,age,score,dept) VALUES(1014,'   ',33,55,'    ');
END$$
DELIMITER;   //         


CALL p1();  //      p1</span>

JAvaでの実装コード
<span style="font-size:18px;">@Test
	public void testCall() throws Exception{
		Connection con = ConnFactory.getConn();
		CallableStatement cs =con.prepareCall("call pp1()");//           
		ResultSet rs = cs.executeQuery();//     
		while(rs.next()){
			System.out.println(rs.getString("sname"));
		}
		con.close();
	}</span>

三、パラメータ付きストレージプロセス
<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p2(IN id INT, IN nm VARCHAR(30) )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
END$$
DELIMITER ; 


DROP PROCEDURE p2;
CALL p2(1015,'  ');</span>

JAvaでの実装コード
<span style="font-size:18px;">@Test //   
	public void testCall2() throws Exception{
		Connection con = ConnFactory.getConn();
		//CallableStatement cs =con.prepareCall("call p2(1017,'lusy')");//           
		CallableStatement cs =con.prepareCall("call p2(?,?)");//               
		cs.setInt(1, 1018);
		cs.setString(2, "  ");
		cs.executeUpdate();
		con.close();
	}</span>

四、戻り値のあるストレージプロセス――パラメータと変数の問題(@変数名、一つの@はユーザー変数、二つの@即ち@@はグローバルなシステム変数)
<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p3(IN id INT, IN nm VARCHAR(30), OUT num INT )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
   SELECT COUNT(*) INTO num FROM stud;
END$$
DELIMITER ; 
CALL p3(1016,'  ',@aa);
SELECT @aa; //    aa  </span>

JAvaでの実装コード
<span style="font-size:18px;">@Test //   ,      
	public void testCall3() throws Exception{
		Connection con = ConnFactory.getConn();
		CallableStatement cs =con.prepareCall("call p3(?,?,?)");//               
		cs.setInt(1, 1020);
		cs.setString(2, "  3");
		cs.registerOutParameter(3, Types.INTEGER);
		//cs.executeUpdate();
		cs.execute();//                 sql  
		int num = cs.getInt(3);
		System.out.println("    :"+num);
		con.close();
	}</span>