在PL / SQL中获取单行

时间:2017-11-09 08:17:48

标签: c# oracle

我正在尝试在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的新手。

1 个答案:

答案 0 :(得分:1)

问题是Oracle's C# client does not support %ROWTYPE,因此您需要使用变通方法。

最简单的解决方案是使用SYS_REFCURSOR,它映射到ODBC ResultSet。一条记录仍然是一套。您可能不希望建立Oracle用户定义类型。

Oracle tutorial提供了将SYS_REFCURSOR与ODP.Net一起使用的起点。