C#调用oracle存储函数

Wiz*_*ard 5 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;
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

我收到错误:

PLS-00221: 'AR_KNYGA_EGZISTUOJA' is not a procedure or is undefined
ORA-06550: line 1, column 7:
Run Code Online (Sandbox Code Playgroud)

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

gfi*_*000 10

ORA-06550您获得的代码意味着该函数是使用无效语句编译的,需要重新编写.我没有看到任何明显错误的代码,因此您可能遇到权限或不正确的表名等问题,并应检查您是否可以首先在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();
Run Code Online (Sandbox Code Playgroud)

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