Hướng dẫn call function in trigger mysql - gọi hàm trong mysql kích hoạt

Tôi đang có chức năng được xác định của người dùng MySQL có tên là Split_String trong cơ sở dữ liệu của tôi là

CREATE FUNCTION `SPLIT_STR`(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
) RETURNS varchar(255) CHARSET latin1
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '')

Để phân chia giá trị theo vị trí và tôi đang sử dụng Trình kích hoạt để cập nhật trạng thái mà tôi cần một biến TEMP để lưu trữ dữ liệu với sự trợ giúp của chức năng

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
3 AS

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;

Ở đâu nếu tôi gọi một hàm trong Trigger, nó đã ném một lỗi là ở

#1327 - Undeclared variable: SPLIT_STR

Đây có phải là cách đúng để gọi một hàm để đặt biến, chúng ta có thể gọi một hàm trong Trigger không, tôi đang sử dụng MySQL phiên bản 5.1.66


Chạy chức năng bên trong trình kích hoạt

Đăng bởi: Praveen TS Ngày: 23 tháng 7 năm 2009 05:14 AMPraveen TS
Date: July 23, 2009 05:14AM


Xin chào,

Chỉ cần tôi cần chạy một hàm được lưu trữ trả về số 19 chữ số bên trong trình kích hoạt.

Mã cho điều này như sau.

DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;

Mã thực thi tốt khi tôi gán giá trị theo cách thủ công thay vì gọi hàm và gán vào biến AAUID_NO. Chức năng
The function

SELECT generate_aauid();

đang hoạt động tốt nếu gọi chức năng này bình thường.

Có cách nào để thực hiện hàm và gán giá trị cho biến bên trong trình kích hoạt không?

Cảm ơn trước. Praveen
Praveen


Môn học

Lượt xem

Được viết bởi

Đăng

Chạy chức năng bên trong trình kích hoạt

8015

Đăng bởi: Praveen TS Ngày: 23 tháng 7 năm 2009 05:14 AM

2480

Xin chào,

Chỉ cần tôi cần chạy một hàm được lưu trữ trả về số 19 chữ số bên trong trình kích hoạt.

Mã cho điều này như sau.

25.3.1 & NBSP; Cú pháp và ví dụ kích hoạt

Để tạo trình kích hoạt hoặc thả trình kích hoạt, hãy sử dụng câu lệnh

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
4 hoặc
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
5, được mô tả trong Phần & NBSP;

Dưới đây là một ví dụ đơn giản liên kết một kích hoạt với bảng, để kích hoạt cho các hoạt động

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
6. Trình kích hoạt hoạt động như một bộ tích lũy, tổng hợp các giá trị được chèn vào một trong các cột của bảng.

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)

