2

使用 MySQL,如何使用 phpmyadmin 将用户定义的数据库函数从一个数据库服务器导入另一台数据库服务器?

可以使用以下 SQL 获取用户定义函数的列表:

select * from information_schema.routines;

这是我想移动到不同数据库服务器的函数:

CREATE DEFINER=`XXX`@`%` FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
   DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END

但我收到一个错误:

Error

SQL query:

CREATE DEFINER = `XXX`@`%` FUNCTION `BDayDiff` (
d1 DATE,
d2 DATE
) RETURNS INT( 11 ) DETERMINISTIC BEGIN DECLARE dow1,
dow2,
days,
wknddays INT;

MySQL said: Documentation
#1064 - 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 '' at line 5 
4

5 回答 5

6

通过添加 $ 试试这个,它对我有用。

DELIMITER $

CREATE DEFINER=`XXX`@`%` FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
   DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END$
于 2012-06-13T06:41:03.287 回答
2

希望这在 phpmyadmin 中是可能的:

  • 执行 SHOW CREATE FUNCTION
  • 您将看到 CREATE FUNCTION 语句,对另一个 MySQL 服务器执行它
  • 对每个功能重复此步骤。

请注意,函数可能具有安全选项(DEFINER、SQL SECURITY),请在文档中阅读这些选项(CREATE PROCEDURE 和 CREATE FUNCTION 语法);如果要使用它们,请检查是否在另一台服务器上创建了指定用户。

显示创建函数语法

于 2012-06-12T14:11:14.377 回答
0
If you are using phpmyadmin interface to execute the query for function then you should follow the steps as below: 

DELIMITER $$

CREATE FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
    DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END $$

DELIMITER ;
于 2014-04-13T10:53:50.090 回答
0

为了导出用户定义的函数:

在 PhpMyAdmin 中打开您的数据库。之后单击“导出”按钮。在打开的窗口中,它应该是下面的复选框(如果没有显示,请选择“自定义 - 显示所有可能的选项”): 1)添加 DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT;2) 增加CREATE PROCEDURE/FUNCTION/EVENT;检查并导出它。

只需将其导入您的数据库,它就可以正常工作!

PS 您可以在 Information Schema DB 的 Routines 表中看到这些功能,但您不能直接导入它,因为即使您是 root 用户也没有权限。

于 2015-09-03T08:16:20.253 回答
0

如果您已从 PHPMyAdmin 导出它,则需要在代码开头包含

    DELIMITER $
CREATE DEFINER=`root`@`localhost` FUNCTION

DELIMITER ;

这可以解决您的问题。

于 2019-07-31T09:24:04.487 回答