>  기사  >  데이터 베이스  >  MySQL 사용자 정의 기능

MySQL 사용자 정의 기능

黄舟
黄舟원래의
2017-02-27 13:32:363024검색


사용자 정의 함수:

사용자 정의 함수(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
  • 사용자 정의 함수:
  • 사용자 정의 함수(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
  • 그게 다입니다. MySQL 사용자 정의 함수 내용, 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 주목하세요!
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.