问题描述
分页存储过程(PLSQL中已调试正确):CREATEORREPLACEPROCEDUREpager_proc(v_pageSizeINNUMBER,--每页记录数量v_pageNumOUTNUMBER,--总页面数v_pageIDINoutNUMBER,--当前页索引v_tblNameINNVARCHAR2,--表名v_strWhereinNVARCHAR2,--查询条件v_feildinNVARCHAR2,--查询字段v_OutCursorOUTsys_refcursor,--返回数据集合v_sizeinoutnumber--查询到记录个数)ASv_sqlVARCHAR2(1000);--暂存中间SQL语句v_pageBeginNUMBER;--分页其实记录v_pageEndNUMBER;--分页终止记录BEGINv_sql:='SELECTCOUNT(1)FROM'||v_tblName;ifv_strWhereisnotnullorv_strWhere<>''thenv_sql:=v_sql||'where'||v_strWhere;endif;EXECUTEIMMEDIATEv_sqlINTOv_size;--取得记录总数,便于进行分页计算;IFv_size!=0THENv_pageNum:=CEIL(v_size/v_pageSize);ifv_pageID<1then--判断索引是否小于1;--******v_pageID:=1;endif;ifv_pageID>v_pageNumthen--判断索引是否大于总页面数;v_pageID:=v_pageNum;endif;--获取需要在记录中截取的记录起始位置v_pageBegin:=(v_pageID-1)*v_pageSize+1;v_pageEnd:=v_pageID*v_pageSize;--构造SQL语句v_sql:='select*from(selectA.*,rownumrfrom'||'(select'||v_feild||'from'||v_tblName;ifv_strWhereisnotnullorv_strWhere<>''then--******v_sql:=v_sql||'where'||v_strWhere;endif;v_sql:=v_sql||')Awhererownum<='||v_pageBegin||')Bwherer>='||v_pageEnd;--这种方式构造不好的地方就是如果之间的ID被删除过的话,会造成between不准确。--v_sql:='SELECT*FROM'||v_tblName||'WHEREidBETWEEN'||v_pageBegin||'AND'||v_pageEnd;OPENv_OutCursorFORv_sql;ENDIF;ENDpager_proc;数据访问层调用函数:///<summary>///通用查询分页///</summary>///<paramname="curPage">当前页索引</param>///<paramname="pageSize">每页显示记录数</param>///<paramname="strSql">查询条件(不用where,直接写)</param>///<paramname="tableName">使用的表名</param>///<returns>返回pagerNode节点</returns>publicList<pagerNode>createDataSet(intcurPage,intpageSize,stringstrSql,stringtableName,stringfeild){//创建一个泛型节点List<pagerNode>myPageList=newList<pagerNode>();OracleConnectionconn=DB.createConnection();conn.Open();OracleParameter[]storedParams=newOracleParameter[8];storedParams[0]=newOracleParameter("tblName",OracleType.NVarChar);//表名storedParams[0].Value=tableName;storedParams[1]=newOracleParameter("v_strWhere",OracleType.NVarChar);//查询条件storedParams[1].Value=strSql;storedParams[2]=newOracleParameter("v_pageID",OracleType.Number);//当前页索引storedParams[2].Direction=ParameterDirection.InputOutput;storedParams[3]=newOracleParameter("v_pageSize",OracleType.Number);//每页显示记录数storedParams[3].Value=pageSize;storedParams[4]=newOracleParameter("v_feild",OracleType.NVarChar);//查询的列storedParams[4].Value=feild;storedParams[5]=newOracleParameter("v_size",OracleType.Number);//查询到总数outstoredParams[5].Direction=ParameterDirection.InputOutput;storedParams[6]=newOracleParameter("v_pageNum",OracleType.Number);//页面总数outstoredParams[6].Direction=ParameterDirection.Output;storedParams[7]=newOracleParameter("v_OutCursor",OracleType.Cursor);//返回记录集outstoredParams[7].Direction=ParameterDirection.Output;pagerNodemyNode=newpagerNode();//创建一个数据节点;//总记录数DataSetds=OracleHelper.ExecuteDataset(conn,CommandType.StoredProcedure,"pager_proc",storedParams);myNode.DsList=ds.Tables[0];myNode.TotalRecord=Convert.ToInt32(storedParams[5].Value);myNode.TotalPage=Convert.ToInt32(storedParams[6].Value);myPageList.Add(myNode);//向链表中加入一个pagerNode节点;conn.Close();returnmyPageList;}提示错误:ORA-06550:第1行,第7列:PLS-00306:调用'PAGER_PROC'时参数个数或类型错误ORA-06550:第1行,第7列:PL/SQL:Statementignored说明:执行当前Web请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息:System.Data.OracleClient.OracleException:ORA-06550:第1行,第7列:PLS-00306:调用'PAGER_PROC'时参数个数或类型错误ORA-06550:第1行,第7列:PL/SQL:Statementignored说明:本人从mssql转用oracle,有的地方真的不怎么一样,请大家帮帮忙,帮我解决一下,谢谢!
解决方案
解决方案二:
#region分页代码(返回数据表、总条数、总页数等)///<summary>///执行分页///</summary>///<paramname="tableName">需分页表名(select查询语句)</param>///<paramname="paeSize">每页记录数</param>///<paramname="indexNowPage">当前页码</param>///<paramname="totalRows">引用参数,总记录数</param>///<paramname="totalPages">引用参数,总页数</param>///<returns>分页结果集</returns>publicDataTablePaging(stringtableName,intpaeSize,intindexNowPage,refinttotalRows,refinttotalPages){try{//打开连接OpenOracleConnection();//定义OracleCommand对象,设置命令类型为存储过程OracleCommandpOracleCMD=newOracleCommand("pkg_split_page.proc_split_page",conn);//Oracle里面的(包——存储过程)pOracleCMD.CommandType=CommandType.StoredProcedure;//设置执行类型为存储过程//根据存储过程的参数个数及类型生成参数对象OracleParameterp1=newOracleParameter("rowCountPerPage",OracleType.Number);//rowcountPerPage——每页显示的条数OracleParameterp2=newOracleParameter("indexNowPage",OracleType.Number);//indexNowPage——当前页码OracleParameterp3=newOracleParameter("tabName",OracleType.VarChar);//tabName——表名OracleParameterp4=newOracleParameter("totalRows",OracleType.Number);//totalRows——总记录数(output)OracleParameterp5=newOracleParameter("totalPages",OracleType.Int16);//totalPages——总页数(output)OracleParameterp6=newOracleParameter("p_cursor",OracleType.Cursor);//设置参数的输入输出类型,默认为输入p1.Direction=ParameterDirection.Input;p2.Direction=ParameterDirection.Input;p3.Direction=ParameterDirection.Input;p4.Direction=ParameterDirection.Output;p5.Direction=ParameterDirection.Output;p6.Direction=ParameterDirection.Output;//对输入参数定义初值,输出参数不必赋值.p1.Value=paeSize;p2.Value=indexNowPage;p3.Value=tableName;//按照存储过程参数顺序把参数依次加入到OracleCommand对象参数集合中pOracleCMD.Parameters.Add(p1);pOracleCMD.Parameters.Add(p2);pOracleCMD.Parameters.Add(p3);pOracleCMD.Parameters.Add(p4);pOracleCMD.Parameters.Add(p5);pOracleCMD.Parameters.Add(p6);//执行,把分页结果集填入datatable中OracleDataAdapterpOracleDataAdapter=newOracleDataAdapter(pOracleCMD);DataTabledatatable=newDataTable();pOracleDataAdapter.Fill(datatable);//在执行结束后,从存储过程输出参数中取得相应的值放入引用参数中以供程序调用totalRows=int.Parse(p4.Value.ToString());totalPages=int.Parse(p5.Value.ToString());//关闭连接CloseOracleConnection();returndatatable;}catch(Exceptionex){stringerror=ex.ToString();returnnull;}}#endregion#region打开连接///<summary>///关闭连接///</summary>privatevoidCloseOracleConnection(){if(conn.State==ConnectionState.Open){conn.Close();}}#endregion#region关闭连接///<summary>///打开连接///</summary>privatevoidOpenOracleConnection(){if(conn.State==ConnectionState.Closed){conn.Open();}}#endregion//方法的调用DataTabletd=Paging(condiStr,5,currentPage,refrowsCount,refpageCount);//返回请求列表、总页数、总条数
解决方案三:
上面的代码是我前不久写的,oracle是网上找的那种所谓的支持百万级数据可量的,不过存储过程不是关键,关键是怎么调用的,你看看上面的代码应该明白怎么回事!!!代码中的注释很清楚的,仔细看看!!!
解决方案四:
解决方案五:
oracle不太熟悉,但帮LZ顶一下啊
解决方案六:
分页控件就行了