--新建测试存储过程
create or replace procedure sp_test
(
i_a in number,
i_b in date,
i_c in varchar2,
o_result out number
) as
begin
if i_a is not null then
o_result := 1;
elsif i_b is not null then
o_result := 2;
elsif i_c is not null then
o_result := 3;
end if;
end sp_test;--在plsql可以执行输入参数为null
declare o number(2);
begin
sp_test(null,null,'123',o);
DBMS_OUTPUT.put_line(o);
end;--这时可以输出为3,表明存储过程执行成功了现在我在asp.net下要执行这个存储过程,代码如下: public void Set()
{
OracleParameter[] parameters = {
new OracleParameter("i_a", OracleType.Number),
new OracleParameter("i_b", OracleType.DateTime),
new OracleParameter("i_c", OracleType.VarChar),
new OracleParameter("o_result", OracleType.Number)
};
parameters[0].Value = null;
parameters[1].Value = null;
parameters[2].Value = "123";
parameters[3].Direction = ParameterDirection.Output; int o_result = 0;
DbHelperOra.RunProcedure("sp_test", parameters, out o_result);
}
public static void RunProcedure(string storedProcName, OracleParameter[] parameters, out int returnValue)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();
OracleCommand cmd = new OracleCommand(storedProcName, connection);
cmd.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程 returnValue = Convert.ToInt32(cmd.Parameters["o_result"].Value);
} }运行以后,程序提示错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'SP_TEST' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
请教各位:.net中要怎么样去执行这样子可以让输入参数为null的存储过程。
parameters[1].Value = “”;
//最好是先定义两个空字符串:
string str1=String.Empty;
string str2=String.Empty;
//然后将其赋值给过程参数:
parameters[0].Value = str1;
parameters[1].Value = str2;
//这样做有一个好处,Empty到使用的时候才分配空间
//那你直接给其赋空值得了:
parameters[0].Value = "";
parameters[1].Value = "";
--oracle 过程中这样处理:
create or replace procedure sp_test
(
i_a in number,
i_b in date,
i_c in varchar2,
o_result out number
) as
begin
if nvl(length(i_a),0)<>0 then
o_result := 1;
elsif nvl(length(i_b),0)<>0 then
o_result := 2;
elsif nvl(length(i_c),0)<>0 then
o_result := 3;
else
null;
end if;
exception
when others then
dbms_output.put_line(sqlerrm);
end sp_test;
/
SQL> select nvl(length(''),0) from dual;
NVL(LENGTH(''),0)
-----------------
0
SQL> select nvl(length('abc'),0) from dual;
NVL(LENGTH('ABC'),0)
--------------------
3