--新建测试存储过程
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的存储过程。

解决方案 »

  1.   

                parameters[0].Value = “”;
                parameters[1].Value = “”;
      

  2.   


    //最好是先定义两个空字符串:
    string str1=String.Empty;
    string str2=String.Empty;
    //然后将其赋值给过程参数:
    parameters[0].Value = str1;
     parameters[1].Value = str2;
    //这样做有一个好处,Empty到使用的时候才分配空间
      

  3.   

    一个是int一个是datetime的类型,不能为string.empty
      

  4.   


    //那你直接给其赋空值得了:
    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