MySQL은 --- 저장 프로 시저 및 트리거

MySQL의 프로 시저 및 트리거를 저장

저장 프로 시저

먼저, 간단한 저장 프로 시저

1, 단순한 프로 시저

	$$ DELIMITER 
	프로 시저 테 스타 ()가 생성 
	선두 
	 EMP에서 선택 *; 
	 부서에서 선택 *; 
	 끝; 
	$$; 
	DELIMITER을, 
	- 저장 프로 시저 호출 
	) (전화 종피를;

구조 저장 프로 시저로 구성

1, 형식을 만듭니다 절차 저장 프로 시저 이름을 만들

도 2를 참조하면, 시작 및 종료를 사용하여 하나 이상의 코드 블록 코드 블록을 포함 사이

3 명령 개행 구분자로 정의 할 필요가 생성 $$

저장 프로 시저의 제 2 특성

1, 복잡한 계산 및 판정을 완료

2 강력한 프로그래밍가요

3, SQL 프로그래밍 코드는 재사용 될 수있다

도 4는, 실행 속도가 비교적 빠르다

5 돈을 저축하기 위해, 네트워크 사이의 데이터 전송을 줄이기 위해

둘째, 저장 프로세스 변수

1 프로세스 변수 저장

요구 사항 : = EMPNO를 취할 변수를 사용, 7369의 사용자 이름을 저장 프로 시저를 작성

$$ DELIMITER, 
프로 시저 테 스타를 (만들기) 
선두 
	DECLARE의 my_uname VARCHAR (32) 기본 ""; - 정의 된 변수가 my_uname 
 후 SET my_uname = '스미스'- 변수 할당 my_uname이 
 - EMPNO = 7369 사용자 이름을 조회하고 my_uname 값을 할당 
 EMP INTO my_uname로부터 SELECT ENAME를 WHERE EMPNO = 7369 - 변수가 할당 
 ; my_uname의 반환 값 - my_uname을 선택 
끝에; 
$$; 
구분 기호;

특징 :

하나는 그냥 변수를 선언 선언, 선언 사용하여 변수 선언은 변수는 사용하기 전에 선언해야합니다.

2, MySQL의 SQL 데이터 유형과 일치하는 변수 데이터 유형과 길이를 갖는뿐만 아니라, 기본 값, 문자 집합 및 정렬 등을 지정할 수 있습니다.

3, 변수 집합을 할당 할 수 있으며,이를 선택 방식에 의해 할당 될 수있다.

4, 변수는 다음과 같은, 당신은 선택 문을 사용할 수 있습니다 반환해야합니다 변수 이름을 선택

2 프로세스 변수 저장 응용 예

요구 사항 : 테이블 EMP, 부서 및 최신 입국 날짜, 최초의 행 수의 EMP 테이블.

구분 $$; 
() 프로 시저 stats_emp 만들기; 
BEGIN 
-统计EMP의和부서表中的记录数
 BEGIN 
 DECLARE의 emp_sum의 INT 기본 0; 
 dept_sum의 INT 기본 0을 선언; 
 EMP에서 emp_sum로 수 (*)를 선택; 
 부서에서 dept_sum로 카운트 (*)을 선택; 
 emp_sum, dept_sum을 선택; 
 종료; 
-统计最早,最晚入职日期
 BEGIN 
 DECLARE의 MAX_TIME 타임 스탬프를; 
 MIN_TIME TIMESTAMP를 선언; 
 EMP에서 MAX_TIME MIN_TIME로 맥스 (HIREDATE), 분 (HIREDATE)을 선택; 
 MAX_TIME, MIN_TIME을 선택; 
	종료; 
END 
$$; 
구분;

셋째, 저장 프로 시저 매개 변수

건네 1, 저장 프로 시저 파라미터

요구 사항 : 쓰기 저장 프로 시저, 수신 EMPNO가 사용자의 ENAME으로 돌아왔다.

구분 $$; 
(my_empno의 INT IN) 프로 시저 test_param 만들기; 
-------- 
BEGIN 
 DECLARE의 my_ename의 VARCHAR (32) 기본값 ''; 
 EMP에서 my_ename에 ENAME을 선택 여기서 EMPNO = my_empno; 
 my_ename을 선택; 
종료; 
$$ 
구분; 
-调用
전화 test_param (7369);

팁 :

1, 매개 변수를 전달하는 : 입력, 저장 프로 시저를 호출 할 때이 다음 기본 유형에, 인디애나로 지정 표시되지 않는 경우이 매개 변수의 값을 지정해야합니다 나타냅니다.

2 입력 파라미터는 일반적으로 수신을 위해 사용으로, 저장 프로 시저들은 일반적으로 수정하고 반환되지 부른다.

도 3을 참조하면, 프로 시저 호출을 수정 값을 반환 할 필요는 입력 파라미터 OUT 이용 될 수있는 경우.

제 2 프로 시저가 발신 OUT 파라미터

요구 사항 : EMPNO를 전달, 저장 프로 시저를 호출 할 때, 사용자의 ENAME으로 돌아왔다.

구분 $$; 
절차 test_param 생성 (my_empno의 INT IN, OUT my_ename의 varcahr (32)); 
-------- 
BEGIN 
 EMP에서 my_ename으로 선택 ENAME 어디 EMPNO = my_empno; 
 my_ename을 선택; 
종료; 
$$ 
구분; 
-调用
끝나면 uname = ''@ 설정; 
(7369, @의 UNAME) test_param_out 전화;

팁 :

1, 나가는 매개 변수 : 당신이 값을 변경할 수 있습니다, 저장 프로 시저를 호출하고 반환 할 수 있습니다.

도 2를 참조하면, 확산되는 파라미터는 파라미터 값을 전달하기 위해 사용될 수 없다.

저장 프로 시저를 호출 할 때 3, OUT 매개 변수도 지정해야하지만, 변수가 아닌 상수이어야합니다.

당신이 모두를 통과해야하는 경우 같은 시간을 보내는 필요에 4. 당신은 INOUT 유형 매개 변수를 사용할 수 있습니다.

3, 가변 파라미터 저장 프로 시저 INOUT

요구 사항 : 저장 프로 시저 매개 변수를 호출 my_empno 및 my_ename, 들어오고 나가는 매개 변수를 설정합니다.

구분 $$; 
절차 test_param_inout (INOUT의 my_empno의 INT, INOUT의 my_ename의 VARCHAR (32))를 만들고; 
BEGIN 
 my_empno = 7369로 설정; 
 my_ename은 "스미스를"= 설정; 
 
 , ENAME를 선택 my_ename에 EMPNO, EMP에서 my_empno 여기서 EMPNO = my_empno; 
종료; 
$$ 
구분; 
-调用
설정 @uname : = '를'; 
@empno 설정 = 7399; 
(EMPNO, @의 UNAME @) test_param_inout 전화; 
@의 EMPNO, UNAME @를 선택;

특징 :

1 변수 INOUT 변수는 통화의 값은 통화 중에, 그 값이 수정 될 수 있고, 전달 될 수 있지만, 또한 값을 반환 할 수있다.

입력 IN 및 OUT 2, INOUT 파라미터 설정 기능 파라미터

착신 전화가 INOUT 변수가 정수가 아닌 3,

넷째, 저장 프로 시저 조건문

1, 조건문 저장 프로 시저

요구 사항 : 사용자가 EMPNO 주어진다면, 그 밖에는 EMPNO 반환, ENAME 짝수, 저장 프로 시저를 작성합니다.

구분 $$; 
(my_empno의 INT IN) 프로 시저 test_if을 만들; 
BEGIN 
	DECLARE의 my_ename의 VARCHAR (32) 기본값 ''; 
 (my_empno % 2 = 0) 경우, 다음 
 EMP에서 my_ename에 ENAME 선택 여기서 EMPNO = my_empno; 
	my_ename을 선택; 
 다른 
 선택 my_empno; 
 종료면; 
종료; 
$$ 
구분; 
-调用
전화 test_if (7369);

특징 :

1 조건문의 기본 구조 :) (이면 다른 ... ... 최종면;

논리 참 또는 거짓을 반환 판정 한 경우 (2), 식 true 또는 false를 반환 할 수있다 표현식

2, 조건문 저장 프로 시저의 적용 예

요구 사항 : 결정하기 위해 사용자의 입력 EMPNO 매개 변수에 따라 :

(1) 사용자 SAL 2000보다 작은 경우, 사용자는 200를 지불

(2) 사용자 SAL 1,000 미만, 사용자를 올리는 경우 500

(3) 다른 (100)를 지불

구분 $$; 
(my_empno의 INT IN) 프로 시저 test_if_else을 만들; 
BEGIN 
	DECLARE의 my_sal의 INT 기본 0; 
 EMP에서 my_sal에 샐을 선택 여기서 EMPNO = my_empno; 
 (my_sal <1000)의 경우 다음 
 EMP 세트 SAL 업데이트 SAL + = 500 여기서 EMPNO = my_empno; 
 ELSEIF (my_sal <2000) 
 다음 EMP 세트 SAL 업데이트 SAL + = 200 여기서 EMPNO = my_empno; 
 다른 업데이트 EMP 세트 샐 = 샐 + 100 곳 EMPNO = my_empno; 
 종료면; 
종료; 
$$ 
구분; 
-调用
(7369)를 test_if_else 전화;

특징 :

다중 조건부 구조 :

만약()

그때

...

) (만약 그렇지

그때

...

그밖에

...

경우 종료;

다섯째, 프로 시저 루프

1, 반면 유통

수요 : 사용 루프 (10)는 emp 테이블 EMPNO 연속 녹화에 삽입됩니다.

구분 $$; 
() 프로 시저 test_while를 생성; 
BEGIN 
 내가 기본 0을 int로 DECLARE를; 
 (I <10)는 않지만 
 BEGIN 
 I 세트 = 1 + 1; 
 ACC 삽입 (ID)의 값 (I); 
 종료; 
 최종 WHILE; 
 
종료; 
$$ 
구분; 
-调用
전화 test_while ();

특징 :

1, 동안 기본 문장 구조 : (가) 시작 않지만 ... 끝 끝 동안;

논리 참 또는 거짓을 반환 결정하면서 2, 식 true 또는 false를 반환 할 수있다 표현식

2, 반복 루프

수요 : 반복 루프 ACC를 사용하여 테이블 ID에 10 개 연속 레코드를 삽입

구분 $$; 
() 프로 시저 test_repeat를 생성; 
BEGIN 
 내가 100을 기본 int로 DECLARE를; 
 REPEAT는 
 BEGIN 
 난 = I + 1 세트; 
 ACC 삽입 (ID)의 값 (I); 
 종료; 
 난> = 110 UNTIL 
 END의 REPEAT; 
종료; 
$$ 
구분; 
-调用
) (test_repeat를 호출;

특징 :

1, 기본 문장 구조를 반복 : 최종 반복 될 때까지 ... 시작 끝을 반복;

논리 참 또는 거짓을 반환 결정하면서 2, 식 true 또는 false를 반환 할 수있다 표현식

커서를 사용하여 여섯째, 저장 프로 시저

1. 커서는 무엇입니까

요구 사항 : 커서를 사용, 저장 프로 시저를 작성, UID는 기록 사용자 이름을 업데이트하는 하나 하나의 짝수이다.

$$ DELIMITER, 
절차 test_cursor ()를 작성, 
선두 
 INT는 DEFAULT 0 StopFlag 선언 - 커서 정지 플래그 0 : 정지 1 : 정지 
 DECLARE의 my_uname VARCHAR (32) 기본값 ' '; - 사용자 이름 저장된 쿼리 
 DECLARE uname_cursor 여기서 ACC로부터 선택 UNAME위한 커서 -; UID % 2 = 0 결과 집합 커서 uname_cursor를 정의하고, 지정이 
 설정 stopflag 발견 NOT CONTINUE 핸들러 선언 = 1] - . 커서 stopFlag 설정 후 1 
	 오픈 uname_cursor - 오픈 설정 커서 
 my_uname에 uname_cursor FETCH - - 커서 단계 앞으로, my_uname에 레코드에서 촬영이 my_uname 
 동안 (StopFlag = 0) 
 (가) DO 
 선두 
 업데이트를은 uname ACC SET = CONCAT (my_uname, "CUR _")를 WHERE은 uname = my_uname; 
 ; uname_cursor INTO는 FETCH my_uname 
 끝을, 
 WHILE 종료, 
 닫기 uname_cursor을, 
