Как отправить поле метки времени в хранимый процесс Oracle. с Java несмотря на конфиг БД? - PullRequest
2 голосов
/ 24 марта 2010

Я делаю запрос из веб-приложения java к хранимой процедуре Oracle, в которой указан параметр IN Timestamp.

Информация о том, как путешествует информация, выглядит примерно так:

javaWebApp -} клиент веб-сервиса -} ws -} сохраненная процедура

И я отправляю параметр Timestamp в виде отформатированной строки из клиента веб-сервиса в ws.

В среде тестирования работает отправка:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss a");
input.setTimestampField(dateFormat.format(new Date()));

Как видите, отформатированная строка отправляется. Но в производственной среде возникает исключение

ORA-01830: date format picture ends before converting entire input string.

Это относится к разным форматам, возможно, из-за различий в конфигурации от одной БД к другой. Я знаю, что среда тестирования должна быть точной копией производственного сайта, но не в моих руках правильно их настроить. И мне нужно отправить поле Timestamp-as-a-formatted-string, несмотря на то, как они настраивают базу данных. Есть идеи? Заранее спасибо.

**** РЕДАКТИРОВАТЬ ****: Я нашел способ заставить его работать должным образом, несмотря на конкретную конфигурацию. Это так же просто, как установка инструкции вызова в веб-сервисе с соответствующими инструкциями Oracle. Я имею в виду, что вызов хранимой процедуры Oracle произошел с

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

до

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,TO_TIMESTAMP(?, 'DD-MM-YYYY HH24:MI:SS'),?,?,?,?,?,?,?,?,?,?,?)"

в то время как формат, который я установил в вызове процедуры, совпадает с форматом, отправленным веб-приложением с использованием SimpleDateFormat, указанного в исходном вопросе, слегка измененном:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

Спасибо всем за помощь и идеи.

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Стандартное значение NLS_DATE_FORMAT обычно не включает время и только двузначный год. Вероятно, это либо ДД-ММ-ГГ, либо ММ-ДД-ГГ.

Если WS получает строку и хранимой процедуре базы данных требуется временная метка, тогда им обоим нужно будет согласовать маску формата. Либо WS, когда он подключается к базе данных, должен установить явный формат даты, либо база данных должна иметь возможность принимать строку и преобразовывать ее, используя жестко закодированный формат.

Если нет определенных согласований, которые вы определили в WS, ничто из JavaWebApp или WebServiceClient не сможет повлиять на формат, который, как предполагает база данных, использует WS.

Все это говорит, я бы посмотрел любой другой код на вашем конце и посмотреть, есть ли что-нибудь подобное. Вы можете найти что-то еще, используя определенный формат.

0 голосов
/ 25 марта 2010

Как выглядит ваш запрос в подготовленном операторе input? Эта ошибка означает, что Oracle не нравится формат даты, который вы передали. В вашей тестовой среде может быть установлен другой NLS_DATE_FORMAT для используемой базы данных или машины / драйвера.

...