Oracle Odp.Net (Oracle 9 への接続) を使用すると、奇妙なエラーが発生します。この問題は、以下のコード スニペットで示されています。
これは私たちが経験しているエラーです:
ORA-00600: 内部エラー コード、引数: [15419]、[PL/SQL 実行中の重大なエラー]、[]、[]、[]、[]、[]、[]
ORA-06544: PL/SQL: 内部エラー、引数: [78502]、[]、[]、[]、[]、[]、[]、[]
ORA-06553: PLS-801: 内部エラー [78502]
グーグルで調べてみると、タイムスタンプの配列を渡すことは Odp.Net でサポートされていないのではないかと疑われます (完全にはわかりませんが)。
したがって、質問は 2 倍です。
- odp.net を使用してタイムスタンプの配列を pl/sql プロシージャに渡すことは可能ですか?
- そうでない場合、利用可能な適切な回避策はありますか?
問題を示す C# コンソール プログラム:
using System;
using System.Collections;
using System.Data;
using Oracle.DataAccess.Client;
class Program
{
private const string _db = "<db>";
private const string _username = "<user>";
private const string _password = "<password>";
private const string _storedProcedureName = "<sproc>";
static void Main(string[] args)
{
var connectionString = string.Format(
"data source={0};user id={1};password={2}",
_db, _username, _password);
var connection = new OracleConnection(connectionString);
try
{
connection.Open();
var timeStamps = new[] { DateTime.Now, DateTime.Now };
var parameter = new OracleParameter("inTimeStamps", OracleDbType.TimeStamp)
{
Direction = ParameterDirection.Input,
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Size = timeStamps.Length,
Value = timeStamps
};
var command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = _storedProcedureName;
command.Parameters.Add(parameter);
command.ExecuteReader();
}
finally
{
connection.Close();
}
}
}
コードは、次の PL/SQL ストアド プロシージャを呼び出しています。
TYPE ArrayOfTimestamps is table of timestamp index by binary_integer;
PROCEDURE TestOdpTimeStamp (inTimeStamps in ArrayOfTimestamps)
IS
test number;
BEGIN
select 1 into test from dual;
END;