我正在尝试在Oracle SQL Developer
客户端中创建一个新过程。此过程将根据一个条件获取单行。
我的程序代码如下: -
create or replace PROCEDURE GETUSERKEYS
(
USERNAME IN NVARCHAR2
, STATUS OUT NUMBER
, TEMPTB OUT ClientKey%rowtype
) AS
BEGIN
SELECT * INTO TEMPTB FROM ClientKey WHERE ClientKey.USERNAME=USERNAME;
STATUS:=1;
END GETUSERKEYS;
这是我的C#代码:
using (OracleConnection connection = new OracleConnection(ConnectionString))
{
using (OracleCommand cmd = new OracleCommand("GetUserKeys", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter username = new OracleParameter();
username.OracleDbType = OracleDbType.NVarchar2;
username.ParameterName = "Username";
username.Direction = ParameterDirection.Input;
username.Value = Username;
cmd.Parameters.Add(username);
OracleParameter status = new OracleParameter();
status.OracleDbType = OracleDbType.Int32;
status.ParameterName = "Status";
status.Direction = ParameterDirection.Output;
cmd.Parameters.Add(status);
if (connection.State == ConnectionState.Open)
connection.Close();
connection.Open();
cmd.ExecuteNonQuery();
DataSet dataset = new DataSet();
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(dataset);
_id = (int)cmd.Parameters["Status"].Value;
if (_id > 0)
{
if (dataset.Tables[0] != null && dataset.Tables[0].Rows.Count != 0)
{
_key = new ClientKey();
_key.ClientId = dataset.Tables[0].Rows[0]["ClientId"].ToString();
_key.ClientSecret = dataset.Tables[0].Rows[0]["ClientSecret"].ToString();
_key.ClientKeyId = int.Parse(dataset.Tables[0].Rows[0]["ClientKeyID"].ToString());
_key.Username = dataset.Tables[0].Rows[0]["Username"].ToString();
_key.CreateOn = Convert.ToDateTime(dataset.Tables[0].Rows[0]["CreateOn"].ToString());
}
}
}
}
我无法找到根据条件从表中返回行的方法。 我是Oracle的新手。
答案 0 :(得分:1)
问题是Oracle's C# client does not support %ROWTYPE
,因此您需要使用变通方法。
最简单的解决方案是使用SYS_REFCURSOR,它映射到ODBC ResultSet
。一条记录仍然是一套。您可能不希望建立Oracle用户定义类型。
此Oracle tutorial提供了将SYS_REFCURSOR与ODP.Net一起使用的起点。