[MySQL满足条件时加载数据文件

问题描述 投票:1回答:1

我目前正在建立一个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语句构建为准备好的语句来解决这个问题,但随后出现错误

“此语句在预准备语句协议中尚不支持”

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

mysql stored-procedures if-statement load-data-infile
1个回答
0
投票

一个选项是使用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');

重要:验证输入数据以防止任何代码注入。

© www.soinside.com 2019 - 2024. All rights reserved.