精华内容
下载资源
问答
  • MySQL创建自定义函数(FUNCTION)
    多人点赞 热门讨论
    2021-06-24 11:25:52

    函数跟存储过程差不多都类似于java当中的方法,可以调用

    含义:一组预编译好的SQL语句,理解成批量处理语句

    好处:

    提高了代码的重用性,简化操作,减少了编译次数,提高了效率

    和存储过程的区别:

    存储过程可以有0个返回,也可以有多个返回,比较适合做批量的操作

    函数只有1个返回。比较适合做处理数据的返回结果

    函数的创建语法

    create function name(参数列表) returns 返回类型 
    
    begin 函数体 end ; 
    
    调用语法 select name(参数列表)

    注意:

    参数列表 包含两部分:参数名,参数类型

    函数体肯定会有return语句,

    如果return 语句没有放在函数体的最后也不会报错,但不建议

    当函数体只有一句话可以省略begin end

    使用 delimiter 语句设置结束标记 (delimiter &)

    举个栗子

    无参返回 栗子:

    返回公司的员工个数 delimiter ; 
    create function mp1() returns int 
    begin 
                declare c int defalut 0;//定义一个变量 
                select count(*) into c//给他赋个值 
                from test; 
            return c; end ; 
    select mp1();

    创建函数失败解决:

    set global log_bin_trust_function_creators=TRUE;
    (一次性的,重启无效)

    创建一个有参返回 栗子:

    创建一个有参返回
    栗子:根据女生名字返回女生的电话号码
    create function mp2(girlname VARCHAR(20)) returns int
    begin 
    			set @pas=0;
    			select girltel into @pas
    			from girl as g
    			where g.girlname=girlname;
    
    			RETURN @pas;
    end ;
    
    select mp2('小红');

    最后再来个定义变量的函数

    根据部门名字,返回部门的平均工资
    create function mp3(deptname varchar(20)) returns double
    begin 
    			declare sal double ;
    			select avg(salary) into sal
    			from employees as e
    			join departments as d 
    			on e.dapertment_id = d.department_id
    			where d.department_name=deptname;
    			
    			return sal;
    end
    
    select mp3('departmentname');

    更多相关内容
  • 创建函数时问题马上出现: ERROR 1418 (HY000): This routine 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 ...
  • 创建自定义函数在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题:mysql表结构如下 代码如下:DROP TABLE IF EXISTS `test`;...
  • This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 错误解决办法 原创文章 1获赞 1访问量 11 关注 私信 展开阅读全文
  • MySQL创建自定义函数教程

    千次阅读 2020-06-15 00:06:06
    create function 函数名([参数列表]) returns 数据类型 begin sql语句; return 值; end; 示例 DELIMITER // CREATE FUNCTION get_number_by_id(id INT) RETURNS VARCHAR(300) BEGIN RETURN (SELECT CONCAT('name:...

    1.语法

    create function 函数名([参数列表]) returns 数据类型
    begin
     sql语句;
     return;
    end;
    

    2.示例

    2.1 举例

    创建一个现实时间的函数:

    
    create function show_time() 
    returns varchar(30)
    return date_format(now(),%Y年%m月%d日 %H时%i分%s秒’);
    
    

    创建一个通过id获取姓名的函数:

    DELIMITER //
    CREATE FUNCTION get_number_by_id(id INT)
    RETURNS VARCHAR(300)
    BEGIN
    RETURN (SELECT CONCAT('name: ', name, '--', 'number: ', number)
    FROM users_info WHERE uid = id);
    END//
    DELIMITER ;
    
    

    其中DELIMITER 先定义结束符为 // , 然后又将结束符改为mysql默认的分号结束符。

    了解delimiter 关键字请点击:
    MySQL中 delimiter 关键字详解

    2.2 报错

    如果创建自定义函数时遇到下面这种报错:

    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)

    原因分析:
    导致该错误的原因可能是一个安全设置方面的配置,查手册log_bin_trust_function_creators参数缺省0,是不允许function的同步的,一般我们在配置repliaction的时候,都忘记关注这个参数,这样在master更新funtion后,slave就会报告错误,然后slave stoped。
    解决办法可以参考这里:
    MySQL ERROR 1418 的解决方法

    3.练习

    3.1 练习数据库及表创建

    MySQL版本:8.0.20

    -- 如果已有该数据库,则删除
    DROP DATABASE IF EXISTS StudentScore;
    
    -- 创建数据库
    CREATE DATABASE StudentScore CHARSET=UTF8;
    
    -- 使用数据库
    USE StudentScore;
    
    -- 创建数据表
    -- table 1: students
    
    DROP TABLE IF EXISTS students;
    
    CREATE TABLE students(
    sid INT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    sname VARCHAR(20),
    sclass INT(10),
    sgender VARCHAR(10),
    smajor VARCHAR(20),
    sbirthday DATE
    );
    
    -- table 2: teachers
    
    DROP TABLE IF EXISTS teachers;
    
    CREATE TABLE teachers(
    tid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    tname VARCHAR(20),
    tschool VARCHAR(20)
    );
    
    -- table 3: courses
    
    DROP TABLE IF EXISTS courses;
    
    CREATE TABLE courses(
    cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    cname VARCHAR(20),
    tid INT(10) UNSIGNED NOT NULL,
    FOREIGN KEY(tid) REFERENCES teachers(tid)
    );
    
    -- table 4: scores
    
    DROP TABLE IF EXISTS scores;
    
    CREATE TABLE scores(
    sid INT(10) UNSIGNED NOT NULL,
    cid INT(10) UNSIGNED NOT NULL,
    score DECIMAL(5, 2),
    FOREIGN KEY(sid) REFERENCES students(sid),
    FOREIGN KEY(cid) REFERENCES courses(cid)
    );
    
    -- 插入数据
    INSERT INTO students VALUES
    (0, '赵雷', 1, '男', '计算机', '1990-01-01'),
    (0, '钱电', 2, '男', '计算机', '1990-12-21'),
    (0, '孙风', 3, '男', '计算机', '1990-12-20'),
    (0, '李云', 1, '男', '计算机', '1990-12-06'),
    (0, '周梅', 2, '女', '物理', '1991-12-01'),
    (0, '吴兰', 3, '女', '物理', '1992-01-01'),
    (0, '郑竹', 1, '女', '物理', '1989-01-01'),
    (0, '张三', 2, '女', '物理', '2017-12-20'),
    (0, '李四', 3, '女', '数学', '2017-12-25'),
    (0, '李四', 1, '女', '数学', '2012-06-06'),
    (0, '赵六', 2, '女', '数学', '2013-06-13'),
    (0, '孙七', 3, '女', '数学', '2014-06-01');
    
    
    INSERT INTO teachers VALUES
    (0, '张若尘', '时空学院'),
    (0, '孙悟空', '魔法学院'),
    (0, '纪梵心', '本源学院'),
    (0, '萧炎', '斗气学院'),
    (0, '鲁班', '机械学院');
    
    
    INSERT INTO courses VALUES
    (0, '变形', 2),
    (0, '时空穿梭', 1),
    (0, '分解术', 3),
    (0, '炼器', 5),
    (0, '炼丹', 4),
    (0, '飞行', 2);
    
    
    INSERT INTO scores VALUES
    (1, 1, 80),
    (1, 2, 90),
    (1, 3, 99),
    (2, 1, 70),
    (2, 2, 60),
    (2, 3, 80),
    (3, 1, 80),
    (3, 2, 80),
    (3, 3, 80),
    (4, 1, 50),
    (4, 2, 30),
    (4, 3, 20),
    (5, 1, 76),
    (5, 2, 87),
    (6, 1, 31),
    (6, 3, 34),
    (7, 2, 89),
    (8, 1, 88),
    (8, 2, 82),
    (8, 4, 81),
    (9, 6, 95),
    (10, 5, 86);
    
    

    3.2 创建自定义函数1

    创建一个通过学号sid获取学生信息的函数

    DROP FUNCTION IF EXISTS get_student_info_by_sid;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_info_by_sid(id INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    RETURN (SELECT CONCAT('姓名: ', sname, ' , ', '性别: ', sgender, ' , ', '专业:', smajor)
    FROM students WHERE sid = id);
    END//
    DELIMITER ;
    
    -- 调用函数
    SELECT get_student_info_by_sid(8);
    

    调用函数结果:
    在这里插入图片描述

    3.3 自定义函数 2:要求函数体中包含其中一种流程控制语句

    创建函数:要求输入学生学号sid、课程编号,显示学生成绩是否及格(即成绩>=60)

    DROP FUNCTION IF EXISTS get_student_scores_by_id;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_scores_by_id(sid INT, cid INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    	DECLARE score INT;
    	SELECT sc.score INTO score
    	FROM scores AS sc
    	WHERE sc.sid = sid AND sc.cid = cid;
    	IF score >= 60 THEN
    		RETURN '及格';
    	ELSEIF score > 0 AND score < 60 THEN
    		RETURN '不及格';
    	ELSE
    		RETURN '找不到该学生或该学生没有选课!';
    	END IF;
    END//
    DELIMITER ;
    
    -- 调用函数
    SELECT get_student_scores_by_sid(1, 2);
    

    调用函数结果:
    在这里插入图片描述
    参考:
    https://www.cnblogs.com/progor/p/8871480.html

    展开全文
  • MySql创建自定义函数(Function)

    万次阅读 多人点赞 2018-09-27 17:44:15
    1.创建自定义函数 DELIMITER $$ DROP FUNCTION IF EXISTS genPerson$$ CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50) BEGIN DECLARE str VARCHAR(50) DEFAULT ''; SET @tableName=name; ...

    1.创建自定义函数

    DELIMITER $$
    DROP FUNCTION IF EXISTS genPerson$$
    CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
    BEGIN
      DECLARE str VARCHAR(50) DEFAULT '';
      SET @tableName=name;
      SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));');
      return str;
    END $$
    DELIMITER ;

       (1)DELIMITER $$  定义结束符。MySQL默认的结束符是分号,但是函数体中可能用到分号。为了避免冲突,需要另外定义结束符。

       (2)DROP FUNCTION IF EXISTS genPerson$$  如果函数genPerson已经存在了,就删除掉。

       (3)CREATE FUNCTION 创建函数genPerson,函数的参数是name,返回值是varchar(50)。

       (4)函数体放在BEGIN 与 END之间。

       (5)DECLARE 声明变量,str类型是varchar(50),默认值是空。

       (6)CONCAT连接多个字符串。

       (7)RETURN 返回拼接后的字符串str。

    2.执行

    select genPerson('student');

      

     

     

    展开全文
  • MySQL创建自定义函数

    千次阅读 热门讨论 2017-02-19 21:30:54
    MySQL创建function的时候出现了"ERROR 1418 (HY000): 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...

    MySQL中创建function的时候出现了"ERROR 1418 (HY000): 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)"的错误信息。如下图所示:


    出现这个错误的原因是:

    我们开启了bin-log日志(与MySQL的主从复制有关),slave会从master复制数据,而一些操作,比如function所得的结构在master和slave上的可能不同,所以存在潜在的安全隐患。因此默认情况下会组织function的创建。

    解决这个问题有两种办法:

    1、将Mysql Server的“log_bin_trust_function_creators”参数设置为ON,这样一来开启了log-bin的MySQL Server便可以随意创建function。这里存在潜在的数据安全问题,除非明确的知道创建function在master和slave上的行为完全一致。

    我们可以通过命令行来设置该参数,如下所示

    mysql> show variables like 'log_bin_trust_function_creators';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | OFF   |
    +---------------------------------+-------+
    1 row in set (0.00 sec)

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


    mysql> show variables like 'log_bin_trust_function_creators';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | ON    |
    +---------------------------------+-------+
    1 row in set (0.00 sec)

    注:这种方式重启MySQL服务后设置就会失效,如果想要永久生效,需要在MySQL的配置文件中显示配置。另外,如果再mster上创建函数,想通过主从复制的方式将函数复制到slsave上则也需在开启了log-bin的slave中设置上述变量为ON(变量的设置不会从master复制到slave上,这点需要注意),否则主从复制会报错。

    2、明确指定我们的函数类型

    1)、DETERMINISTIC    不确定的

    2)、NO SQL    没有sql语句,不会修改数据

    3)、READS SQL DATA    只是读取数据,当然也不会修改数据

    这样一来相当于明确的告知MySQL Server这个函数不会修改数据,因此可以在开启了log-bin的服务器上安全的创建并被复制到开启了log-bin的salve上。

    展开全文
  • MySQL 创建自定义函数

    2021-02-02 16:21:41
    语法:Create function function_name(参数列表)returns返回值类型函数函数名,应合法的标识符,不应与系统关键字冲突。一个函数应该属于某个数据库,可以使用db_name.funciton_name...创建第一个函数:mysql>...
  • Mysql创建自定义函数

    千次阅读 2021-02-03 08:28:30
    Mysql创建用户自定义函数:>...创建自定义函数的过程如下demo1:drop function if exists fn_binary_table;delimiter //create function fn_binary_table(param_1 varchar(50))returns intbegind...
  • mysql创建自定义函数出错解决方法

    千次阅读 2019-10-22 10:00:25
    1、在MySql创建自定义函数报错信息如下: ERROR 1418 (HY000): 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 ...
  • 具体创建过程如下,创建函数功能也已经开启了,这边是想实现一个递归查树的功能 delimiter $$ create function WAP_SERVICE.test_function(in_id varchar(16)) returns varchar(1000) begin declare idss varchar...
  • 1.创建自定义函数 https://www.cndba.cn/hbhe0316/article/22215 https://www.cndba.cn/hbhe0316/article/22215 DELIMITER $$ DROP FUNCTION IF EXISTS generatePerson$$ CREATE FUNCTION generatePerson(n.....
  • 1. 创建测试自定义函数(1)CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS varchar(255) CHARSET utf8BEGINDECLARE l_NEW_STR VARCHAR(255); -- 定义变量DECLARE l_NAYIBU_...
  • mysql创建一个函数 delimiter $$ create function 函数名字() returns 返回值类型 begin 函数体… return 返回值(注意类型必须和上面的一样) end delimiter $$ 分隔符(创建函数必须有这个) ...
  • DROP FUNCTION IF EXISTS increaseSeq ;DELIMITER //CREATE FUNCTION increaseSeq() RETURNS INTEGERDETERMINISTICBEGINset @peng:=IFNULL(@peng,0)+1;RETURN @peng ;END//DELIMITER ;
  • Navicat for MySQL 创建自定义函数问题

    千次阅读 2019-02-16 00:20:01
    一般创建函数或者 存储过程,我习惯于在mysql控制台操作, 今天就用 Navicat for MySQL 客户端的向导来创建了一下, 一直提示语法错误。 第一步 、 第二步 第三步   第四步   第六步 保存,竟然...
  • 前一阵子网上风靡的MySQL的udf.dll提权我有所了解~近日由于不再在IDC行业工作了~所以也有所淡忘~只是最近实在手痒,就决定对我的站点所在的服务器下手…….正好用上这招了~站点的服务器是Windows2003企业版的。...
  • delimiter 自定义符号 -- 如果函数体只有一条语句, begin和end可以省略, 同时delimiter也可以省略  create function 函数名(形参列表) returns 返回类型 -- 注意是retruns  begin  函数体 -- 函数内定义的变量...
  • mysql> mysql> delimiter $$ mysql> mysql> CREATE FUNCTION myFunction -> (in_string VARCHAR(255), -> in_find_str VARCHAR(20), -> in_repl_str VARCHAR(20)) -> -> RETURNS VARCHAR(255) -> BEGIN -> DECLARE l...
  • 浅谈mysql 自定义函数

    2020-12-15 07:56:49
    因为工作需要,要写一个mysql自定义行数,如下 DELIMITER $$ DROP FUNCTION IF EXISTS `onlineFunction`$$ CREATE FUNCTION `onlineFunction`(rrrr VARCHAR(50)) RETURNS VARCHAR(255) BEGIN IF(rrrr='online') ...
  • Mysql自定义函数创建和执行

    千次阅读 2020-10-17 16:41:27
    假设students表中包含id和name两个字段,创建一个函数函数的作用是根据id查找name 1、创建表,插入数据 create table students(id int,name varchar(100)); insert into students(id,name) values(1,'annie'),(2,'...
  • 本文实例讲述了MySQL自定义函数用法。分享给大家供大家参考,具体如下: 先来一个简单的,创建一个函数将’2009-06-23 00:00:00’这样格式的datetime时间转化为’2009年6月23日0时0分0秒’这样的格式: DELIMITER $...
  • MySQL数据库自定义函数创建失败问题1.案例 1.案例 目前在项目中,执行创建mysql的函数出错, mysql 创建函数出错信息如下: Caused by: java.sql.SQLException: This function has none of DETERMINISTIC, NO SQL, ...
  • 为了防止分号产生的中途输出,自己定义一个 分隔符,这里仿照mysql官方的例子:使用两个美元符号 $$ 作为分割符号,下面这段代码就是创建一个自定义mysql函数的原型了,可以在这个基础上修改,这样,创建函数就不会...
  • 例子:Set global log_bin_trust_function_creators... -- 开启bin_log 复制 函数创建Drop Function If Exists selfFunction; -- 删掉已经存在的Delimiter $$ -- 定义分隔符,必须要有,可以不是$$CreateFunctions...
  • MySQL5.7创建自定义函数

    千次阅读 2019-11-21 10:12:57
    mysql5.7创建自定义函数时,要注意有一个坑,要加上DELIMITER $ $ ,$ $ DELIMITER 这两个关键字,要不然就会一直报错,要注意!!! 例如: CREATE FUNCTION select_parent_province(parent_area_code VARCHAR(20...
  • mysql自定义函数

    千次阅读 2021-03-13 16:11:49
    1. 自定义函数 语法: CREATE FUNCTION <函数名> ( [ <参数1> <参数1类型> ],[ <参数2> <参数2类型>]) RETURNS <返回值类型> BEGIN  <函数体>  RETURN (<返回值>...
  • 文章目录MySQL自定义函数创建自定义函数自定义函数的调用自定义函数的删除自定义函数的维护流程控制语句条件控制语句循环语句 创建自定义函数 创建自定义函数时, 开发人员需提供函数名、函数参数、函数体、返回值等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,799
精华内容 35,919
关键字:

mysql创建自定义函数

mysql 订阅