끝;
$$ 
구분 기호; 
- 전화 
) (전화 test_repeat을;

특징 :

ACC로부터 선택 UNAME uname_cur 위해 커서를 선언 여기서 UID % 2 = 0;

1, 커서는 쿼리 결과 임시 메모리 영역을 저장하는 것입니다

2 uname_cur 커서 변수는 쿼리 결과 세트는 실제로 질의의 결과를 임시 보유

설정 stopflag = 1을 찾을 수 없음에 대한 처리기를 계속 선언;

커서 변수 조회 결과를 다시 (이송) 선창 때 3, 결국, 1 변수 stopflag 도달한다.

4 my_uname로 uname_cursor FETCH - my_uname에 기록 촬영 앞으로 커서 단계,

MySQL의 기능

A, 간단한 함수

수요 : 함수를 작성 UID를 통과, 사용자의 UNAME을 반환

구분 $$; 
 VARCHAR를 반환 기능의 f01_simple (my_uid의 int)를 CREATE (32) UTF8이 캐릭터 세트 
	BEGIN 
 DECLARE의 my_uname의 VARCHAR (32) 기본값 ''; 
 ACC로부터 my_uname에 UNAME 선택 여기서 UID = my_uid; 
	my_uname를 반환; 
END 
$$ 
구분; 
-调用
선택 f01_simple (2);

특징 :

도 1은, 기능 함수 이름을 생성 (파라미터) 반환 반환 값을 사용하는 기능을 만들

도 2에서, 함수는 시작과 끝 부재 사이에 배치되고

3 리턴 지정된 함수 반환 값

4, 함수는 호출 선택 기능 이름 (인수);

둘째, 사용자 정의 기능은 응용 프로그램 예제를 통합

1 실시 지정 함수 01

수요 : 사용자의 고유 한 식별로, 사용자의 UID, UUID 값을 얻을 계정 아이디, UID, UNAME 조합을 입력합니다.

구분 $$; 
 VARCHAR를 반환 기능의 test_uuid (my_uid의 int)를 CREATE (32) UTF8이 캐릭터 세트 
BEGIN 
 DECLARE의 UUID의 VARCHAR (32) 기본값 ''; 
 ACC로부터 UUID INTO ( "_", UNAME, "_", 계정 아이디를 UID)를 선택 CONCAT 여기서 UID = my_uid; 
 반환 UUID; 
END 
$$; 
구분; 
-调用
선택 test_uuid (2);

2 실시 지정 함수 02

요구 사항 : 사용자의 UID를 입력은 UID는 어디에 계정에서 모든 주문의 총 가격을 계산합니다.

트리거 트리거

장면 : 일반적으로 감사를 들면, 비즈니스 데이터의 무결성

1, 트리거 무엇인가

수요 : 누군가가 테이블 사용자 삽입 UID, UNAME 작동 및 작동 시간 및 기록에 레코드를 삽입 감사 목적으로한다.

$$ DELIMITER; 
트리거를 만들`tr_users_insert` 삽입 후 ON users` 
각 행의 
	선두 
- 현재 사용자 정보 뒤에 삽입 새로운 
 oplog로 (UID, UNAME 삽입 작용 optime) VALUES (NEW.uid, NEW.uname을 이제 'INSERT'()); 
말; 
$$; 
구분 기호;

특징 :

1, 트리거 트리거의 이름을 작성하여 트리거를 만들 수 있습니다.

이 때 트리거? 이전에 사용자에 삽입뿐만 아니라 후 처리 후, 동작 트리거 동작 쌍 전 (전) 또는 (후) 한 후에 테이블이다.

3, 어떤 이벤트 트리거의 작동? 사용자에 삽입 한 후, 삽입, 업데이트를 포함하여 수술 시간, 삭제

4, 어떤 테이블을 트리거? 사용자에 삽입 한 후

5 범위의 영향? 각 행에 대해

트리거 : 트리거가 테이블의 이벤트에 따라 작동 삽입 할 수있는 작업, 업데이트의 수를 트리거, 삭제 등의 수정 작업을 할 수있는 객체이기 때문에 함수, 저장 프로 시저.

플립 플롭의 제 2 제조 예

요구 사항 : 사용자가 테이블을 삭제하면 감사 목적에서, 삭제하기 전에 레코드의 기본 필드 값을 기록한다.

구분 $$; 
전에 각 행에 대해 users``에서 삭제 tr_user_delete` 트리거를`CREATE 시작 
- OLD对字段表更新前的数据
 삽입 oplog로 (UID, UNAME, 액션, optime, OLD_VALUE) 값 (OLD.uid, OLD.uname " 지금은 (), OLD.regtime), "삭제; 
종료; 
$$; 
구분;

추천

출처www.cnblogs.com/daijiabao/p/11294063.html