ОРА-00933:Команда SQL завершилась неправильно
Вопрос
Я использую поставщика OLEDB для подключения ADO.Net к базе данных Oracle.В моем цикле я делаю вставку:
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
Первая вставка успешна, но вторая выдает ошибку:
ORA-00933: SQL command not properly ended
Что я делаю не так?
Решение
Мне кажется, тебе не хватает ;
между двумя утверждениями:
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)
;
insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
;
Попробуйте добавить ;
и дайте нам знать.
Другие советы
В .net, когда мы пытаемся выполнить один оператор Oracle SQL с точкой с запятой в конце.Результатом будет ошибка оракула:ора-00911:неправильный символ.Хорошо, вы понимаете, что одному оператору SQL не нужна точка с запятой, но как насчет выполнения двух операторов SQL в одной строке, например:
Dim db As Database = DatabaseFactory.CreateDatabase("db")
Dim cmd As System.Data.Common.DbCommand
Dim sql As String = ""
sql = "DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; "
cmd = db.GetSqlStringCommand(sql)
db.ExecuteNonQuery(cmd)
Приведенный выше код выдаст ту же ошибку Oracle:ора-00911:неправильный символ.
Решение этой проблемы состоит в том, чтобы обернуть два оператора Oracle SQL в BEGIN
и END;
синтаксис, например:
sql = "BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;"
В оракуле полуколон ';' используется только в sqlplus.Когда вы используете ODBC/JDBC, OLEDB и т. д., вы не ставите точку с запятой в конце вашего оператора.В приведенном выше случае вы на самом деле выполняете два разных оператора, поэтому лучший способ решить проблему — использовать два оператора вместо того, чтобы пытаться объединить их в один, поскольку вы не можете использовать точку с запятой.
точка с запятой после первой вставки?
Oracle SQL использует точку с запятой;в качестве маркера конца оператора.
вам нужно будет добавить ;после беспокойства вставьте утверждения.
Примечание:это также предполагает, что ADODB разрешит 2 вставки за один вызов.
альтернативой может быть заключение обоих вызовов в блок,
BEGIN
insert (...) into (...);
insert (...) into (...);
END;
В моем цикле я не повторно инициализировал свой StringBuilder... поэтому я опубликовал оператор множественной вставки.
В любом случае спасибо за вашу помощь!!
Это долгий путь, но в первой вставке формат даты sql действителен как для Великобритании, так и для США, вторая вставка недействительна, если база данных Oracle настроена для формата даты в Великобритании. Я понимаю, что вы использовали функцию TO_DATE, но я этого не делаю. посмотреть еще что-нибудь...
Нужна ли точка с запятой в OLE_DB?Это не требуется для большинства API?
Поставщик ADO.NET OLE DB предназначен для общего доступа к данным, когда у вас нет конкретного поставщика для вашей базы данных.Используйте OracleConnection и др. вместо OleDbConnection для подключения к базе данных Oracle.
Помимо проблемы с точкой с запятой, я настоятельно рекомендую вам изучить переменные связывания.Неиспользование их может привести к проблемам с производительностью базы данных в будущем.Код также имеет тенденцию быть чище.
Проблема может заключаться в том, что в запрос вставляется переменная параметра, имеющая нулевое значение.В этом и заключалась моя проблема.Как только я присвоил параметру значение по умолчанию (пустая строка), все заработало.