사용자 정의 함수:
사용자 정의 함수(UDF)는 MySQL에 내장된 함수와 사용법이 동일합니다. 동일합니다.
사용자 지정 함수에는 두 가지 필수 조건이 있습니다.
1. 매개 변수
2. 반환 값
함수는 모든 유형의 값을 반환할 수 있으며 이러한 유형.
함수 매개변수와 반환값 사이에는 내부 연결이 필요하지 않습니다.
예 1:
현재 시간, 연도, 월, 일, 시, 분, 초를 반환하는 매개 변수 없는 함수를 만듭니다.
예:
mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2016-09-08 21:17:17 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); +--------------------------------------------------+ | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') | +--------------------------------------------------+ | 2016年09月08日 21点:19分:54秒 | +--------------------------------------------------+ 1 row in set (0.01 sec)
위 프로세스를 캡슐화합니다.
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30) -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');Query OK, 0 rows affected (0.08 sec) mysql> SELECT f1(); +-------------------------------+ | f1() | +-------------------------------+ | 2016年09月08日 21点:21分:25秒 | +-------------------------------+ 1 row in set (0.02 sec)
참고: return 다음은 반환 값 유형이고 return 다음은 반환 값입니다.
예 2:
두 숫자의 평균 구하기와 같은 매개변수를 사용하여 함수를 만듭니다.
mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) -> RETURNS FLOAT(10,2) UNSIGNED -> RETURN (num1+num2)/2;Query OK, 0 rows affected (0.00 sec)
전화:
mysql> SELECT f2(4,6); +---------+ | f2(4,6) | +---------+ | 5.00 | +---------+ 1 row in set (0.02 sec)
위에서 생성한 두 개의 사용자 정의 함수를 삭제하려면:
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)
복합 구조 함수 본문으로 사용자 정의 함수 만들기
예: 테이블에 데이터를 삽입하고 삽입된 데이터의 ID를 반환하는 함수를 만듭니다.
mysql> DESC tdb_test; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | NO | | NULL | | | last_name | varchar(20) | NO | | NULL | | +------------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name)' at line 4
이때 실행할 sql 문을 입력한 후 다음 세미콜론이 현재 기본 구분 기호로 되어 있어 함수가 계속 입력할 수 없는 현상을 발견했습니다. 따라서 기본 구분 기호를 수정해야 합니다.
mysql> DELIMITER //
는 //로 끝나는 것을 의미합니다.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> LAST_INSERT_ID(); -> // ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name); LAST_INSERT_ID()' at line 4
도 오류를 반환합니다. 실행해야 할 문이 두 개 있고, 집계를 구성하려면 시작과 끝을 넣어야 하기 때문입니다. 아래의 올바른 내용을 연습하세요.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> BEGIN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> RETURN LAST_INSERT_ID(); -> END -> // Query OK, 0 rows affected (0.00 sec)
그런 다음 구분 기호를 다시
mysql> DELIMITER ;
로 변경합니다. 테스트 결과는 다음과 같습니다.
mysql> SELECT adduser("ttt","ddd"); +----------------------+ | adduser("ttt","ddd") | +----------------------+ | 5 | +----------------------+ 1 row in set (0.11 sec) mysql> SELECT * FROM tdb_test; +----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | A | B | | 2 | Jack | Bob | | 3 | tom% | 123 | | 4 | 11 | 22 | | 5 | ttt | ddd | +----+------------+-----------+ 5 rows in set (0.00 sec)
함수 본문 정보
함수 본문은 유효합니다. SQL 문은 다음으로 구성됩니다.
함수 본문은 간단한 SELECT 또는 INSERT 문일 수 있습니다. 함수 본문은 복합 구조입니다. BEGIN... END 문을 사용하세요.
복합 구조에는 선언, 루프, 제어 구조가 포함될 수 있습니다. 삭제 함수:
DROP FUNCTION [IF EXISTS] function_name
사용자 지정 함수에는 두 가지 필수 조건이 있습니다.
1. 매개 변수2. 반환 값
함수는 모든 유형의 값을 반환할 수 있으며 이러한 유형. 함수 매개변수와 반환값 사이에는 내부 연결이 필요하지 않습니다.
예 1:
현재 시간, 연도, 월, 일, 시, 분, 초를 반환하는 매개 변수 없는 함수를 만듭니다.
예:
mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2016-09-08 21:17:17 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); +--------------------------------------------------+ | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') | +--------------------------------------------------+ | 2016年09月08日 21点:19分:54秒 | +--------------------------------------------------+ 1 row in set (0.01 sec)
위 프로세스를 캡슐화합니다.
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30) -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');Query OK, 0 rows affected (0.08 sec) mysql> SELECT f1();+-------------------------------+| f1() | +-------------------------------+| 2016年09月08日 21点:21分:25秒 | +-------------------------------+1 row in set (0.02 sec)
참고: return 다음은 반환 값 유형이고 return 다음은 반환 값입니다.
예 2:
두 숫자의 평균 구하기와 같은 매개변수를 사용하여 함수를 만듭니다.
mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) -> RETURNS FLOAT(10,2) UNSIGNED -> RETURN (num1+num2)/2;Query OK, 0 rows affected (0.00 sec)전화:
mysql> SELECT f2(4,6);+---------+| f2(4,6) | +---------+| 5.00 | +---------+1 row in set (0.02 sec)위에서 생성한 두 개의 사용자 정의 함수를 삭제하려면:
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)복합 구조 함수 본문으로 사용자 정의 함수 만들기
예: 테이블에 데이터를 삽입하고 삽입된 데이터의 ID를 반환하는 함수를 만듭니다.
mysql> DESC tdb_test; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | NO | | NULL | | | last_name | varchar(20) | NO | | NULL | | +------------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name)' at line 4
이때 실행할 sql 문을 입력한 후 다음 세미콜론이 현재 기본 구분 기호로 되어 있어 함수가 계속 입력할 수 없는 현상을 발견했습니다. 따라서 기본 구분 기호를 수정해야 합니다.
mysql> DELIMITER //
는 //로 끝나는 것을 의미합니다.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> LAST_INSERT_ID(); -> // ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name); LAST_INSERT_ID()' at line 4
도 오류를 반환합니다. 실행해야 할 문이 두 개 있고, 집계를 구성하려면 시작과 끝을 넣어야 하기 때문입니다. 아래의 올바른 내용을 연습하세요.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> BEGIN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> RETURN LAST_INSERT_ID(); -> END -> // Query OK, 0 rows affected (0.00 sec)
그런 다음 구분 기호를 다시
mysql> DELIMITER ;
로 변경합니다. 테스트 결과는 다음과 같습니다.
mysql> SELECT adduser("ttt","ddd"); +----------------------+ | adduser("ttt","ddd") | +----------------------+ | 5 | +----------------------+ 1 row in set (0.11 sec) mysql> SELECT * FROM tdb_test; +----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | A | B | | 2 | Jack | Bob | | 3 | tom% | 123 | | 4 | 11 | 22 | | 5 | ttt | ddd | +----+------------+-----------+ 5 rows in set (0.00 sec)
함수 본문 정보
함수 본문은 유효합니다. SQL 문은 다음으로 구성됩니다.
함수 본문은 간단한 SELECT 또는 INSERT 문일 수 있습니다. 함수 본문은 복합 구조입니다. BEGIN... END 문을 사용하세요.
복합 구조에는 선언, 루프, 제어 구조가 포함될 수 있습니다. 삭제 기능:
DROP FUNCTION [IF EXISTS] function_name