我使用“.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);
        }

解决方案 »

  1.   

    补充报错内容:
    应用程序中的服务器错误。--------------------------------------------------------------------------------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
      

  2.   

    --在plsql里面执行没有报错啊:
    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;
    /
      

  3.   

    不错才怪!!!你这个是需要oracle返回记录集然后,由doNET来获取到Dataset要这样:>PL/Sql中返回记录集合
    [注意:]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;
    /
      

  4.   

    C#调用ORACLE返回结果集: 
    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(); 
      

  5.   

    是不是只要表结构,不要结果阿?
    如果是的话,你需要写一个使用游标返回结果集的过程,需要在包里写,在包头里定义一个结果集.
    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;
    然后在前端调用就可以得到表的结构.
      

  6.   

    C#调用ORACLE返回结果集: 
    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(); 
      

  7.   

    沙子是正解,但是LZ可能还是没有理解。
    LZ是不是要返回HTML代码,在循环中用NULL隐去处理过程,可惜,这么简单的功能居然浪费CURSOR,我觉得大系统才会用到一、二个CURSOR,有很新的PL/SQL可以绕过CURSOR,提高PLSQL效率。
    包括你想形成HTML,可以试试XSU,或者其他XML的处理。
    用结果集返回,可能不是好的方法。再说你定义的是VARCHAR2,字符数多了65536,就会错。
      

  8.   


    哦,谢谢你,主要是我刚学,还没有深入理解,
    至于那个null我也不明白怎么回事,是别人给我一个循环,我编译不通,就把中间的东西换为null才可以编译了