String s1 = "create table " +tableName+
"(id number NOT NULL PRIMARY KEY, " +
"url varchar(1000) NOT NULL, " +
"urlHash varchar(1000) NOT NULL, " +
"contentHash varchar(1000), " +
"modDate date, " +
"contentLocation varchar(1000), " +
"status integer, " +
"lastCrawlDate date) ";
String s3 = "create sequence " +sequenceName+ " start with 1 increment by 1 nomaxvalue";
stmt=conn.createStatement();
stmt.executeUpdate(s1);
stmt.executeUpdate(s3);
ps = conn.prepareStatement (
"INSERT INTO testing (id, url, urlHash, contentHash, modDate, contentLocation, status, lastCrawlDate) VALUES(test_seq.nextval,?,?,?,?,?,?,?)");
ps.setString (1, url);
ps.setString (2, urlHash);
ps.setString (3, contentHash);
ps.setString (4, modDate);
ps.setString (5, contentLocation);
ps.setLong (6, status);
ps.setString (7, lastCrawlDate);
Что я делаю в этом, я создаю таблицу и последовательность для автоматического увеличения. И затем я вставляю в базу данных оракула, используя подготовленное заявление. И эта таблица содержит огромное количество данных около 20 000 записей.
Первая проблема: -
Итак, теперь мне нужно сделать, если мне нужно добавить какой-либо URL и другие соответствующие данные в эту таблицу, я должен искать в таблице, чтобы увидеть, существует ли этот URL в этой таблице или нет. Если он не существует, добавьте этот URL в таблицу и другие соответствующие данные. Итак, как я могу достичь этого , если существует, тогда сделать это, иначе сделать это функциональность в Oracle OQL
Для первой проблемы я могу запустить запрос на выборку по url или urlHash, чтобы увидеть, существует или нет url, если он не добавлен, то
rs = stmt.executeQuery("SELECT urlHash FROM " +tableName+ " where urlHash ='urlHash' ");
while (rs.next()) {
String last = rs.getString("urlHash");
}
А затем сравните значения и, если они не сравниваются, добавьте их.
Я не думаю, что это путь, по которому я должен идти. И какой самый быстрый способ решить эту первую проблему?
Вторая проблема-
А во-вторых, если этот URL-адрес существует, и он был изменен (мы можем видеть это в последнем измененном заголовке, и я сохраняю это значение в modDate), то обновите URL-адрес другими соответствующими данными.
Так что это своего рода проблема
if URL does not Exists {
Add to the oracle table and other data
} else if(url got modified by checking the modDate) {
update the url into oracle database and other data
}
Обновление в соответствии с решениями для крыльев: -
Я пытаюсь преобразовать строковый тип даты в тип Date, но получаю сообщение об ошибке в качестве параметра Missing IN или OUT в индексе 8. Почему это так?
ps = conn.prepareStatement(
"MERGE INTO testing " +
"USING ( SELECT ? AS url, " + // We will maybe add this record
" ? AS urlHash, " +
" ? AS contentHash, "+
" TO_DATE(?, 'YYYY-MM-DD'T'HH24:MI:SS'Z'') AS modDate, "+
" ? AS contentLocation, "+
" ? AS status, "+
" TO_DATE(?, 'YYYY-MM-DD'T'HH24:MI:SS'Z'') AS lastCrawlDate "+
" FROM dual ) maybe "+
" ON (maybe.urlHash = testing.urlHash) "+
" WHEN MATCHED THEN "+
// We only need update the fields that might have changed
" UPDATE SET testing.contentHash = maybe.contentHash, "+
" testing.modDate = maybe.modDate, "+
" testing.contentLocation = maybe.contentLocation, "+
" testing.status = maybe.status, "+
" testing.lastCrawlDate = maybe.lastCrawlDate "+
// But only if the new record is more recent
" WHERE TO_CHAR(testing.modDate, 'YYYY-MM-DD'T'HH24:MI:SS'Z'') < TO_CHAR(maybe.modDate, ''YYYY-MM-DD'T'HH24:MI:SS'Z''') "+
" WHEN NOT MATCHED THEN "+
// Insert new URL record
" INSERT VALUES (test_seq.nextval, maybe.url, maybe.urlHash, maybe.contentHash, maybe.modDate, maybe.contentLocation, maybe.status, maybe.lastCrawlDate)");
ps.setString (1, "http://www.computergeeks.com");
ps.setString (2, "ahsasoiowiewie");
ps.setString (3, "sgasjwhwueybdbfndf");
ps.setString (4, "2011-07-28T23:54:14Z");
ps.setString (5, "c://");
ps.setLong (6, 0);
ps.setString (7, "2011-07-28T23:54:14Z");
ps.executeUpdate();
ps.close();