【问题标题】:MySQL, phpmyadmin, how to import user defined functionsMySQL,phpmyadmin,如何导入用户定义的函数
【发布时间】:2012-06-15 10:07:00
【问题描述】:

使用 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 

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:

    希望这在 phpmyadmin 中是可能的:

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

    注意,函数可能有安全选项(DEFINER、SQL SECURITY),请在documentation (CREATE PROCEDURE and CREATE FUNCTION Syntax) 中了解这些选项;如果您想使用它们,请检查指定的用户是在另一台服务器上创建的。

    SHOW CREATE FUNCTION Syntax.

    【讨论】:

    • 感谢 Devart,我创建了查询来创建函数,但不知何故它抛出了错误。我已经用错误更新了上面的问题。有什么想法吗?
    • 这可能是旧 phpmyadmin 版本的 DELIMITER 问题 - stackoverflow.com/questions/2846516/…
    • 您也可以尝试使用 PHP 的 mysql 扩展来创建程序。
    【解决方案2】:

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

    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$
    

    【讨论】:

      【解决方案3】:
      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 ;
      

      【讨论】:

        【解决方案4】:

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

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

        只需将其导入您的数据库即可!

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

        【讨论】:

          【解决方案5】:

          如果你是从 PHPMyAdmin 导出的,你需要在代码的头部加上

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

          这可以解决您的问题。

          【讨论】:

            猜你喜欢
            • 2013-09-08
            • 1970-01-01
            • 2016-08-27
            • 2012-02-08
            • 1970-01-01
            • 2017-11-19
            • 2011-12-20
            • 2013-08-26
            • 2012-09-10
            相关资源
            最近更新 更多