9

C# で入力と出力を使用して oracle ストアド プロシージャ コールを作成しようとするとclob、次のエラーが発生します。

ORA-01036: illegal variable name/number\n

コード自体は次のとおりです。

OracleTransaction transaction = connection.BeginTransaction();
OracleCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = 
      @"declare xx clob; 
      begin dbms_lob.createtemporary(xx, false, 0); 
      :tempclob := xx; end;";

command.Parameters.Add(new OracleParameter("tempclob", OracleType.Clob))
    .Direction = ParameterDirection.Output;

command.ExecuteNonQuery();

OracleLob tempLob = (OracleLob)command.Parameters[0].Value;
//byte[] tempbuff = new byte[10000];
byte[] tempbuff = System.Text.Encoding.Unicode.GetBytes(generateXMLMessage());

tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(tempbuff, 0, tempbuff.Length);
tempLob.EndBatch();
command.Parameters.Clear();
command.CommandText = "InsertMessageAndGetResponseWRP";
command.CommandType = CommandType.StoredProcedure;
//command.Parameters
//.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob;
command.Parameters.Add(new OracleParameter("iSourceSystem", OracleType.VarChar))
       .Value = "XXX";

command.Parameters.Add(new OracleParameter("iMessage", OracleType.Clob))
       .Value = tempLob;


command.Parameters.Add(new OracleParameter("iResponseMessage", OracleType.Clob)).Direction = ParameterDirection.Output;
command.Parameters.Add(new OracleParameter("retVar ", OracleType.Int32)).Direction = ParameterDirection.Output;

command.ExecuteNonQuery();
transaction.Commit();
4

5 に答える 5

1

ちょうど試して

command.CommandText = 
      @"declare xx clob; 
      begin dbms_lob.createtemporary(xx, false, 0); 
      tempclob := xx; end;";

に置き換え:tempclobますtempclob

于 2010-08-16T12:34:36.463 に答える
1

追加してみてください:

command.BindByName = true;

パラメータを呼び出した後。

于 2013-08-12T10:05:49.580 に答える
0

ExecuteNonQuery() への 2 つの呼び出しのうち、エラーを生成しているのはどれですか? まさか二代目だとは。

私は C# を使用していませんが、オンラインで見つけたいくつかの例から、StoredProcedure コマンド タイプを使用しているときは、実際の OracleParameter オブジェクトを作成したくないようです。代わりに、次のようにパラメーターを初期化します。

command.Parameters.Add("iSourceSystem", OracleType.VarChar).Value = "XXX";
于 2010-08-16T13:02:03.707 に答える
0

Microsoft Oracle クライアントを使用しているようです。

ODP.Net for 4.0 で Oracle 11 クライアントを使用してみてください。これにより、clob を処理するときに最良の結果が得られます。

于 2013-02-07T21:56:06.490 に答える
0

匿名の pl/sql ブロッ​​クへの変数のバインドはサポートされていません。プロシージャーを使用して、代わりにすべてのパラメーターを定義してください。

command.CommandText = "dbms_lob.createtemporary"
于 2015-10-20T18:59:15.577 に答える