C# 从plsql选择过程中检索值

C# 从plsql选择过程中检索值,c#,sql,oracle,plsql,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; 然而,不知何故,这引发了: A first chance exception of type 'Oracle.DataAcces

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

select *  from (
 select rfid 
 from rfid_col 
 where rfid not in (select rfid from person)
 )where rownum<=1;
然而,不知何故,这引发了:

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个字符。并确保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:
使用
将帮助您关闭和处理命令和连接。

rfid的类型是什么?根据sql开发者varchar2(10字节),我们可以看到这两个表的定义吗?我甚至没有将其插入第二个表中,但首先我必须将其检索到我的程序中创建表rfid\u col(rfid varchar(10)主键不为空);我知道这是不允许的,但是先生,你真是太棒了,设定了一个固定的尺寸。错误。享受这个固定,新年快乐:o)
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
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;
    }
}