由于我是新手,我在oracle DB中执行存储过程时遇到了一些问题。这是SP,它将记录作为输出参数,类型为%rowtype,l_serno为输入参数,类型为Number。
Create OR Replace procedure get_product(l_serno in product.serno%type,record out product%rowtype)
is
begin
select * into record from product where serno=l_serno;
end get_product;
使用C#,我试图从SP获取数据并在gridview上显示它。
OracleCommand cmd = new OracleCommand("get_product", Conn);
cmd.CommandType = CommandType.StoredProcedure;
Conn.Open();
OracleParameter input = cmd.Parameters.Add("V_SERNO", OracleType.Number);
OracleParameter output = cmd.Parameters.Add("ITEMS_CURSOR", OracleType.Cursor);
input.Direction = ParameterDirection.Input;
output.Direction = ParameterDirection.ReturnValue;
input.Value = 2;
OracleDataReader rd = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(rd);
GridView1.DataSource = dt;
GridView1.DataBind();
Conn.Close();
这里我收到错误
ORA-06550:第1行,第24栏:
PLS-00306:调用'GET_PRODUCT'时参数的数量或类型错误
ORA-06550:第1行,第7栏:
请让我知道我在这里做错了什么。 提前致谢。
答案 0 :(得分:1)
您的程序有此签名:
(l_serno in product.serno%type,record out product%rowtype)
但是在你的C#代码中你指定了这个:
OracleParameter output = cmd.Parameters.Add("ITEMS_CURSOR", OracleType.Cursor);
游标是指向结果集的指针,与变量不同。您可以更改C#代码:定义其属性与PRODUCT表的投影匹配的类。或者,更改存储过程以使用引用游标。
第二种方法可能不那么重要(尤其是因为你可以让我们为你做这件事)
create or replace procedure get_product
(l_serno in product.serno%type,
record out sys_refcursor)
is
begin
open record for
select * from product
where serno=l_serno;
end get_product;