满足条件时MySQL加载数据Infile

标签 mysql stored-procedures if-statement load-data-infile

我目前正在构建一个 MySQL 数据库。数据库正在存储由另一个组织提供的数据,我们收到的文件格式,容我们说,有些不一致。

我编写了一个函数,该函数根据一些简单的规则评估文件并返回一条消息“文件正常”或硬编码错误消息列表之一。我想使用此功能的方式是这样说:

if check_10m_file() = 'file ok' then 
  load data infile '\\\\server\\filepath\file.csv'
  fields terminated by ','
  ...(etc)

我的问题是 if..then..else 控制结构似乎不允许在存储过程之外并且不允许 load data infile 命令在存储过程中。

我试图通过将 load data infile 语句构建为准备好的语句来绕过这个问题,但随后出现错误

“预处理语句协议(protocol)尚不支持此命令”

所以我的问题是,有没有人知道只有在满足条件时我才能运行加载数据语句的方法?理想情况下,我想将其放入存储过程中,但如果我可以将代码保存为脚本以便稍后运行,那是可以接受的。

最佳答案

一种选择是使用 UDF ,例如:lib_mysqludf_sys .

安装完 UDF 后,您可以执行以下操作:

Shell 脚本 (/server/loadpath/load.sh):

mysql -u [user] -p[pass] -e "LOAD DATA INFILE '$1' INTO TABLE $2;"

存储过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS load_data$$

CREATE PROCEDURE load_data(pfile VARCHAR(100), pdbtable VARCHAR(100))
BEGIN
    DECLARE exec_str VARCHAR(500);
    DECLARE ret_val INT;
    IF (check_10m_file() = 'file ok') THEN
        SET exec_str := CONCAT('sh /server/loadpath/load.sh ', pfile, ' ', pdbtable);
        SET ret_val := sys_exec(exec_str);
        IF ret_val = 0 THEN
            SELECT 'OK' Result;
        ELSE
            SELECT 'ERROR' Result;
        END IF;
    END IF;
END$$

DELIMITER ;

CALL load_data('/server/filepath/file.csv', 'mydb.mytable');

重要提示:验证输入数据以防止任何代码注入(inject)。

关于满足条件时MySQL加载数据Infile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19053263/

相关文章:

mysql - 为什么我通过子查询的结果得到错误组?

mysql - 不更新表行的过程

javascript - 如果语句不正确并且没有重定向到 JavaScript 中的正确页面

mysql - 如何使用 phpmyadmin 4.0.4.1 和 Xampp v3.2.1 设置 mysql 数据库

php - 通过多个连接加速 MySQL 查询

php - 从多个插入查询中恢复生成的 ID

python - 对 Learn Python the Hard Way ex41 中的 if 语句感到困惑?

java - if 语句的细微变化导致意外结果

php - 如何确保在检查时该值仅保存到表中一次?

sql-server - SSRS 报告呈现的查询计划在哪里