Tuyên bố

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
4 tạo ra một kích hoạt có tên
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
8 được liên kết với bảng
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
9. Nó cũng bao gồm các điều khoản chỉ định thời gian hành động kích hoạt, sự kiện kích hoạt và phải làm gì khi kích hoạt kích hoạt:

  • Từ khóa

    #1327 - Undeclared variable: SPLIT_STR
    
    0 cho biết thời gian hành động kích hoạt. Trong trường hợp này, kích hoạt kích hoạt trước mỗi hàng được chèn vào bảng. Từ khóa được phép khác ở đây là
    #1327 - Undeclared variable: SPLIT_STR
    
    1.

  • Từ khóa

    delimiter //
    CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
     FOR EACH ROW BEGIN
    DECLARE cab_meter_new VARCHAR(10);
    DECLARE cab_cost_new VARCHAR(10);
    
    SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
    select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
    ----
    ---
    --
    END //
    delimiter ;
    
    6 chỉ ra sự kiện kích hoạt; Đó là, loại hoạt động kích hoạt kích hoạt. Trong ví dụ, các hoạt động
    delimiter //
    CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
     FOR EACH ROW BEGIN
    DECLARE cab_meter_new VARCHAR(10);
    DECLARE cab_cost_new VARCHAR(10);
    
    SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
    select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
    ----
    ---
    --
    END //
    delimiter ;
    
    6 gây ra kích hoạt kích hoạt. Bạn cũng có thể tạo các kích hoạt cho các hoạt động
    #1327 - Undeclared variable: SPLIT_STR
    
    4 và
    #1327 - Undeclared variable: SPLIT_STR
    
    5.

  • Tuyên bố sau

    #1327 - Undeclared variable: SPLIT_STR
    
    6 xác định thân kích hoạt; Đó là, câu lệnh để thực thi mỗi lần kích hoạt kích hoạt, xảy ra một lần cho mỗi hàng bị ảnh hưởng bởi sự kiện kích hoạt. Trong ví dụ, thân kích hoạt là một
    #1327 - Undeclared variable: SPLIT_STR
    
    7 đơn giản tích lũy vào biến người dùng, các giá trị được chèn vào cột
    #1327 - Undeclared variable: SPLIT_STR
    
    8. Câu lệnh đề cập đến cột là
    #1327 - Undeclared variable: SPLIT_STR
    
    9 có nghĩa là giá trị của cột
    #1327 - Undeclared variable: SPLIT_STR
    
    8 sẽ được chèn vào hàng mới.the value of the
    #1327 - Undeclared variable: SPLIT_STR
    
    8 column to be inserted into the new row.

Để sử dụng trình kích hoạt, đặt biến tích lũy thành 0, thực thi câu lệnh

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
6 và sau đó xem giá trị nào biến có sau đó:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+

Trong trường hợp này, giá trị của

DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
2 sau tuyên bố
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
6 đã được thực thi là
DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
4 hoặc
DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
5.

Để phá hủy kích hoạt, sử dụng câu lệnh

DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
6. Bạn phải chỉ định tên lược đồ nếu trình kích hoạt không nằm trong lược đồ mặc định:

mysql> DROP TRIGGER test.ins_sum;

Nếu bạn thả một bảng, bất kỳ bộ kích hoạt nào cho bảng cũng bị loại bỏ.

Tên kích hoạt tồn tại trong không gian tên lược đồ, có nghĩa là tất cả các yếu tố kích hoạt phải có tên duy nhất trong lược đồ. Các kích hoạt trong các lược đồ khác nhau có thể có cùng tên.

Có thể xác định nhiều trình kích hoạt cho một bảng nhất định có cùng một sự kiện kích hoạt và thời gian hành động. Ví dụ: bạn có thể có hai kích hoạt

DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
7 cho một bảng. Theo mặc định, các kích hoạt có cùng một sự kiện kích hoạt và thời gian hành động kích hoạt theo thứ tự chúng được tạo. Để ảnh hưởng đến thứ tự kích hoạt, chỉ định một mệnh đề sau
#1327 - Undeclared variable: SPLIT_STR
6 chỉ ra
DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
9 hoặc
SELECT generate_aauid();
0 và tên của một kích hoạt hiện có cũng có cùng một sự kiện và thời gian hành động. Với
DELIMITER $$

DROP TRIGGER IF EXISTS add_default_applications$$

CREATE TRIGGER add_default_applications AFTER UPDATE ON tnb_account
 FOR EACH ROW
BEGIN
	-- Declaring variables
	DECLARE app_id 		BIGINT(20);
	DECLARE acc_id 		BIGINT(20);
	DECLARE aauid_no 	BIGINT(20);
	
	-- Assigning account_id to acc_id
	SET acc_id = OLD.id;
	  	
	-- generate aauid and assign the same to aauid_no
	SET aauid_no = SELECT generate_aauid();
	-- SET aauid_no = 1453545454;

	IF NEW.status=1 AND OLD.status=0 THEN
		
      		INSERT INTO tnb_application_profile VALUES(NULL,NULL,aauid_no,1,acc_id,CURRENT_TIMESTAMP,0,0,1,NULL); 
  	END IF;
  
END$$

