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/