如何调用返回 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 行的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
sqlalchemy 调用 mssql存储过程如何获取返回值?