我有问题。我正在编写一个Java应用程序,它将移动一些文件。由于性能问题,用户可以选择要移动的文件数量。如果文件被移动,则我的数据库将使用新路径进行更新。我已经对此进行了编码,但是现在的问题是它仅适用于第一个文件,例如10个文件。然后,应用程序终止。因此,到目前为止,一切都按预期进行。现在,我想再次启动该应用程序,它将再次移动10个文件。现在的问题是,它再次从数据库的顶部开始,并尝试移动前10个文件,直到在我的应用程序的第一次运行中已经移动过。那么如何告诉我的程序它将跳过前10(n)个文件?
我有一个想法,用一和零为数据库生成一个新列。每个已移动的文件都将获得1,并且其默认设置为0。然后程序检查是否存在一个或零,如果存在一个,则仅继续下一行。但是我没有找到关于如何使用Java在数据库中创建列的方法。下一个问题是在运行应用程序后,将删除此列。
我试图编写一个过程,发现了这一点:
DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
DECLARE _count INT;
SET _count =( SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'test_cm_documents' AND
COLUMN_NAME='subscribe_all');
IF _count = 0 THEN
ALTER TABLE test_cm_documents
ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
END IF;
END$$
DELIMITER ;
如果我将其粘贴到mysql命令行中就可以了,但是当我尝试用Java程序执行它时就不起作用了。我也尝试将其另存为* .sql文件,但无法从Java程序执行。
我有两个Java程序,试图解决我的问题,但遇到几个错误。
import java.io.*;
public class CmdExec {
public static void main(String[] args) {
try {
String line;
Process p = Runtime.getRuntime().exec(
"mysql -u myuser -p xxxx -d cm_database -h 3306 -f C://Users//****//Desktop//procedure.sql");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}catch(Exception err) {
err.printStackTrace();
}
}
}
错误:java.io.IOException:无法运行程序“ mysql”:CreateProcess错误= 2,达斯System kann die angegebene Datei nicht finden在java.lang.ProcessBuilder.start(未知来源)在java.lang.Runtime.exec(未知来源)在java.lang.Runtime.exec(未知来源)在CmdExec.main(CmdExec.java:8)由以下原因引起:java.io.IOException:CreateProcess错误= 2,Das系统看板天使之死在java.lang.ProcessImpl.create(本机方法)在java.lang.ProcessImpl。(未知来源)在java.lang.ProcessImpl.start(未知来源)...另外5个
第二个Java程序:
import java.sql.*;
public class startProcedure {
public static void main(String[] args) {
try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cm_database?allowPublicKeyRetrieval=true&SSL=false&serverTimezone=UTC",
"myuser","xxxx");
Statement delimiter = conn.createStatement();){
String delimiterStr =
"CREATE PROCEDURE Alter_Table() "
+ " BEGIN "
+ " DECLARE _count INT; "
+ " SET _count =( SELECT COUNT(*) "
+ " FROM INFORMATION_SCHEMA.COLUMNS "
+ " WHERE TABLE_NAME='test_cm_documents' AND "
+ " COLUMN_NAME='subscribe_all'); "
+ " IF _count = 0 THEN "
+ " ALTER TABLE test_cm_documents"
+ " ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,"
+ " ADD COLUMN subscribe_category varchar(512) DEFAULT NULL "
+ " END IF; "
+ " END; "
;
delimiter.executeUpdate(delimiterStr);
}catch(SQLException ex) {
ex.printStackTrace();
}
}
}
我收到以下错误:您的SQL语句中有错误。
也许有人可以帮助我,因为我对这个话题还很陌生。优秀的应用程序将仅跳过n行。我认为这将是最简单的解决方案。
使用Cte查询可跳过前10(n)个文件并获取最近保存的同一行。例如
GID MID ROWNUMBER
1 1 1
1 2 1
1 2 2
1 2 3
2 1 1
2 2 1
2 2 2
2 3 5
2 4 4
with Demo as
(
select *, ROW_NUMBER() over (partition by GID, MID order by UID) as ROWNUMBER from Table1 where DateEntered > '2015-06-13 00:00:00.000'
)
创建表
UID GID MID ROWNUMBER
1 1 1 1
2 1 2 1
3 1 2 2
4 1 2 3
5 2 1 1
6 2 2 1
7 2 2 2
8 2 3 5
9 2 4 4
select * from Demo ROWNUMBER = 10