从plsql select过程中检索值

时间:2013-12-23 15:50:30

标签: c# sql oracle plsql

从包含rfid字符串(随机varchar字符串)的表中,我必须选择一个尚未在另一个表中使用的空闲rfid字符串,因为我使用以下sql语句:

select *  from (
 select rfid 
 from rfid_col 
 where rfid not in (select rfid from person)
 )where rownum<=1;

sql本身工作正常,但后来我需要把它放在存储过程

create or replace 
procedure getFreeRfid(rfidout out varchar2) is
begin
select * into rfidout 
from (select rfid from rfid_col where rfid not in (select rfid from person)
)where rownum<=1;
end getFreeRfid;

此代码在oracle sql developer

中运行良好

使用oracle数据在C#中检索它我使用以下代码

 OracleCommand rfidcommand = db.connection.CreateCommand();
 rfidcommand.CommandType = System.Data.CommandType.StoredProcedure;
 rfidcommand.CommandText = "getFreeRfid";
 rfidcommand.Parameters.Add(new OracleParameter("rfidout", OracleDbType.Varchar2)).Direction = System.Data.ParameterDirection.Output;
 rfidcommand.ExecuteNonQuery();
 string rfid = rfidcommand.Parameters["rfidout"].Value.ToString();

但不知怎的,这引发了:

A first chance exception of type 'Oracle.DataAccess.Client.OracleException' occurred in Oracle.DataAccess.dll
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "TIM.GETFREERFID", line 3
ORA-06512: at line 1

我一直在努力解决这个问题很长一段时间,这是我的最后一个解决方案

1 个答案:

答案 0 :(得分:1)

在处理输出参数时,设置字符串的大小非常重要。大小会自动设置输入参数,因为它是已知的。我不知道这是否会解决你的问题,但如果没有在输出上设置大小,你将无法获得价值,而不是完整的价值 - 你可能会获得1个字符。并确保Db中的类型确实是Varchar2

请试试这段代码:

string connStr = ".........";
string result = null;
using (OracleConnection conn = new OracleConnection(connStr))
{
    conn.Open();
    using (OracleCommand comm = new OracleCommand("getFreeRfid", conn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        OracleParameter p = new OracleParameter("rfidout", OracleDbType.Varchar2, ParameterDirection.Output);
        p.Size = 200;
        comm.Parameters.Add(p);
        comm.ExecuteNonQuery();
        result = (string)comm.Parameters[0].Value;
    }
}
祝你好运! PS:using将帮助您关闭并处理命令和连接。