Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีสร้าง Function 簡單 ใน MySQL

สร้าง User-Defined Function (UDF) ใน MySQL

ใช้ CREATE FUNCTION พร้อม DELIMITER เพื่อกำหนดฟังก์ชันเอง

รูปแบบคำสั่ง

DELIMITER //
DROP FUNCTION IF EXISTS yourFunctionName;
CREATE FUNCTION yourFunctionName(Parameter1, ... N) RETURNS type
BEGIN
    DECLARE variable_name type DEFAULT default_value;
    -- SQL statements
    RETURN value;
END //
DELIMITER ;

ตัวอย่าง: สร้างตารางและ Function ค้นหาชื่อจาก ID

mysql> CREATE TABLE ViewDemo (
    -> Id INT,
    -> Name VARCHAR(200),
    -> Age INT
    -> );
Query OK, 0 rows affected (0.58 sec)

mysql> INSERT INTO ViewDemo VALUES(1,'John',23);
mysql> INSERT INTO ViewDemo VALUES(2,'Sam',24);

สร้าง Function searchRecord

mysql> SET GLOBAL log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP FUNCTION IF EXISTS searchRecord;
mysql> CREATE FUNCTION searchRecord(yourId INT) RETURNS CHAR(100)
    -> BEGIN
    -> DECLARE Name1 CHAR(100) DEFAULT 'No Name Found For This Id';
    -> SELECT Name INTO Name1 FROM ViewDemo WHERE Id = yourId;
    -> RETURN Name1;
    -> END //
Query OK, 0 rows affected (0.33 sec)

mysql> DELIMITER ;

หมายเหตุ: log_bin_trust_function_creators ต้องเป็น 1 ถ้า binary logging เปิดอยู่

ทดสอบ Function

กรณีที่ 1: ID มีอยู่ (Id = 2)

mysql> SELECT searchRecord(2) AS Found;
+-------+
| Found |
+-------+
| Sam   |
+-------+
1 row in set (0.00 sec)

กรณีที่ 2: ID ไม่มีอยู่ (Id = 100)

mysql> SELECT searchRecord(100) AS Found;
+---------------------------+
| Found                     |
+---------------------------+
| No Name Found For This Id |
+---------------------------+
1 row in set (0.00 sec)

ข้อจำกัดของ Function:

  • ไม่สามารถใช้ transaction statements (COMMIT, ROLLBACK)
  • ไม่สามารถ modify table data (INSERT, UPDATE, DELETE)
  • ต้องระบุ DETERMINISTIC, NO SQL, READS SQL DATA หรือ MODIFIES SQL DATA
  • ไม่รองรับ OUT/INOUT parameters (ใช้ Procedure แทน)

คำสั่งดู Function ที่สร้าง:

SHOW FUNCTION STATUS WHERE Db = 'your_database';
SHOW CREATE FUNCTION searchRecord;