リレーショナルデータベースのストアドプロシージャ

 1.定義:ストアドプロシージャは、プリコンパイルされたセットのSQL文のセットです。
2.利点:、冗長性を減らす、再利用性を向上させるには、サーバーと対話する接続数を減らし、コンパイルSQLの数を減らします。

ストアドプロシージャを作成するための3構文

CREATE  PROCEDURE ストアドプロシージャ名(パラメータリスト)
 BEGIN 
    手続きの本体と、
END

4.パラメータリストは、3つの部分から構成:パラメータ・モード(IN / OUT /アウト〜中)、パラメータ名、パラメータの型

パラメータモード:
  中:発信者は、パラメータのJavaと同様に、必要
  アウト:Javaのリターンに類似の戻り値として
  アウト〜中:呼び出し側によって渡されたパラメータに対応する値を返すことが
手続きの場合本体のみを次いで、対応する文が終了を開始省略してもよい。
手順SQLステートメントの本体のそれぞれの端部は、セミコロンする必要があり、
再設定マークのストアドプロシージャに必要な終了区切りフラグストアドプロシージャ。

5.コールストアドプロシージャ

CALLストアドプロシージャ名(引数);

  

6.ケース

従業員テーブルを構築し、部門表、ロールテーブル

 

リファレンス#空構成された
区切り$ 
CREATE PROCEDURE ADD1()
BEGIN 
	SELECT 'SDを'; 
ENDドル
CALLのRADDを();

  

#带IN 模式的存储过程
#通过部门名称查询对应的员工信息
DELIMITER $
CREATE PROCEDURE empinfo(IN dept_name varchar(20))
BEGIN
	SELECT
		e.e_id,
		e.e_name,
		d.dept_name
	FROM
		employee e RIGHT JOIN department d
	ON
		e.dept_id=d.dept_id
	WHERE
		d.dept_name=dept_name;
END $

CALL empinfo('开发部')

  

 

#通过员工部门名称和角色信息,查询员工是否存在,如果存在则显示存在两字,否则显示不存在
DELIMITER $
CREATE PROCEDURE empinfo1(IN dept_name VARCHAR(20),IN r_name VARCHAR(20))
BEGIN
		DECLARE result int DEFAULT 0;
		SELECT count(*) INTO result FROM emoloyee e
		LEFT JOIN department d
		ON e.dept_id=d.dept_id
		LEFT JOIN role r
		ON r.r_id=e.r_id
		WHERE d.dept_name=dept_name AND r.r_name=r_name;
		SELECT 
			IF(result>0,'存在','不存在');
END $
CALL emploinfo1('开发部','一级管理员');

  

#带out的存储过程
#传入员工姓名显示对应的部门名称
DELIMITER $
CREATE PROCEDURE empdep(IN empName VARCHAR(20),OUT deptName VARCHAR(20))
BEGIN
	SELECT 
		d.dept_name INTO deptName
	FROM 
		employee e LEFT JOIN department d
	ON
		e.dept_id=d.dept_id
	WHERE
		e.e_name=empName;
END $
#调用
CALL empdep('据',@DeptName);
SELECT @DeptName;

  

#通过员工姓名返回员工对应的部门名称和角色名称
CREATE PROCEDURE deptNameAndRoleName(IN emp_name VARCHAR(10),OUT dep_name VARCHAR(20),OUT rol_name VARCHAR(20))
BEGIN
	SELECT d.dept_name 部门名称,r.r_name 角色名称 INTO dep_name,rol_name
	FROM employee e
	LEFT JOIN department d
	ON d.dept_id=e.dept_id
	LEFT JOIN role r
	ON r.r_name=e.r_name
	WHERE
		e.e_name=emp_name
END $

#调用
CALL deptNameAndRoleName('hjbj',@deptNAME,@ROLEnaME)

#查看变量
SELECT @deptNAME,@ROLEnaME;

  

#创建IN~OUT
#传入对应的工资计算年薪
DELIMITER $
CREATE PROCEDURE salaryss(INOUT s1 DOUBLE,INOUT s2 DOUBLE)
BEGIN
	SET s1=s1*12;
	SET s2=s2*12;
END 
#调用
set @s1=1000;
set @s2=1200;
CALL salaryss(@s1,@s2);
SELECT @s1,@s2

 7.删除存储过程(一次只能删除一个)

DROP PROCEDURE 存储过程名;

 8.查看存储过程

SHOW CREATE PROCEDURE 存储过程名

 9.修改存储过程(一般创建好不允许修改)

おすすめ

転載: www.cnblogs.com/maohaitao/p/11279992.html