C#调用oracle存储函数

标签 c# oracle stored-functions

create or replace function ar_knyga_egzistuoja(
id number
)
return number
is
kiekis number;
begin
select count(*) into kiekis from knygos where kn_id  = id;
return kiekis;
end;

C#代码:

conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "ar_knyga_egzistuoja";

cmd.CommandType = CommandType.StoredProcedure;
OdbcParameter param = new OdbcParameter();

cmd.Parameters.Add("id", OracleType.Number).Value = id;

cmd.ExecuteNonQuery();
var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value);

MessageBox.Show(kiekis);

cmd.Parameters.RemoveAt(0);

conn.Close();

我收到错误:

PLS-00221: 'AR_KNYGA_EGZISTUOJA' is not a procedure or is undefined
ORA-06550: line 1, column 7:

这不是过程而是函数,但我知道我可以像过程一样调用函数,有什么问题吗?

最佳答案

你得到的ORA-06550代码意味着函数was compiled with invalid statements并且需要重写。我没有发现代码有任何明显的错误,因此您可能遇到诸如权限或不正确的表名之类的问题,应该首先检查您是否可以在 PL/SQL 编辑器中运行该函数。然后,在你开始运行之后,尝试...

var cmd = new OracleCommand();

cmd.Connection = conn;
cmd.CommandText = "ar_knyga_egzistuoja";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("id", id);
cmd.Parameters.Add("kiekis", OracleType.Number);
cmd.Parmeters["kiekis"].Direction = ParameterDirection.ReturnValue;

cmd.Connection.Open();
cmd.ExecuteNonQuery();

var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value);

MessageBox.Show(kiekis);
cmd.Connection.Close();

这应该能够像存储过程一样运行该函数,同时期望一个名为 kiekis 且类型为 number 的返回值可用于工作。

关于C#调用oracle存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23199713/

相关文章:

mysql - 如何使用 ALTER 语句与 GENERATE ALWAYS INSIDE mysql 函数?

c# - 在 WPF 中设置样式 TargetType

c# - 通过在任何类之外声明的反射访问委托(delegate)?

oracle - 我的 PL/SQL 过程有什么问题?

oracle - 作为 18C 升级的一部分,OWA_UTIL.who_ Called_me 中进行了哪些更改?

linux - linux 上 oracle 的远程客户端

c# - CLR 字符串引用不(总是)匹配

c# - 使用部分类是一种好的做法/设计吗?

sql - MySql从存储过程中调用存储函数导致错误

mysql - 需要帮助使用在两个单独表的列之间进行算术运算的函数将列添加到一个表