我目前正在构建一个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
语句构建为预备语句来欺骗我,但后来我收到错误
“准备好的语句协议中不支持此命令”
所以我的问题是,有没有人知道我只有在满足条件时才能运行加载数据语句的方法?理想情况下,我希望将其放入存储过程中,但如果我可以将代码保存为稍后运行的脚本,那么这是可以接受的。
答案 0 :(得分: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');
重要事项:验证输入数据以防止任何代码注入。