如何调用返回 1 行的存储过程?

Posted

技术标签:

【中文标题】如何调用返回 1 行的存储过程?【英文标题】:How to call stored procedure that returns 1 row? 【发布时间】:2021-08-29 04:01:23 【问题描述】:

如何在 C# 中调用一个过程只返回 1 行?

当我运行我编写的这段代码时,我得到了这个错误:

ORA-06502 :PL/SQL: 数值或数值错误

代码:

con.Open();

OracleCommand comm = new OracleCommand();
comm.Connection = con;
comm.CommandText = "GetFirstName";
comm.CommandType = CommandType.StoredProcedure;

comm.Parameters.Add("ssnid", global.passuser);
comm.Parameters.Add("fname", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

comm.ExecuteNonQuery();

textBox2.Text = comm.Parameters["fname"].ToString();

程序:

create or replace procedure  GetFirstName
(ssnid in VARCHAR2 ,  fname out VARCHAR2)
as
begin
select firstname
into fname
from passenger
where ssn = ssnid ;
end;

【问题讨论】:

您遇到了 oracle 错误。通常这是由于 oracle 驱动程序不适用于您正在使用的 oracle 版本。您在连接字符串中使用什么驱动程序?您使用的数据库是什么版本的 Oracle?查看 oracle 数据库日志文件了解更多信息。 顺便说一句,你应该用using块来处理你所有的SQL对象,不要缓存连接,当你需要时从连接字符串中创建它 【参考方案1】:

尝试使用这种语法

cmd.Parameters.Add("ssnid",OracleDbType.Varchar2).Value = global.passuser;
 // or global.passuser.ToString();

顺便解决一下这个问题

textBox2.Text = comm.Parameters["fname"].Value.ToString();

【讨论】:

【参考方案2】:

程序

CREATE OR REPLACE PROCEDURE GETFIRSTNAME(ssnid VARCHAR2 ,  fname OUT VARCHAR2)

AS  
BEGIN

   SELECT 
   firstname INTO  fname
   FROM (SELECT 1 as ssn,'IM TOM CHANNEL' as firstname FROM dual)
   WHERE ssn = ssnid;

END GETFIRSTNAME;
```SQL

C# code is :

```C#
public void GETFIRSTNAME(string ssnid)
        

            try
            
                string vfname = "";
                ConnDB();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = con;
                cmd.CommandText = "GETFIRSTNAME";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("ssnid", OracleType.VarChar).Value = ssnid;
                cmd.Parameters.Add("fname", OracleType.VarChar,200).Direction = ParameterDirection.Output;
                cmd.ExecuteNonQuery();
                vfname = cmd.Parameters["fname"].Value.ToString();
               
            
            finally
            
                con.Dispose();
                con.Close();
            


        

【讨论】:

以上是关于如何调用返回 1 行的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值

Oracle如何创建存储过程和如何调用存储过程

mysql存储过程出现锁表锁行的情况怎么解决

sqlalchemy 调用 mssql存储过程如何获取返回值?

我可以在 jdbc 中调用一个使用 mysql 返回表的存储过程吗?

C# 如何调用此存储过程