INSERT INTO TAB_THD_ATTND_EVENTS(
ATND_EVNT_INDEXNO, ATND_EVNT_USERID, ATND_EVNT_USERNAME, ATND_EVNT_DT,
ATND_EVNT_ENEX_TYPE, ATTND_EVNT_MSTR_CNTRLID, ATTND_EVNT_DOOR_CNTRLID, ATTND_EVNT_SPCL_FNCTNID,
ATTND_EVNT_LEAVE_DT, ATTND_EVNT_INSERT_DT, ATTND_EVNT_PRCS_FLAG, ATTND_EVNT_PRCS_DT,
CR_DATE
)
SELECT
X.ATND_EVNT_INDEXNO, X.ATND_EVNT_USERID, X.ATND_EVNT_USERNAME, TO_DATE(X.ATND_EVNT_DT,'DD/MM/YYYY HH24:MI:SS'),
X.ATND_EVNT_ENEX_TYPE, X.ATTND_EVNT_MSTR_CNTRLID, X.ATTND_EVNT_DOOR_CNTRLID, X.ATTND_EVNT_SPCL_FNCTNID,
X.ATTND_EVNT_LEAVE_DT, TO_DATE(X.ATTND_EVNT_INSERT_DT,'MM/DD/YYYY HH24:MI:SS'), 'N', '',
SYSDATE
FROM TAB_TDL_ATTND_UPLOAD_TEMP T,
(XMLTABLE('/DocumentElement/event-ta' PASSING T.ATTND_DATA_XML COLUMNS
ATND_EVNT_INDEXNO NUMBER PATH './IndexNo',
ATND_EVNT_USERID NUMBER PATH './UserID',
ATND_EVNT_USERNAME VARCHAR2(100) PATH './UserName',
ATND_EVNT_DT DATE PATH './EventDateTime',
ATND_EVNT_ENEX_TYPE NUMBER PATH './EntryExitType',
ATTND_EVNT_MSTR_CNTRLID NUMBER PATH './MasterControllerID',
ATTND_EVNT_DOOR_CNTRLID NUMBER PATH './DoorControllerID',
ATTND_EVNT_SPCL_FNCTNID NUMBER PATH './SpecialFunctionID',
ATTND_EVNT_LEAVE_DT DATE PATH './LeaveDT',
ATTND_EVNT_INSERT_DT DATE PATH './IDateTime')) X
WHERE T.ATTND_UPLOAD_NO = P_SEQNO;
Выше написан мой запрос на вставку в PLSQL, а ниже приведены данные строки XML, которые я пытаюсь вставить, но получаю указанную ошибку. Может ли кто-нибудь помочь мне с этим?
<event-ta>
<IndexNo>85672</IndexNo>
<UserID>1001</UserID>
<UserName>Testing Data</UserName>
<EventDateTime>17/04/2023 08:08:50</EventDateTime>
<EntryExitType>0</EntryExitType>
<MasterControllerID>34</MasterControllerID>
<DoorControllerID>1</DoorControllerID>
<SpecialFunctionID>0</SpecialFunctionID>
<LeaveDT/>
<IDateTime>04/17/2023 08:08:53</IDateTime>
</event-ta>
Какое это имеет отношение к VB.NET или ASP.NET? Если проблема не связана с этими вещами, тот факт, что приложение, в котором возникает проблема, создано с этими вещами, не имеет значения.
Можно ли использовать ISO 8601 и только ISO 8601 для формата даты в XML? Какой правильный формат для даты/времени в файле XML. В любом случае, можете ли вы уменьшить количество элементов, которые он пытается прочитать, пока он не перестанет выдавать ошибку? Тогда вы знаете, какая часть пошла не так.
Можете ли вы сократить свой код, удалив ненужный код? Оставьте только код, который воспроизводит ту же ошибку! И удалите vb.net из списка тегов! Можете ли вы воспроизвести ту же ошибку при удалении INSERT ? Если да, удалите часть INSERT из своего вопроса. Сделайте свой вопрос максимально простым. Когда вы уменьшите свой код, можете ли вы отправить нам (без INSERT), можете ли вы отобразить, что отображает ваш SELECT при удалении преобразования TO_DATE, чтобы мы могли видеть входное значение TO_DATE?
«ATTND_EVNT_INSERT_DT DATE» должна возвращать дату, верно? Если да, то зачем вам TO_DATE? Не назначайте TO_DATE свидание. TO_DATE строки, чтобы сделать их датами.
Чтобы ответить на ваш вопрос «Почему это», проблема возникает из-за того, что ваше определение ATTND_EVNT_INSERT_DT
как DATE
неверно, потому что формат даты элемента неверен (конечно, отличается от формата данных по умолчанию Oracle
).
Чтобы решить вашу проблему, я предлагаю использовать следующую сокращенную команду (без INSERT, потому что я не думаю, что проблема в операторе INSERT
Sql).
SELECT TO_DATE(X.ATND_EVNT_DT ,'DD/MM/YYYY HH24:MI:SS')
,TO_DATE(X.ATTND_EVNT_INSERT_DT,'MM/DD/YYYY HH24:MI:SS')
FROM TAB_TDL_ATTND_UPLOAD_TEMP T
,(XMLTABLE('/DocumentElement/event-ta'
PASSING T.ATTND_DATA_XML
COLUMNS ATND_EVNT_DT VARCHAR2(20) PATH './EventDateTime'
,ATTND_EVNT_INSERT_DT VARCHAR2(20) PATH './IDateTime'
)
) X
WHERE T.ATTND_UPLOAD_NO = P_SEQNO;
Я только заменил DATE
в части XML на VARCHAR2(20)
.
Если эта команда не работает, сообщите нам о том, что возвращает следующая команда
SELECT X.ATND_EVNT_DT
,X.ATTND_EVNT_INSERT_DT
FROM TAB_TDL_ATTND_UPLOAD_TEMP T
,(XMLTABLE('/DocumentElement/event-ta'
PASSING T.ATTND_DATA_XML
COLUMNS ATND_EVNT_DT VARCHAR2(20) PATH './EventDateTime'
,ATTND_EVNT_INSERT_DT VARCHAR2(20) PATH './IDateTime'
)
) X
WHERE T.ATTND_UPLOAD_NO = P_SEQNO;
X.ATND_EVNT_DT и X.ATTND_EVNT_INSERT_DT, по-видимому, являются столбцами типа данных VARCHAR2 и должны содержать значение в указанном вами формате, а именно: ДД/ММ/ГГГГ ЧЧ24:МИ:СС (и ММ/ДД/ГГГГ ЧЧ24:МИ:СС). ). Oracle говорит, что значение столбца на самом деле не соответствует этому формату. Вообще говоря, вы должны хранить значения дат в столбцах типа DATE, чтобы избежать таких проблем. Что теперь? Найдите значения, отличающиеся от указанного вами формата, и исправьте их.