質問

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

私の何が間違っているのでしょうか?

役に立ちましたか?

解決

私にはあなたが欠けているように思えます ; 2 つのステートメントの間:
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 ステートメントを実行しようとしたとき。結果はオラクルエラーになります:ora-00911:無効な文字です。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 つの 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

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

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

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

; を追加する必要があります。わざわざステートメントを挿入した後。

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

代わりに、両方の呼び出しをブロックでラップすることもできます。

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;

私のループでは StringBuilder を再初期化しなかったので、複数の挿入ステートメントを投稿しました。

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

かなりの確率ですが、最初の挿入では、SQL の日付形式は英国と米国の両方で有効ですが、Oracle DB が英国の日付形式に設定されている場合、2 番目の挿入は無効です。TO_DATE 関数を使用していることはわかりますが、使用していません。他に何かを見る...

OLE_DB にはセミコロンが必要ですか?ほとんどの API では必要ありません。

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

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

問題は、null のパラメーター変数がクエリに挿入されている可能性があります。それが私の問題でした。パラメータにデフォルト値の空の文字列を指定すると、機能しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top