DELIMITER ;
9, trình kích hoạt mới sẽ kích hoạt sau khi kích hoạt hiện có. Với
SELECT generate_aauid();
0, trình kích hoạt mới sẽ kích hoạt trước khi kích hoạt hiện có.

Ví dụ: định nghĩa kích hoạt sau đây xác định một kích hoạt

SELECT generate_aauid();
3 khác cho bảng
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
9:

mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
       FOR EACH ROW PRECEDES ins_sum
       SET
       @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
       @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)

Trình kích hoạt này,

SELECT generate_aauid();
5, tương tự như
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
8 nhưng tích lũy tiền gửi và rút tiền riêng biệt. Nó có một mệnh đề
SELECT generate_aauid();
0 khiến nó kích hoạt trước
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
8; Nếu không có điều khoản đó, nó sẽ kích hoạt sau
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
8 vì nó được tạo sau
delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
8.

Trong thân kích hoạt, các từ khóa

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
1 và
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
2 cho phép bạn truy cập các cột trong các hàng bị ảnh hưởng bởi một kích hoạt.
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
1 và
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
2 là các phần mở rộng MySQL để kích hoạt; Họ không nhạy cảm với trường hợp.

Trong trình kích hoạt

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
6, chỉ có thể sử dụng
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
6; Không có hàng cũ. Trong kích hoạt
#1327 - Undeclared variable: SPLIT_STR
4, chỉ có thể sử dụng
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
8; Không có hàng mới. Trong trình kích hoạt
#1327 - Undeclared variable: SPLIT_STR
5, bạn có thể sử dụng
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
8 để chỉ các cột của một hàng trước khi nó được cập nhật và
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
6 để tham khảo các cột của hàng sau khi nó được cập nhật.

Một cột có tên với

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
1 chỉ được đọc. Bạn có thể tham khảo nó (nếu bạn có đặc quyền
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+
3), nhưng không sửa đổi nó. Bạn có thể tham khảo một cột có tên với
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
2 nếu bạn có đặc quyền
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+
3 cho nó. Trong trình kích hoạt
#1327 - Undeclared variable: SPLIT_STR
0, bạn cũng có thể thay đổi giá trị của nó bằng
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+
7 =
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+
8 nếu bạn có đặc quyền
#1327 - Undeclared variable: SPLIT_STR
5 cho nó. Điều này có nghĩa là bạn có thể sử dụng trình kích hoạt để sửa đổi các giá trị sẽ được chèn vào một hàng mới hoặc được sử dụng để cập nhật một hàng. .

Trong trình kích hoạt

#1327 - Undeclared variable: SPLIT_STR
0, giá trị
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
       FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
2 cho cột
mysql> DROP TRIGGER test.ins_sum;
4 là 0, không phải là số trình tự được tạo tự động khi hàng mới thực sự được chèn.

Bằng cách sử dụng cấu trúc

mysql> DROP TRIGGER test.ins_sum;
5, bạn có thể xác định trình kích hoạt thực thi nhiều câu lệnh. Trong khối
mysql> DROP TRIGGER test.ins_sum;
6, bạn cũng có thể sử dụng cú pháp khác được phép trong các thói quen được lưu trữ như điều kiện và vòng lặp. Tuy nhiên, giống như đối với các thói quen được lưu trữ, nếu bạn sử dụng chương trình MySQL để xác định trình kích hoạt thực thi nhiều câu lệnh, thì cần phải xác định lại dấu phân cách câu lệnh MySQL để bạn có thể sử dụng dấu phân cách câu lệnh
mysql> DROP TRIGGER test.ins_sum;
7 trong định nghĩa kích hoạt. Ví dụ sau đây minh họa những điểm này. Nó xác định trình kích hoạt
#1327 - Undeclared variable: SPLIT_STR
5 kiểm tra giá trị mới sẽ được sử dụng để cập nhật từng hàng và sửa đổi giá trị nằm trong phạm vi từ 0 đến 100. Đây phải là kích hoạt
#1327 - Undeclared variable: SPLIT_STR
0 vì giá trị phải được kiểm tra trước khi nó được sử dụng để cập nhật để cập nhật hàng:mysql program to define a trigger that executes multiple statements, it is necessary to redefine the mysql statement delimiter so that you can use the
mysql> DROP TRIGGER test.ins_sum;
7 statement delimiter within the trigger definition. The following example illustrates these points. It defines an
#1327 - Undeclared variable: SPLIT_STR
5 trigger that checks the new value to be used for updating each row, and modifies the value to be within the range from 0 to 100. This must be a
#1327 - Undeclared variable: SPLIT_STR
0 trigger because the value must be checked before it is used to update the row:

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           IF NEW.amount < 0 THEN
               SET NEW.amount = 0;
           ELSEIF NEW.amount > 100 THEN
               SET NEW.amount = 100;
           END IF;
       END;//
