ORA-00933: команда SQL неправильно завершена - PullRequest
5 голосов
/ 16 сентября 2008

Я использую провайдер 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

Что я делаю не так?

Ответы [ 11 ]

12 голосов
/ 19 мая 2011

В .net, когда мы пытаемся выполнить один оператор SQL SQL с точкой с запятой в конце. Результатом будет ошибка оракула: ora-00911: недопустимый символ. Хорошо, вы понимаете, что для одного оператора SQL не нужна точка с запятой, а как насчет выполнения 2 операторов 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: ora-00911: недопустимый символ.

Решение этой проблемы состоит в том, чтобы обернуть ваши 2 оператора 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

5 голосов
/ 19 июня 2013

В Оракуле точка с запятой ';' используется только в sqlplus. Когда вы используете ODBC / JDBC, OLEDB и т. Д., Вы не ставите точку с запятой в конце своего оператора. В приведенном выше случае вы фактически выполняете 2 разных оператора, поэтому лучший способ справиться с этой проблемой - использовать 2 оператора, а не пытаться объединить их в один оператор, поскольку вы не можете использовать точку с запятой.

3 голосов
/ 16 сентября 2008

Мне кажется, вы пропускаете ; между двумя утверждениями:
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)
;
Попробуйте добавить ; и сообщите нам.

2 голосов
/ 16 сентября 2008

Oracle SQL использует точку с запятой; как маркер конца оператора.

вам нужно будет добавить; после беспокойства вставьте отметки.

NB: предполагается, что ADODB разрешит 2 вставки за один вызов.

альтернативой может быть упаковка обоих вызовов в блок,

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;
2 голосов
/ 16 сентября 2008

точка с запятой после первой вставки?

1 голос
/ 16 сентября 2008

В моем цикле я не инициализировал мой StringBuilder ... таким образом, оператор множественной вставки, который я опубликовал.

Спасибо за помощь в любом случае !!

0 голосов
/ 01 февраля 2018

Возможно, проблема в том, что у вас есть переменная параметра, которая вставляется в запрос без значения. Это была моя проблема. Как только я присвоил параметру значение по умолчанию для пустой строки, оно заработало.

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 16 сентября 2008

Поставщик ADO.NET OLE DB предназначен для общего доступа к данным, когда у вас нет конкретного поставщика для вашей базы данных. Используйте OracleConnection и др. Вместо OleDbConnection для соединения с базой данных Oracle.

0 голосов
/ 16 сентября 2008

Требуется ли точка с запятой от OLE_DB? Это не нужно для большинства API?

...