我在ASP.NET应用程序中遇到此错误(而在Oracle中可以正常工作)
PLS-00703 ::列表中的多个命名参数实例
我在这里附上了代码。它在最后一行显示错误,即 cmd.ExecuteNonQuery()
cmd.Parameters.AddWithValue("in_prog_id", 2);
cmd.Parameters.AddWithValue("in_sllr_co_id", 1);
cmd.Parameters.AddWithValue("in_sllr_purch_loc_nbr", 1);
cmd.Parameters.AddWithValue("in_byr_co_id", Convert.ToInt32(co_id));
cmd.Parameters.AddWithValue("in_byr_purch_loc_nbr", purch_loc_nbr);
cmd.Parameters.AddWithValue("in_ing_id", ing_id);
cmd.Parameters.AddWithValue("in_per_id", per_id);
cmd.Parameters.AddWithValue("in_ing_purch_qty", "12");
cmd.Parameters.AddWithValue("in_pop_sl_trck_nbr", "ECAP");
cmd.Parameters.AddWithValue("in_pop_sl_cmnt_txt", dstemp.Tables["ECAP"].Rows[i][6].ToString());
cmd.Parameters.AddWithValue("in_chg_by", 1333);
cmd.Parameters.AddWithValue("in_ing_rev_amt", dstemp.Tables["ECAP"].Rows[i][5].ToString());
cmd.Parameters.AddWithValue("in_sl_typ", "ME");
cmd.Parameters.AddWithValue("in_dir_sale_ind", "DIR-SL");
cmd.Parameters.AddWithValue("in_intg_sl_ind", "N"); ***//character as input***
cmd.ExecuteNonQuery();
这是我的方法,其中包含上述陈述。
private void call_proc(int i, DataSet dstemp, OracleCommand cmd)
{
}
我按如下方式调用此方法:
cmd1 = conn3.CreateCommand();
cmd1.CommandText = "pkg_sale.cre_pop_sl";
cmd1.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < ds.Tables["ECAP"].Rows.Count; ++i)
call_proc(i, ds, cmd1);
这有什么问题吗?
答案 0 :(得分:1)
您是否正在重用cmd
中的实例来处理多个SQL语句?
你在这里发布的内容没有重复,所以我怀疑这个代码是否导致问题。
答案 1 :(得分:1)
这似乎是Oracle存储过程的常见错误,最常见的原因是开发人员在重复调用代码之前忽略了调用Parameters.Clear
。
或者,或者你的一个或多个参数在其他地方重复。
编辑(OP发布后)
这似乎是第一种可能性,因为您在循环中调用该函数。只需清除循环函数中的参数即可。
答案 2 :(得分:0)
我遇到了另一种情况,如果您使用ODP.Net,可能会发生这种情况。如果您使用任何实用程序类来生成命令(就像我在我的项目中那样),它可能会做一些“聪明”的操作。在场景后面工作以从存储过程中导出参数。
OracleCommandBuilder.DeriveParameters((OracleCommand)command);
此语句将参数注入Command对象,如果将参数添加到同一cmd对象(就像通常那样),它将有2个具有相同名称的参数。