mysql> delimiter ;

Có thể dễ dàng hơn để xác định một quy trình được lưu trữ riêng biệt và sau đó gọi nó từ trình kích hoạt bằng cách sử dụng câu lệnh

mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
       FOR EACH ROW PRECEDES ins_sum
       SET
       @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
       @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
Query OK, 0 rows affected (0.01 sec)
0 đơn giản. Điều này cũng thuận lợi nếu bạn muốn thực thi cùng một mã từ trong một số kích hoạt.

Có những hạn chế về những gì có thể xuất hiện trong các câu lệnh thực thi khi được kích hoạt:

  • Trình kích hoạt không thể sử dụng câu lệnh

    mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
           FOR EACH ROW PRECEDES ins_sum
           SET
           @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
           @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
    Query OK, 0 rows affected (0.01 sec)
    0 để gọi các quy trình được lưu trữ trả lại dữ liệu cho máy khách hoặc sử dụng SQL động. .

  • Trình kích hoạt không thể sử dụng các câu lệnh rõ ràng hoặc ngầm bắt đầu hoặc kết thúc một giao dịch, chẳng hạn như

    mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
           FOR EACH ROW PRECEDES ins_sum
           SET
           @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
           @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
    Query OK, 0 rows affected (0.01 sec)
    4,
    mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
           FOR EACH ROW PRECEDES ins_sum
           SET
           @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
           @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
    Query OK, 0 rows affected (0.01 sec)
    5 hoặc
    mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
           FOR EACH ROW PRECEDES ins_sum
           SET
           @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
           @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
    Query OK, 0 rows affected (0.01 sec)
    6. (
    mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
           FOR EACH ROW PRECEDES ins_sum
           SET
           @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
           @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
    Query OK, 0 rows affected (0.01 sec)
    7 được cho phép vì nó không kết thúc giao dịch.).

Xem thêm Phần & NBSP; 25.8, Hạn chế trên các chương trình được lưu trữ.

MySQL xử lý các lỗi trong quá trình thực thi kích hoạt như sau:

  • Nếu kích hoạt

    #1327 - Undeclared variable: SPLIT_STR
    
    0 không thành công, hoạt động trên hàng tương ứng không được thực hiện.

  • Trình kích hoạt

    #1327 - Undeclared variable: SPLIT_STR
    
    0 được kích hoạt bởi nỗ lực chèn hoặc sửa đổi hàng, bất kể cố gắng sau đó có thành công hay không.attempt to insert or modify the row, regardless of whether the attempt subsequently succeeds.

  • Trình kích hoạt

    #1327 - Undeclared variable: SPLIT_STR
    
    1 chỉ được thực thi nếu bất kỳ kích hoạt
    #1327 - Undeclared variable: SPLIT_STR
    
    0 nào và hoạt động hàng thực hiện thành công.

  • Một lỗi trong quá trình kích hoạt

    #1327 - Undeclared variable: SPLIT_STR
    
    0 hoặc
    #1327 - Undeclared variable: SPLIT_STR
    
    1 dẫn đến sự thất bại của toàn bộ câu lệnh gây ra sự khởi động kích hoạt.

  • Đối với các bảng giao dịch, thất bại của một tuyên bố sẽ gây ra sự cuộn lại tất cả các thay đổi được thực hiện bởi tuyên bố. Thất bại của một kích hoạt khiến tuyên bố thất bại, do đó lỗi kích hoạt cũng gây ra sự cuộn lại. Đối với các bảng không chuyển hóa, việc quay lại như vậy không thể được thực hiện, vì vậy mặc dù câu lệnh không thành công, bất kỳ thay đổi nào được thực hiện trước điểm lỗi vẫn có hiệu lực.

