从 plsql 选择过程中检索值

Posted

技术标签:

【中文标题】从 plsql 选择过程中检索值【英文标题】:retrieving a value from a plsql select procedure 【发布时间】:2013-12-23 15:50:29 【问题描述】:

从包含 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 中运行良好

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

 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

我已经为这个问题苦苦挣扎了很长一段时间,这是我最后的解决方案

【问题讨论】:

rfid的类型是什么? 根据sql developer varchar2(10byte) 我们可以看到这两个表的定义吗? 我什至没有将它插入到第二个表中,但首先我必须将它检索到我的程序中 创建表 RFID_col (RFID varchar(10) PRIMARY KEY NOT NULL); 【参考方案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会帮你关闭和处理命令和连接。

【讨论】:

我知道这实际上是不允许的,但是先生,您太棒了,设置尺寸修复了错误 享受修复和新年快乐 :o)

以上是关于从 plsql 选择过程中检索值的主要内容,如果未能解决你的问题,请参考以下文章

plsqldeveloper如何检索sql语句在哪些存储过程

在 Oracle 内存缓存中长时间存储 PLSQL 存储过程值

sql如何批量进行执行存储过程并传参数?

plsql查询中'%%'是模糊查询吗?为啥查不出来呢?

我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来

使用 Native SQL Hibernate 从存储过程中检索值