zoukankan      html  css  js  c++  java
  • Oracle 分页查询存储过程

    以前都是sql数据库 分页存储过程很多也很简单 后来接触Oracle 忒伤了 好多不同的关键字 不同的代码编写方式及定义等

    也曾上网查了好多Oracle数据库分页存储过程 由于接触时间较短所以 几乎看不明白 今天自己终于弄明白了 

    CREATE OR REPLACE  PACKAGE DotNet  is
      TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集
      PROCEDURE DotNetPagination
      (
      Pindex in number,                --分页索引
      Pname in varchar2,          --要查找的表名 如需连表查询则创建连表查询视图 此处可写视图名称 也可以是查询出一张虚拟表的sql语句
      Psql in varchar2,                --要查找数据的条件 and开头
      Psize in number,                 --页面大小 每页要显示的数据量
      Pcount out number,               --返回数据总数
      v_cur out type_cur               --返回当前页数据记录
      );
      end DotNet;
    CREATE OR REPLACE  PACKAGE BODY DotNet  is
      PROCEDURE DotNetPagination
      (
      Pindex in number,                --分页索引
      Pname in varchar2,          --要查找的表名 如需连表查询则创建连表查询视图 也可以是查询出一张虚拟表的sql语句
      Psql in varchar2,                --要查找数据的条件 and开头
      Psize in number,                 --页面大小 每页要查询的数据量
      Pcount out number,               --返回数据总数
      v_cur out type_cur               --返回当前页数据记录
      )
      AS
      v_sqls varchar2(500);--完整的分页查询语句
      v_count number;--数据总记录数
      v_Plow number;--要查询的分页数据的结束下表
      v_Phei number;--要查询的分页数据 起始下表
      v_sql varchar2(500);--查询对象的sql语句
      Begin
    
      v_Phei := Pindex * Psize + Psize;
      v_Plow := v_Phei - Psize + 1;
      v_sql := 'select rownum rn,t.* from( ' || Pname || ') t where 1=1 '||Psql;   
          --v_sql := 'select rownum rn,t.* from WARD_INFO t where 1=1' ||Psql;     
        ------------------------------------------------------------取所有数据总数
      v_sqls := 'select count(*) from (' || v_sql || ')';
      execute immediate v_sqls into v_count;
      --Pcount := ceil(v_count/Psize);
      Pcount:=v_count;
        ------------------------------------------------------------显示任意页内容
      v_sqls := 'select * from (' || v_sql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;
      open v_cur for v_sqls;
      End DotNetPagination;
    end DotNet;

    网上看到好多 写2个存储过程的 刚开始还以为 很NB的样子 后来才知道 都是不懂乱学的 一群复制党  

    下面是c#调用存储过程代码

     /// <summary>
            /// 分页查询存储过程
            /// </summary>
            /// <param name="conStr">数据库连接字符串</param>
            /// <param name="ptableName">要查找数据的目标表</param>
            /// <param name="psql">查找条件即where 的后续条件 and开头</param>
            /// <param name="pindex">当前页码</param>
            /// <param name="psize">每页显示数量</param>
            /// <param name="pcount">输出参数总数据量</param>
            /// <param name="dt">输出参数当前页数据内容</param>
            /// <returns></returns>
            public static bool gridbind(string conStr, string ptableName, string psql, int pindex, int psize, out string pcount,out DataTable dt)
            {
                OracleConnection conn = new OracleConnection(conStr);
                OracleCommand cmd = new OracleCommand();
                OracleDataAdapter oda = new OracleDataAdapter();
              
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                conn.Open();
                cmd.Parameters.Clear();
                cmd.CommandText = "DotNet.DotNetPagination";
                if (pindex != 0)
                {
                    cmd.Parameters.Add("pindex", OracleType.Number).Value = pindex - 1;
                }
                else
                {
                    cmd.Parameters.Add("pindex", OracleType.Number).Value = pindex;
                }
                cmd.Parameters.Add("Psql", OracleType.VarChar).Value = psql;
                cmd.Parameters.Add("Psize", OracleType.Number).Value = psize;
                cmd.Parameters.Add("Pname", OracleType.VarChar).Value = ptableName;
                cmd.Parameters.Add("v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
                cmd.Parameters.Add("Pcount", OracleType.Number).Direction = ParameterDirection.Output;
                oda.SelectCommand = cmd;
                try
                {
                    dt = new DataTable();
                    oda.Fill(dt);
                    pcount = cmd.Parameters["Pcount"].Value.ToString();
                }
                catch (Exception)
                {
                    pcount = string.Empty;
                    dt = null;
                    return false;
                }
                finally 
                {
                    conn.Close();
                }
                return true;
            }
  • 相关阅读:
    jQuery拖动调整表格列宽度-resizableColumns
    图像切割之(一)概述
    内存泄漏以及常见的解决方法
    中国大概能用的NTPserver地址
    SWFUpload简单使用样例 Java版(JSP)
    XML是什么,它能够做什么?——写给XML入门者
    MfC 进度条控件
    IP地址的分类——a,b,c 类是怎样划分的
    Python的包管理工具Pip
    Chapter 1 Securing Your Server and Network(6):为SQL Server訪问配置防火墙
  • 原文地址:https://www.cnblogs.com/Iyce/p/3252767.html
Copyright © 2011-2022 走看看