Trình kích hoạt có thể chứa các tham chiếu trực tiếp đến các bảng theo tên, chẳng hạn như trình kích hoạt có tên

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           IF NEW.amount < 0 THEN
               SET NEW.amount = 0;
           ELSEIF NEW.amount > 100 THEN
               SET NEW.amount = 100;
           END IF;
       END;//
mysql> delimiter ;
4 hiển thị trong ví dụ này:

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
0

Giả sử bạn chèn các giá trị sau vào Bảng

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           IF NEW.amount < 0 THEN
               SET NEW.amount = 0;
           ELSEIF NEW.amount > 100 THEN
               SET NEW.amount = 100;
           END IF;
       END;//
mysql> delimiter ;
5 như được hiển thị ở đây:

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
1

Do đó, bốn bảng chứa các dữ liệu sau:

delimiter //
CREATE TRIGGER `after_tbl1_insert` AFTER INSERT ON `tbl1`
 FOR EACH ROW BEGIN
DECLARE cab_meter_new VARCHAR(10);
DECLARE cab_cost_new VARCHAR(10);

SET @cab_meter_new = SPLIT_STR(NEW.gps_rs232, '|', 1); 
select SPLIT_STR(NEW.gps_rs232, '|', 1) INTO @cab_meter_new,SPLIT_STR(NEW.gps_rs232, '|', 2) INTO @cab_meter_old; //Throws error
----
---
--
END //
delimiter ;
2

Làm cách nào để gọi một kích hoạt trong mysql?

Tạo kích hoạt trong MySQL..
Đầu tiên, chỉ định tên của bộ kích hoạt mà bạn muốn tạo sau khi tạo từ khóa kích hoạt. ....
Tiếp theo, chỉ định thời gian hành động kích hoạt có thể là trước hoặc sau đó cho biết rằng kích hoạt được gọi trước hoặc sau mỗi hàng được sửa đổi ..

Chúng ta có thể gọi thủ tục từ Trigger không?

SQL được yêu cầu gọi một quy trình từ một kích hoạt là cùng một SQL được yêu cầu để gọi một quy trình từ một câu lệnh hợp chất động hoặc thường xuyên SQL. Viết một câu lệnh kích hoạt tạo cơ bản chỉ định các thuộc tính kích hoạt mong muốn. Xem câu lệnh Creating Trigger.. Write a basic CREATE TRIGGER statement specifying the desired trigger attributes. See the CREATE TRIGGER statement.

Làm thế nào để bạn gọi một chức năng trong truy vấn MySQL?

Một hàm có thể được gọi bằng cách chỉ định danh sách tên và tham số của nó bất cứ nơi nào một biểu thức của loại dữ liệu thích hợp có thể được sử dụng.Để hiển thị cách các chức năng được lưu trữ có thể được gọi, chúng tôi sẽ sử dụng hàm được lưu trữ đơn giản được hiển thị trong ví dụ 10-6.specifying its name and parameter list wherever an expression of the appropriate data type may be used. To show how stored functions can be called, we'll use the simple stored function shown in Example 10-6.

Có thể kích hoạt bao gồm câu lệnh CHỌN?

Sự kiện kích hoạt bắt đầu hành động kích hoạt có thể là một phần chèn, xóa, cập nhật hoặc câu lệnh CHỌN.Câu lệnh hợp nhất cũng có thể là sự kiện kích hoạt để cập nhật, xóa hoặc chèn kích hoạt.. The MERGE statement can also be the triggering event for an UPDATE, DELETE, or INSERT trigger.