我有一个名为my_table的表,它包含hash_value、file_name、file_contents和id的行。
我有一个程序接受来自用户的哈希值。
我希望得到这个值,并创建一个mysql批处理,将文件转储到file_name。
我可以创建一个批处理来转储文件内容。
SELECT file_contents INTO DUMPFILE 'myfilename' FROM my_table WHERE hash_value='myhashvalue';但是,我还没有找到一种方法首先获得file_name并在命令中使用该方法。我还想让我的程序知道批处理是否失败,以及原因(表、文件中没有这样的散列,等等)。
伪码
@file_name = SELECT file_name FROM my_table WHERE hash_value='myhashvalue';
if @file_name is not empty
SELECT file_contents INTO DUMPFILE @file_name FROM my_table WHERE hash_value='myhashvalue';
// if file exists already then the error gets sent to stdout so I can determine that
else
echo something to stdout so I know the user entered a value not in the table
endif我正在以如下方式运行这批
mysql -h localhost -u theuser -pthepassword mydatabase < mybatch.sql谢谢
编辑:,我越来越近了。我可以使用
SELECT @filename:=file_name FROM my_table WHERE hash_value='myhahsvalue';
但是,在我的下一个语句SELECT file_contents INTO DUMPFILE @filename FROM my_table WHERE hash_value='myhashvalue';中尝试使用它时,会出现一个错误。
结果在中,您的SQL语法出现了错误;
编辑2:我现在可以使用它获得文件名(如果基于哈希而存在的话)。我仍在处理错误报告部分,但效果很好。
SELECT @filename:=file_name FROM my_table WHERE hash_value='myhashvalue';
SET @query:=CONCAT("SELECT file_contents INTO DUMPFILE '",@filename,"' FROM mytable WHERE hash_value='myhashvalue'");
PREPARE stmt FROM @query;
EXECUTE stmt;发布于 2013-09-13 11:57:14
我不是“最好”的解决方案,只是添加了--详细的,然后在最后2>&1将stderr重定向到stdout。然后可以解析错误代码的文本。如果输入了无效的散列,则mysql在执行错误1086 (如果该文件已经存在)上失败--谢谢查找
发布于 2013-09-13 12:40:06
我有一个程序接受来自用户的哈希值。
你为什么不简单地修改这个程序来调用SQL呢?如果它所做的只是读取一个值,那么它有什么用处呢?
使用mysql过程读取文件名,将其分配给一个变量,并导入查询:
CREATE PROCEDURE extract (IN hash_in VARCHAR(100))
DETERMINISTIC
BEGIN
DECLARE fname VARCHAR(100);
SELECT file_name INTO fname FROM my_table WHERE hash_value=hash_in LIMIT 0,1;
SELECT file_contents
INTO DUMPFILE fname
FROM my_table WHERE hash_value=hash_in;
END;https://stackoverflow.com/questions/18765511
复制相似问题