#sql #oracle #prepared-statement
#sql #Oracle #подготовленный оператор
Вопрос:
String s1 = "create table testing "
"(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 s2 = "create sequence " sequenceName " start with 1 increment by 1 nomaxvalue";
stmt=conn.createStatement();
stmt.executeUpdate(s1);
stmt.executeUpdate(s2);
Что не так с приведенным ниже оператором слияния, я всегда получаю ошибку как
Missing IN or OUT parameter at index:: 8
Я пытаюсь преобразовать строковую дату и время в тип данных даты в oracle sql в отчете о подготовке
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 HH24:MI:SS') 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, "2010-09-24 23:34:14");
ps.executeUpdate();
ps.close();
Комментарии:
1. Я никогда не могу понять, почему люди не используют хранимые процедуры и функции, чтобы избежать использования такого глупого кода, как этот!
Ответ №1:
Формат даты в вашем первом TO_DATE
вызове никуда не годится — вы пытаетесь использовать одинарные кавычки внутри строки, заключенной в одинарные кавычки, поэтому в итоге она не будет заключена должным образом. Вероятно, это приводит к сбоям синтаксического анализатора, что приводит к не очень разумному сообщению об ошибке.
В формате даты Oracle литеральные биты должны быть заключены в двойные кавычки, а не в одинарные:
select TO_DATE('2011-07-28T23:54:14Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') from dual;
Вам необходимо внедрить формат 'YYYY-MM-DD"T"HH24:MI:SS"Z"'
в свой оператор SQL. Убедитесь, что вы правильно экранируете двойные кавычки, чтобы они не завершали строку Java.
Ответ №2:
Возможно, это не относится к вашей проблеме, но я получал ту же ошибку, и у меня было две строки комментариев в начале моего SQL. Я переместил их в нижнюю часть, и ошибка исчезла.