共計 2828 個字符,預計需要花費 8 分鐘才能閱讀完成。
今天丸趣 TV 小編給大家分享一下 Mysql 中自定義函數怎么創建的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Mysql 自定義函數的創建和執行
假設 students 表中包含 id 和 name 兩個字段,創建一個函數,函數的作用是根據 id 查找 name
1. 創建表,插入數據
create table students(id int,name varchar(100));
insert into students(id,name) values(1, annie),(2, bell),(3, danny
2. 創建函數
DELIMITER //
create function find_student(id int) returns varchar(100)
READS SQL DATA
begin
declare sname varchar(100) default
select students.name into sname from students where students.id=id;
return sname;
end //
DELIMITER ;
需要注意的事項:
1)使用 DELIMITER// 修改分隔符
mysql 的默認語句結束符號是分號,當 mysql 遇到分號時就自動執行當前語句。因為函數定義時包含多條 sql 語句,所以使用 DELIMITER // 先將分隔符設置為 //,等函數創建語句完成后,再將分隔符改回分號即可。
2)READS SQL DATA
之前我沒寫這句話,但是創建時 mysql 報錯,提示 Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
上網查了一下,意思是沒有聲明 mysql 函數的類型:
mysql 開啟了 bin-log, 我們就必須指定我們的函數是否是哪種類型:
1 DETERMINISTIC 不確定的
2 NO SQL 沒有 SQl 語句,當然也不會修改數據
3 READS SQL DATA 只是讀取數據,當然也不會修改數據
4 MODIFIES SQL DATA 要修改數據
5 CONTAINS SQL 包含了 SQL 語句
所以我加上了 READS SQL DATA
3)使用局部變量
變量定義:我這里使用 declare sname varchar(100) default lsquo; rsquo;; 定義了局部變量 sname,
變量使用:
可以使用 select students.name into sname from students where students.id=id; 為變量賦值
也可以直接使用 set 語句來賦值,如 set sname= lsquo;test rsquo;
3. 執行函數:select 函數名(參數值);
select find_student(3);
Mysql 自定義函數創建失敗問題案例
目前在項目中,執行創建 mysql 的函數出錯,
mysql 創建函數出錯信息如下:
Caused by: java.sql.SQLException: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2373)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
… 35 more
這是因為有一個安全參數沒有開啟,log_bin_trust_function_creators 默認為 0,是不允許 function 的同步的,開啟這個參數,就可以創建成功了。
查看是否開啟:
show variables like %func%
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
1 row in set (0.00 sec)
為 on 則是開啟了
set global log_bin_trust_function_creators = 1;
可以通過這個命令設置,但是 MySQL 重啟后就失效了。
所有最后是通過修改 MySQL 數據庫的配置文件
在配置文件 /etc/my.cnf 的 [mysqld] 配置 log_bin_trust_function_creators=1
修改完后重啟 MySQL。
以上就是“Mysql 中自定義函數怎么創建”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注丸趣 TV 行業資訊頻道。