5

Oracle データベースに接続する ADO.Net に OLEDB プロバイダーを使用しています。私のループでは、挿入を行っています:

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 番目の挿入ではエラーが発生します。

ORA-00933: SQL command not properly ended

私は何を間違っていますか?

4

10 に答える 10

14

.netで、末尾にセミコロンが付いた単一のOracleSQLステートメントを実行しようとすると。結果は、Oracleエラーになります:ora-00911:無効な文字。OK、1つのSQLステートメントにセミコロンは必要ないことがわかりますが、たとえば、1つの文字列で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つのOracleSQLステートメントをaBEGINEND;構文でラップすることです。次に例を示します。

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 + execute + multiple + Oracle + SQL + statement

于 2011-05-19T10:03:04.247 に答える
10

Oracle では、セミコロン「;」sqlplus でのみ使用されます。ODBC/JDBC、OLEDB などを使用している場合は、ステートメントの最後にセミコロンを付けません。上記の場合、実際には 2 つの異なるステートメントを実行しているため、問題を処理する最善の方法は、セミコロンを使用できないため、1 つのステートメントに結合しようとする代わりに 2 つのステートメントを使用することです。

于 2013-06-19T14:25:22.847 に答える
3

最初の挿入後のセミコロン?

于 2008-09-16T13:29:25.613 に答える
3

私には;、2 つのステートメントの間に a が欠けているようです: を追加して、お知らせください。
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)
;
;

于 2008-09-16T13:30:55.970 に答える
2

Oracle SQL はセミコロンを使用します。ステートメントマーカーの終わりとして。

; を追加する必要があります。面倒な挿入ステートメントの後。

注意: これは、ADODB が 1 回の呼び出しで 2 つの挿入を許可することも前提としています。

別の方法として、両方の呼び出しをブロックでラップすることもできます。

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;
于 2008-09-16T13:29:53.100 に答える
1

私のループでは、StringBuilderを再初期化していませんでした...したがって、投稿した複数の挿入ステートメントです。

とにかく助けてくれてありがとう!!

于 2008-09-16T14:33:08.767 に答える
0

セミコロンの問題に加えて、バインド変数を調べることを強くお勧めします。それらを使用しないと、後でデータベースのパフォーマンスの問題が発生する可能性があります。コードもきれいになる傾向があります。

于 2008-09-17T00:12:46.800 に答える
0

ADO.NET OLE DB プロバイダーは、データベース用の特定のプロバイダーがない汎用データ アクセス用です。Oracle データベース接続には、OleDbConnection よりも OracleConnection などを使用してください。

于 2008-09-16T13:54:27.037 に答える
0

それはロングショットですが、最初の挿入ではSQL日付形式は英国/米国の両方で有効です.Oracle DBが英国の日付形式に設定されている場合、2番目の挿入は無効です.TO_DATE関数を使用したことはわかりましたが、私はしません他のものを見る...

于 2008-09-16T13:35:16.427 に答える