我使用“.net+Oracle存储过程”编写web程序,添加删除修改都可以了,唯有读取列表记录报错,麻烦大师看一下,点拨指导啊!十分感谢!Oracle存储过程:
CREATE OR REPLACE PROCEDURE "ADMIN"."SYSTEMCODE_GETLIST" (
CodeLb_in varchar2
)
is
cursor cur is
select *
From SystemCode
WHERE CodeLb =nvl( CodeLb_in,CodeLb)
order by codelb;
begin
for rec in cur loop
null;
end loop;
end SystemCode_GetList;c#代码:
//得到列表
public DataSet GetList(string CodeLb)
{
System.Data.Common.DbCommand sqlCommand = db.GetStoredProcCommand("SystemCode_GetList"); db.AddInParameter(sqlCommand, "CodeLb_in", DbType.String, CodeLb);
return db.ExecuteDataSet(sqlCommand);
}
CREATE OR REPLACE PROCEDURE "ADMIN"."SYSTEMCODE_GETLIST" (
CodeLb_in varchar2
)
is
cursor cur is
select *
From SystemCode
WHERE CodeLb =nvl( CodeLb_in,CodeLb)
order by codelb;
begin
for rec in cur loop
null;
end loop;
end SystemCode_GetList;c#代码:
//得到列表
public DataSet GetList(string CodeLb)
{
System.Data.Common.DbCommand sqlCommand = db.GetStoredProcCommand("SystemCode_GetList"); db.AddInParameter(sqlCommand, "CodeLb_in", DbType.String, CodeLb);
return db.ExecuteDataSet(sqlCommand);
}
应用程序中的服务器错误。--------------------------------------------------------------------------------ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'SYSTEMCODE_GETLIST' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OracleClient.OracleException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'SYSTEMCODE_GETLIST' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
CREATE OR REPLACE PROCEDURE SYSTEMCODE_GETLIST (
CodeLb_in varchar2
)
is
cursor cur is
select *
From SystemCode
WHERE CodeLb =nvl( CodeLb_in,CodeLb)
order by codelb;
begin
for rec in cur loop
null;
end loop;
end SystemCode_GetList;
/
[注意:]1:返回记录集合必须在把过程放在一个包里面,包先定义一个游标,然后让过程返回.
2:包分为包头和包体,包头相当于声明,游标和过程都要先在包头声明.
过程还要在包体中实现.例子一:CREATE OR REPLACE PACKAGE p_test
AS
TYPE myrctype IS REF CURSOR;
PROCEDURE a ( p_c OUT myrctype);
END p_test;
/CREATE OR REPLACE PACKAGE BODY p_test
AS
PROCEDURE a ( p_c OUT myrctype)
IS
BEGIN
OPEN p_c FOR select COL1,COL2 from TABLE_NAME;
END A;
END p_test;
/
OracleCommand cmd=new OracleCommand("pk_wt.p_wt",orcn);
cmd.CommandType=CommandType.StoredProcedure;
OracleParameter p1=new OracleParameter("mycs",OracleType.Cursor);
p1.Direction=System.Data.ParameterDirection.Output;
cmd.Parameters.Add(p1);
OracleDataAdapter da=new OracleDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds,"test");
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
如果是的话,你需要写一个使用游标返回结果集的过程,需要在包里写,在包头里定义一个结果集.
SQL语句这样写
包头
CREATE OR REPLACE PACKAGE "PKG_AA" is
TYPE MYRCTYPE IS REF CURSOR;
end PKG_AA;
包体CREATE OR REPLACE PACKAGE BODY "PKG_AA" isPROCEDURE P_GET_SystemCode(
O_C_SystemCode OUT CURSOR --返回游标
)AS
V_SQL VARCHAR2(2000);
BEGIN
V_SQL:='select *
From SystemCode
WHERE 1=2 ';--我不建议在SQL语句中写*,最好还是把要用到的字段名写进去,这样便于别人维护程序
OPEN O_C_SystemCode FOR V_SQL;
END P_GET_SystemCode;
end PKG_AA;
然后在前端调用就可以得到表的结构.
OracleCommand cmd=new OracleCommand("pk_wt.p_wt",orcn);
cmd.CommandType=CommandType.StoredProcedure;
OracleParameter p1=new OracleParameter("mycs",OracleType.Cursor);
p1.Direction=System.Data.ParameterDirection.Output;
cmd.Parameters.Add(p1);
OracleDataAdapter da=new OracleDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds,"test");
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
LZ是不是要返回HTML代码,在循环中用NULL隐去处理过程,可惜,这么简单的功能居然浪费CURSOR,我觉得大系统才会用到一、二个CURSOR,有很新的PL/SQL可以绕过CURSOR,提高PLSQL效率。
包括你想形成HTML,可以试试XSU,或者其他XML的处理。
用结果集返回,可能不是好的方法。再说你定义的是VARCHAR2,字符数多了65536,就会错。
哦,谢谢你,主要是我刚学,还没有深入理解,
至于那个null我也不明白怎么回事,是别人给我一个循环,我编译不通,就把中间的东西换为null才可以编译了