mysql 저장 프로시저에는 세 가지 매개 변수 유형이 있습니다. 1. "IN" 키워드로 식별되는 입력 매개 변수는 저장 프로시저에 전달될 수 있습니다. 2. "OUT" 키워드로 식별되는 출력 매개 변수는 다음과 같은 경우에 사용됩니다. 저장 프로시저는 작업 결과의 상황을 반환해야 합니다. 3. "INOUT" 키워드로 표시된 입력 및 출력 매개변수.
이 튜토리얼의 운영 환경: windows7 시스템, mysql8 버전, Dell G3 컴퓨터.
저장 프로시저:
특정 기능을 완료하기 위한 SQL 문 집합인 프로그래밍 가능한 함수 집합입니다. 이 함수는 데이터베이스에 컴파일, 생성 및 저장됩니다. 인수가 주어지면 실행을 호출합니다(필요한 경우).
장점(저장 프로시저를 사용하는 이유):
①매우 반복적인 일부 작업을 저장 프로시저로 캡슐화하여 이러한 SQL에 대한 호출을 단순화합니다.
②일괄 처리: SQL + 루프, 트래픽 감소, 즉 "일괄 실행"
③데이터 보안을 보장하는 통합 인터페이스
Oracle 데이터베이스에 비해 MySQL의 저장 프로시저는 기능이 상대적으로 약하고 사용률도 적습니다.
1. 저장 프로시저 생성 및 호출
>저장 프로시저는 특정 기능을 완료하는 데 사용되는 이름을 가진 코드 조각입니다.
>생성된 저장 프로시저는 데이터베이스의 데이터 사전에 저장됩니다.
1 저장 프로시저 만들기
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement [begin_label:] BEGIN [statement_list] …… END [end_label]
#예제 작업을 위한 데이터베이스 만들기 및 데이터 테이블 백업
mysql> create database db1; mysql> use db1; mysql> create table PLAYERS as select * from TENNIS.PLAYERS; mysql> create table MATCHES as select * from TENNIS.MATCHES;
예: 특정 플레이어가 플레이한 모든 게임을 삭제하는 저장 프로시저 만들기
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义) mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) -> BEGIN -> DELETE FROM MATCHES -> WHERE playerno = p_playerno; -> END$$ Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; #将语句的结束符号恢复为分号
분석:
기본 상황에서 저장 프로시저는 기본 데이터베이스와 연결되어 있습니다. 저장 프로시저가 특정 데이터베이스에 생성되도록 지정하려면 프로시저 이름 앞에 접두사로 데이터베이스 이름을 추가하세요. 프로시저에서 DELIMITER $$ 명령을 사용하여 명령문을 변경합니다. 끝 기호는 일시적으로 세미콜론에서 두 개의 $$로 변경되어 프로시저 본문에 사용된 세미콜론이 클라이언트에서 해석되지 않고 서버에 직접 전달됩니다. mysql로).
2. 저장 프로시저 호출: call sp_name[(매개변수 전달됨)];mysql> select * from MATCHES;
+---------+--------+----------+-----+------+
| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |
+---------+--------+----------+-----+------+
| 1 | 1 | 6 | 3 | 1 |
| 7 | 1 | 57 | 3 | 0 |
| 8 | 1 | 8 | 0 | 3 |
| 9 | 2 | 27 | 3 | 2 |
| 11 | 2 | 112 | 2 | 3 |
+---------+--------+----------+-----+------+
5 rows in set (0.00 sec)
mysql> call delete_matches(57);
Query OK, 1 row affected (0.03 sec)
mysql> select * from MATCHES;
+---------+--------+----------+-----+------+
| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |
+---------+--------+----------+-----+------+
| 1 | 1 | 6 | 3 | 1 |
| 8 | 1 | 8 | 0 | 3 |
| 9 | 2 | 27 | 3 | 2 |
| 11 | 2 | 112 | 2 | 3 |
+---------+--------+----------+-----+------+
4 rows in set (0.00 sec)
저장 프로시저 호출 시 매개변수를 전달해야 하는 변수 p_playerno가 설정됩니다. 매개변수를 전달하여 p_playerno에 값을 할당한 다음 저장 프로시저에서 SQL 작업을 수행합니다.
3. 저장 프로시저 본문> 저장 프로시저 본문에는 dml, ddl 문, if-then-else 및 while-do 문과 같이 프로시저가 호출될 때 실행되어야 하는 문이 포함되어 있습니다. Wait
>절차적 본문 형식: 시작으로 시작하고 끝으로 끝(중첩 가능)
BEGIN BEGIN BEGIN statements; END END END
참고: 각 중첩 블록과 그 안의 각 문은 끝을 나타내는 세미콜론으로 끝나야 합니다. 프로세스 본문. -end 블록(복합 문이라고도 함)에는 세미콜론이 필요하지 않습니다.
4. 라벨 문 블록[begin_label:] BEGIN
[statement_list]
END [end_label]
label1: BEGIN label2: BEGIN label3: BEGIN statements; END label3 ; END label2; END label1
라벨에는 두 가지 기능이 있습니다.
①코드 가독성 향상
②일부 문(예: Leave 및 iterate 문)에서는 필요합니다. 태그
2. 저장 프로시저의 매개변수 저장 프로시저는 0개 이상의 매개변수를 가질 수 있으며 저장 프로시저 정의에 사용됩니다.
MySQL 저장 프로시저는 각각 세 가지 키워드 IN, OUT 및 INOUT으로 식별되는 세 가지 유형의 매개변수, 즉 입력 매개변수, 출력 매개변수 및 입력/출력 매개변수를 지원합니다.3가지 매개변수 유형:그 중 입력 매개변수는 저장 프로시저에 전달될 수 있고, 출력 매개변수는 저장 프로시저가 연산 결과를 반환해야 할 때 사용되며, 입력/출력 매개변수는 입력 매개변수와 출력 매개변수 역할을 모두 수행할 수 있습니다.
mysql> delimiter $$ mysql> create procedure in_param(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 in_param(@p_in); +------+ | p_in | +------+ | 1 | +------+ +------+ | P_in | +------+ | 2 | +------+ mysql> select @p_in; +-------+ | @p_in | +-------+ | 1 | +-------+ #以上可以看出,p_in在存储过程中被修改,但并不影响@p_id的值,因为前者为局部变量、后者为全局变量。
mysql> delimiter // mysql> create procedure out_param(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 out_param(@p_out); +-------+ | p_out | +-------+ | NULL | +-------+ #因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null +-------+ | p_out | +-------+ | 2 | +-------+ mysql> select @p_out; +--------+ | @p_out | +--------+ | 2 | +--------+ #调用了out_param存储过程,输出参数,改变了p_out变量的值
mysql> delimiter $$ mysql> create procedure inout_param(inout p_inout int) -> begin -> select p_inout; -> set p_inout=2; -> select p_inout; -> end -> $$ mysql> delimiter ; mysql> set @p_inout=1; mysql> call inout_param(@p_inout); +---------+ | p_inout | +---------+ | 1 | +---------+ +---------+ | p_inout | +---------+ | 2 | +---------+ mysql> select @p_inout; +----------+ | @p_inout | +----------+ | 2 | +----------+ #调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量
예: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……
② 매개변수 이름이 열 이름과 같지 않습니다. 그렇지 않으면 프로시저 본문에서 매개변수 이름이 열 이름으로 처리됩니다[관련 권장사항:mysql 비디오 튜토리얼
]위 내용은 mysql 저장 프로시저의 매개변수 유형은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!