odp.net和Oracle 11g存储过程与RAW(guid)密钥

时间:2014-06-03 20:32:10

标签: oracle parameters guid odp.net ora-06550

我正在尝试将现有的SQL Server数据库和vb.net应用程序转换为使用Oracle和odp.net,我是一个完整的Oracle新手,但在SQL Server方面经验丰富,所以我遇到了一些问题我认为我已经解决了如下:

1)现有数据使用GUID作为大多数表的主键(因为数据正在未连接的数据库中同步)。我的第一个问题是看似oracle不直接支持GUID。我研究并得到了一个使用RAW(16)的解决方案,所以我的表是用RAW(16)创建的,其中原始使用的GUID

2)接下来有很多BIT值,oracle似乎没有直接支持BIT,我看到很多关于使用什么的争论,例如CHAR(1)或NUMBER(1,0)。最后我选择了NUMBER(1,0)

3)第三,现有数据库广泛使用存储过程以及参数化视图(SELECT语句)的数量,我似乎发现Oracle并没有真正以同样的方式做任何事情。从网上四处看看,似乎大多数人建议在存储过程中使用RefCursor作为输出参数。这是我最终得到的一个简单表的查询,它具有RAW(16)主要“ClockingID”,RAW(16)外键“UserID”,日期“Clocking”和数字(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

有很多我不知道的事情很难弄清楚我认为我解决的上述哪一个问题实际上是导致了我的问题。我非常感谢您的专家意见。非常感谢。

2 个答案:

答案 0 :(得分:0)

REF光标上的参数方向应为OUT。 ReturnValue用于函数。

答案 1 :(得分:0)

尝试使用函数hextoraw,例如

INSERT INTO TABLE(ID,FIELD_RAW) VALUES(hextoraw(1,'367C37E05E26DE4FB625B3663B0CAA15'));