目前我的程序运行正常,但是如何不使用嵌套的while循环(一个while循环在另一个while循环内)来实现此程序。这是一种儿童编程方式,我的办公室同事不希望我写像这样的代码。那么有没有其他方法可以实现此程序,也可以有适当的方法来实现上述代码中的while循环?
这是我的当前代码:
package Snomed.Snomed;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
import catalog.Root;
public class Snomedinfo {
public void snomedinfoinsert() {
Root oRoot = null;
ResultSet oRsSelect = null;
PreparedStatement oPrStmt = null;
PreparedStatement oPrStmt2 = null;
PreparedStatement oPrStmtSelect = null;
String strSql = null;
String snomedcode = null;
ResultSet oRs = null;
String refid = null;
String id = null;
String effectivetime = null;
String active = null;
String moduleid = null;
String conceptid = null;
String languagecode = null;
String typeid = null;
String term = null;
String caseSignificanceid = null;
try {
oRoot = Root.createDbConnection(null);
strSql = "SELECT id FROM snomed_conceptdata WHERE active=1 ";
oPrStmt2 = oRoot.con.prepareStatement(strSql);
oRsSelect = oPrStmt2.executeQuery();
String strSql2 = "SELECT * FROM snomed_descriptiondata WHERE conceptid =? AND active=1 ";
oPrStmtSelect = oRoot.con.prepareStatement(strSql2);
String sql = "INSERT INTO snomedinfo_data (refid,id,effectivetime,active,moduleid,conceptid,languagecode,typeid,term,caseSignificanceid) VALUES( ?, ?, ?,?,?,?,?,?,?,?)";
oPrStmt = oRoot.con.prepareStatement(sql);
while (oRsSelect.next()) //first while loop
{
snomedcode = Root.TrimString(oRsSelect.getString("id"));
oPrStmtSelect.setString(1, snomedcode);
oRs = oPrStmtSelect.executeQuery();
while (oRs.next()) //second while loop
{
refid = Root.TrimString(oRs.getString("refid"));
id = Root.TrimString(oRs.getString("id"));
effectivetime = Root.TrimString(oRs.getString("effectivetime"));
active = Root.TrimString(oRs.getString("active"));
moduleid = Root.TrimString(oRs.getString("moduleid"));
conceptid = Root.TrimString(oRs.getString("conceptid"));
languagecode = Root.TrimString(oRs.getString("languagecode"));
typeid = Root.TrimString(oRs.getString("typeid"));
term = Root.TrimString(oRs.getString("term"));
caseSignificanceid = Root.TrimString(oRs.getString("caseSignificanceid"));
oPrStmt.setString(1, refid);
oPrStmt.setString(2, id);
oPrStmt.setString(3, effectivetime);
oPrStmt.setString(4, active);
oPrStmt.setString(5, moduleid);
oPrStmt.setString(6, conceptid);
oPrStmt.setString(7, languagecode);
oPrStmt.setString(8, typeid);
oPrStmt.setString(9, term);
oPrStmt.setString(10, caseSignificanceid);
oPrStmt.executeUpdate();
}
}
System.out.println("done");
} catch (Exception e) {
e.printStackTrace();
} finally {
oRsSelect = Root.EcwCloseResultSet(oRsSelect);
oRs = Root.EcwCloseResultSet(oRs);
oPrStmt = Root.EcwClosePreparedStatement(oPrStmt);
oPrStmt = Root.EcwClosePreparedStatement(oPrStmt2);
oPrStmt = Root.EcwClosePreparedStatement(oPrStmtSelect);
oRoot = Root.closeDbConnection(null, oRoot);
}
}
public static void main(String args[]) throws Exception {
Snomedinfo a = new Snomedinfo();
a.snomedinfoinsert();
}
}
注意:导入过程也可以,但是有点慢。我已经尝试过为conceptid列使用索引。
答案 0 :(得分:1)
由于INSERT
语句中使用的所有数据都来自您的'SELECT'语句,因此在Java应用程序与数据库之间进行额外的往返是没有意义的。在一条SQL语句中执行所有操作将为您带来最佳性能。
您的SQL语句应该是这样
INSERT INTO snomedinfo_data (refid,id,effectivetime,active,moduleid,conceptid,languagecode,typeid,term,caseSignificanceid)
SELECT d.refid, d.id, d.effectivetime, d.active, d.moduleid, d.conceptid, d.languagecode, d.typeid, d.term, d.caseSignificanceid
FROM snomed_descriptiondata d
JOIN snomed_conceptdata c ON c.id = d.conceptid AND c.active = 1 AND d.active = 1
您的Java代码可以归结为这个
try {
oRoot = Root.createDbConnection(null);
String sql = "INSERT INTO snomedinfo_data...";
oPrStmt = oRoot.con.prepareStatement(sql);
oPrStmt.executeUpdate();
}
答案 1 :(得分:0)
如果我正确地阅读了您的代码,那么您正在从一个表中读取并添加到另一个表中,并且永远不要在应用程序中使用数据。如果是这种情况,那么最好的情况是编写一个数据库过程,该过程将转换您的数据并从您的应用程序中执行。
答案 2 :(得分:0)
如果我是正确的,那么您正在使用两个查询从数据库中获取数据。 使用此嵌套查询,它将节省数据库连接的工作量并在while循环中嵌套
SELECT * FROM snomed_descriptiondata中的conceptid(在SELECT id from snomed_conceptdata中,active = 1且active = 1)