ОРА-00933:Команда SQL завершилась неправильно

StackOverflow https://stackoverflow.com/questions/72151

  •  09-06-2019
  •  | 
  •  

Вопрос

Я использую поставщика 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;"

Учтивость: http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statements

В оракуле полуколон ';' используется только в 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.

Помимо проблемы с точкой с запятой, я настоятельно рекомендую вам изучить переменные связывания.Неиспользование их может привести к проблемам с производительностью базы данных в будущем.Код также имеет тенденцию быть чище.

Проблема может заключаться в том, что в запрос вставляется переменная параметра, имеющая нулевое значение.В этом и заключалась моя проблема.Как только я присвоил параметру значение по умолчанию (пустая строка), все заработало.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top