既存の SQL Server データベースと vb.net アプリを変換して Oracle と odp.net を使用しようとしています。私は完全な Oracle 初心者ですが、SQL Server の経験があるため、途中でいくつかの問題に遭遇したと思います。私は次のように解決しました:
1) 既存のデータは、ほとんどのテーブルの主キーとして GUID を使用します (接続されていないデータベース間でデータが同期されているため)。私の最初の問題は、Oracle が GUID を直接サポートしていないように見えることでした。RAW(16) を使用する解決策を調査して得たので、元の GUID が使用されていた場所では、テーブルは RAW(16) で作成されます。
2) 次に、多くの BIT 値があります。やはりオラクルは BIT を直接サポートしていないようです。また、CHAR(1) や NUMBER(1,0) など、何を使用するかについて多くの議論を見てきました。結局、私は NUMBER(1,0) を選びました
3) 第三に、既存のデータベースは、ストアド プロシージャと、パラメータ化されたビュー (SELECT ステートメント) に相当するものを広範囲に使用します。ネットで調べてみると、ほとんどの人が RefCursor をストアド プロシージャの out パラメータとして使用することを提案しているようです。これは、RAW(16)プライマリ「ClockingID」、RAW(16)外部キー「UserID」、日付「Clocking」、およびNumber(1)を持つ単純なテーブルに対するクエリとして終わったものです「削除」:
create or replace procedure Time_Clocking_GetForDateRange(FromDate in date, ToDate in date, ForUserID in Raw ,rc OUT SYS_REFCURSOR) as
begin
OPEN rc FOR
SELECT *
FROM Time_Clocking
WHERE (Time_Clocking.Clocking>=FromDate And Time_Clocking.Clocking<=ToDate) AND Time_Clocking.UserID=ForUserID AND Time_Clocking.Deleted=0
ORDER BY Time_Clocking.Clocking;
END;
私のvbコードは次のとおりです(これはデータベースから情報を取得することをテストするためのものです):
Dim dbCommand As Oracle.ManagedDataAccess.Client.OracleCommand = Nothing
Dim db As Oracle.ManagedDataAccess.Client.OracleConnection = DAL.Utility.GetOracleDB()
db.Open()
Dim cmd As String = "Time_Clocking_GetForDateRange"
dbCommand = New Oracle.ManagedDataAccess.Client.OracleCommand(cmd, db)
dbCommand.CommandType = CommandType.StoredProcedure
dbCommand.BindByName = True
Dim param1 As New Oracle.ManagedDataAccess.Client.OracleParameter
param1.ParameterName = "rc"
param1.OracleDbType = Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor
param1.Direction = ParameterDirection.ReturnValue
dbCommand.Parameters.Add(param1)
dbCommand.Parameters.Add("FromDate", New Date(2014, 6, 1, 0, 0, 0))
dbCommand.Parameters.Add("ToDate", New Date(2014, 6, 1, 23, 59, 59))
dbCommand.Parameters.Add("ForUserID", Oracle.ManagedDataAccess.Client.OracleDbType.Raw, New Guid("367C37E05E26DE4FB625B3663B0CAA15").ToByteArray, ParameterDirection.Input)
Dim dt As New DataTable
dt.Load(dbCommand.ExecuteReader(CommandBehavior.CloseConnection))
アプリが次のようにクラッシュする ExecuteReader ポイントで:
ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'TIME_CLOCKING_GETFORDATERANGE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ここでわからないことがたくさんあり、解決したと思っていた上記の問題のどれが実際に問題を引き起こしているのかを突き止めるのは難しい. 専門家のご意見、大変ありがたく存じます。どうもありがとう。