`
kingmxj
  • 浏览: 186795 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle分页存储过程

阅读更多

--------以下为oracle通用分页存储过程代码,直接在oracle中执行即可。-------------------------

----------------------------------------

create or replace package package_page as
  type cursor_page is ref cursor;
  Procedure proc_page(
             p_tablename varchar2,                --表名emp e
             p_tablecolumn varchar2,             --查询列e.id,e.ename,e.job
             p_order varchar2,                         --排序e.ename desc
             p_pagesize Number,                   --每页大小
             p_curpage Number,                     --当前页
             p_where varchar2,                       --查询条件e.ename like '%S%'
             p_rowcount out Number,             --总条数,输出参数
             p_pagecount out number,            --总页数
             p_cursor out cursor_page);        --结果集
end package_page;


CREATE OR REPLACE Package Body package_page
Is
       --存储过程
      Procedure proc_page(
             p_tablename varchar2,                --表名emp e
             p_tablecolumn varchar2,             --查询列e.id,e.ename,e.job
             p_order varchar2,                         --排序e.ename desc
             p_pagesize Number,                   --每页大小
             p_curpage Number,                     --当前页
             p_where varchar2,                       --查询条件e.ename like '%S%'
             p_rowcount out Number,             --总条数,输出参数
             p_pagecount out number,            --总页数
             p_cursor out cursor_page          --结果集
      )
      is
            v_count_sql varchar2(2000);
            v_select_sql varchar2(2000);
      begin
            --查询总条数
            v_count_sql:='select count(*) from '||p_tablename;
            --连接查询条件(''也属于is null)
            if p_where is not null  then
               v_count_sql:=v_count_sql||' where '||p_where;
            end if;
            --执行查询,查询总条数
            execute immediate v_count_sql into p_rowcount;

            --dbms_output.put_line('查询总条数SQL=>'||v_count_sql);
            --dbms_output.put_line('查询总条数Count='||p_rowcount);

             --得到总页数
             if mod(p_rowcount,p_pagesize)=0 then
                p_pagecount:=p_rowcount/p_pagesize;
             else
                p_pagecount:=p_rowcount/p_pagesize+1;
             end if;

            --如果查询记录大于0则查询结果集
            if p_rowcount>0 and p_curpage>=1 and p_curpage<=p_pagecount then

               --查询所有(只有一页)
               if p_rowcount<=p_pagesize then
                  v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
                  if p_where is not null then
                     v_select_sql:=v_select_sql||' where '||p_where;
                  end if;
                  if p_order is not null then
                      v_select_sql:=v_select_sql||' order by '||p_order;
                  end if;
               elsif p_curpage=1 then  --查询第一页
                  v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
                  if p_where is not null then
                     v_select_sql:=v_select_sql||' where '||p_where||' and

rownum<='||p_pagesize;
                  else
                     v_select_sql:=v_select_sql||' where rownum<='||p_pagesize;
                  end if;
                  if p_order is not null then
                      v_select_sql:=v_select_sql||' order by '||p_order;
                  end if;
               else      --查询指定页
                  v_select_sql:='select * from (select '|| p_tablename || '.' ||

p_tablecolumn ||',rownum row_num from '|| p_tablename;
                  if p_where is not null then
                     v_select_sql:=v_select_sql||' where '||p_where;
                  end if;
                  if p_order is not null then
                      v_select_sql:=v_select_sql||' order by '||p_order;
                  end if;
                  v_select_sql:=v_select_sql||') where row_num>'||((p_curpage-1)

*p_pagesize)||' and row_num<='||(p_curpage*p_pagesize);
               end if;
               --执行查询
               dbms_output.put_line('查询语句=>'||v_select_sql);
               open p_cursor for v_select_sql;
            else
               --dbms_output.put_line('查询语句=>'||'select * from '||p_tablename||' where

1!=1');
               open p_cursor for 'select * from '||p_tablename||' where 1!=1';
            end if;

      end proc_page;
end package_page;


--------以上为oracle通用分页存储过程代码,直接在oracle中执行即可。-------------------------

----------------------------------------


--------------------------------------------------------------------------------------------
-------------------执行存储过程的例子---------------------------------------------


declare
       v_rowcount number(5,0);
       v_pagecount number;
       v_cursor package_page.cursor_page;
begin 
       package_page.proc_page('TS_Student_Info','*','code desc',15,2,' 1=1

',v_rowcount,v_pagecount,v_cursor);
       dbms_output.put_line(v_rowcount);
       dbms_output.put_line(v_pagecount);
end;

----------------------------------------------------------------------------------
---------------------------------------------------------------------------------




-----------------------------------------------------------------------------------------
---------------------------下面是c#部分代码,仅供参考-----------------------------------

    /// <summary>
    /// 调用存储过程实现快速分页
    /// </summary>
    /// <param name="mTableName">表名</param>
    /// <param name="select_fileds">查询的字段,比如:*或者code,name</param>
    /// <param name="mOrderField">排序字段,比如:code desc或者code asc</param>
    /// <param name="mPageSize">每页大小</param>
    /// <param name="mPageIndex">查询第几页</param>
    /// <param name="mTerm">查询条件,比如: 1=1 and code = 15</param>
    /// <returns>返回的是游标形式的数据集</returns>
    public DataSet QuickPage(string mTableName,string select_fileds, string mOrderField, int

mPageSize, int mPageIndex, string mTerm)
    {
        //注意参数名称必须与数据库中存储过程的参数名称一致。
        OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings

["Conn_Oracle"].ToString());
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        cmd.CommandText = "package_page.proc_page";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("p_tablename", OracleType.VarChar, 50);    //表  名
        cmd.Parameters["p_tablename"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_tablename"].Value = mTableName;

        cmd.Parameters.Add("p_tablecolumn", OracleType.VarChar, 1000);   //查询那几列
        cmd.Parameters["p_tablecolumn"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_tablecolumn"].Value = select_fileds;

        cmd.Parameters.Add("p_order", OracleType.VarChar, 100);   //排序字段
        cmd.Parameters["p_order"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_order"].Value = mOrderField;

        cmd.Parameters.Add("p_pagesize", OracleType.Int32);    //每页数量
        cmd.Parameters["p_pagesize"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_pagesize"].Value = mPageSize;

        cmd.Parameters.Add("p_curpage", OracleType.Int32);    //第几页
        cmd.Parameters["p_curpage"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_curpage"].Value = mPageIndex;

        cmd.Parameters.Add("p_where", OracleType.VarChar, 1000);  //过滤条件
        cmd.Parameters["p_where"].Direction = ParameterDirection.Input;
        cmd.Parameters["p_where"].Value = mTerm;

        cmd.Parameters.Add("p_rowcount", OracleType.Int32);   //返回的总记录数
        cmd.Parameters["p_rowcount"].Direction = ParameterDirection.Output;
        cmd.Parameters["p_rowcount"].Value = 0;

        cmd.Parameters.Add("p_pagecount", OracleType.Int32);   //总页数
        cmd.Parameters["p_pagecount"].Direction = ParameterDirection.Output;
        cmd.Parameters["p_pagecount"].Value = 0;

        cmd.Parameters.Add("p_cursor", OracleType.Cursor);   //返回的游标
        cmd.Parameters["p_cursor"].Direction = ParameterDirection.Output;

        DataSet Ds = new DataSet();
        OracleDataAdapter adapter = new OracleDataAdapter(cmd);
        adapter.Fill(Ds);
        conn.Close();

        ////总记录数
        //RecordCount = int.Parse(cmd.Parameters["TotalCount"].Value.ToString());

        return Ds;
    }
   
   
   
   
   
   
   
   
    CREATE OR REPLACE PROCEDURE DICTIONARY_ADD
(
m_dict_code varchar2,
m_parent_id  varchar2,
m_dict_name varchar2,
m_dict_inuse integer,
m_dict_customer_id varchar2,
m_dict_customer_name varchar2
)
as

max_code varchar2(100);
dict_order integer;


begin



--如果是根节点,就是 0 == 0
if m_parent_id ='0' then
    select nvl(max(to_number(dict_code))+1,0) into max_code from dictionary where parent_id

= '0';
else
    select m_parent_id||substr((1000+nvl(max(to_number(dict_code)),0)+1),-3) into max_code

from dictionary  where parent_id = m_parent_id;
end if;



   select nvl(max(dict_order),0)+1 into dict_order from dictionary where parent_id =

m_parent_id;
   insert into dictionary

(dict_name,dict_code,dict_order,parent_id,dict_inuse,dict_customer_id,dict_customer_name)
   values
    

(m_dict_name,max_code,dict_order,m_parent_id,m_dict_inuse,m_dict_customer_id,m_dict_customer

_name);
  
   dbms_output.put_line(max_code);
   dbms_output.put_line(dict_order);

end DICTIONARY_ADD;







CREATE OR REPLACE PROCEDURE TS_TEMP_ACCOMMODATION_BATCH_EX
AS


ISNO VARCHAR2(50);
INFOCOUT integer;

m_building_id varchar2(50);
m_floor integer;
m_room_id varchar2(50);
m_bed_id varchar2(50);
  ----住宿的时候占用了几个床位
m_bed_count integer;

--------------------------------------------循环----------------------------
begin
for emprow in  (select code,student_id,student_name from TS_Temp_Accommodation_Exit order by

code) loop
  
   --0表示没有退宿信息错误出现。
   ISNO:='0' ;
   
   --dbms_output.put_line(emprow.code);
     
  --查询学号姓名是否一致
if ISNO= '0' then
SELECT  count(*) into INFOCOUT FROM TS_Student_Info WHERE (student_id =

emprow.student_id) AND (student_name = emprow.student_name);
if INFOCOUT = 0 then
update TS_Temp_Accommodation_Exit set reason = '导入学号、姓名与数据

库中的学号和姓名不一致!' where code = emprow.code;
isno:='1';
    end if;
end if;

------检查该学号是否存在住宿信息
if ISNO='0' then
SELECT count(*) into INFOCOUT FROM TS_Accommodation WHERE student_id =

emprow.student_id and doublestate = 14001;

if INFOCOUT = 0 then
update TS_Temp_Accommodation_Exit set reason = '该学号的住宿信息不存

在!' where code = emprow.code;
isno:='1';
end if;
end if;

  ---获取该学号住宿时候用了几个床位
  if ISNO='0' then
---获取该人住在那个房间的那个床位上、该人住宿的时候占用了几个床位
SELECT building_id,floor,room_id,bed_id,bed_count into

m_building_id,m_floor,m_room_id,m_bed_id,m_bed_count  FROM TS_Accommodation WHERE student_id

= emprow.student_id and doublestate = 14001;

----更新床位占用信息、更新床位剩余数量
update Ts_Room_Manage_Info Set occupy_bed =replace

(occupy_bed,m_bed_id||'|',''),surplus_bed_sum = surplus_bed_sum + m_bed_count where

building_id = m_building_id and building_floor = m_floor and room_id = m_room_id;

--退宿
update TS_Accommodation set state =13004 where student_id =

emprow.student_id and doublestate = 14001;


--=======================================下面是双床位的处理

==================
------检查该学号是否存在双床位
SELECT count(*) into INFOCOUT FROM TS_Accommodation WHERE student_id =

emprow.student_id  and doublestate = 14002;
if INFOCOUT > 0 then
---获取该人住在那个房间的那个床位上、该人住宿的时候占用了几个床位
SELECT building_id,floor,room_id,bed_id,bed_count into

m_building_id,m_floor,m_room_id,m_bed_id,m_bed_count  FROM TS_Accommodation WHERE student_id

= emprow.student_id and doublestate = 14002;
----更新床位占用信息、更新床位剩余数量
update Ts_Room_Manage_Info Set occupy_bed =replace

(occupy_bed,m_bed_id||'|',''),surplus_bed_sum = surplus_bed_sum + m_bed_count where

building_id = m_building_id and building_floor = m_floor and room_id = m_room_id;
--退宿
update TS_Accommodation set state =13004 where student_id =

emprow.student_id and doublestate = 14002;
end if;
---====================================以上是双床位的处理==================



---删除该条退宿信息
delete from TS_Temp_Accommodation_Exit WHERE code = emprow.code;

end if;
---insert into config (pa_name,pa_value) values ('1','1');
-------------------------------------------------------------------------------------------

---------------------------
end loop;
end TS_TEMP_ACCOMMODATION_BATCH_EX;
分享到:
评论

相关推荐

    oracle分页存储过程

    oracle分页存储过程,oracle分页存储过程

    Oracle 分页存储过程 终极版

    "Oracle分页存储过程 终极版"旨在提供一个高效、灵活的解决方案,以应对各种分页查询的需求。这个存储过程优化了性能,并支持各种条件筛选和排序,使得在海量数据中进行分页操作变得更为便捷。 首先,理解分页的...

    ORACLE分页存储过程

    在分页存储过程中,主要理解了变量的动态赋值和输入输出参数的使用就非常简单了 下面为调用方法: var c_Preccount number; var c_Ppagecount number; var c_cur refcursor; exec proc_SpPag(1,'SELECT * FROM T_...

    Oracle 分页存储过程

    本文将深入解析一个Oracle分页存储过程的设计思想与具体实现方法。该存储过程通过输入参数控制每页显示的记录数,并返回指定页面的数据,同时提供了总记录数和总页数等信息。 #### 知识点二:存储过程定义与结构...

    Oracle 分页的存储过程

    总结来说,Oracle分页存储过程是通过动态构造SQL语句,结合输入的分页参数,计算出总页数,并返回指定页的数据。这种方式在处理大量数据时提高了效率,同时也提供了灵活的查询控制。通过包装这些逻辑在存储过程中,...

    oracle 分页 存储过程

    oracle 分页 存储过程,超级牛的分页存储过程,执行后可以直接实用,分页速度刚刚的

    带排序的oracle分页存储过程

    ### 带排序的Oracle分页存储过程 在开发Web应用程序的过程中,分页是一个非常常见的需求。为了提高系统的性能及可维护性,采用存储过程来实现分页逻辑是一种较为推荐的做法。下面将详细介绍如何利用Oracle数据库中...

    Oracle 分页存储过程 SQL

    Oracle 分页存储过程 SQL Oracle 分页存储过程 SQL

    java调用oracle分页存储过程

    Java调用Oracle分页存储过程是一项常见的数据库操作,尤其在处理大数据量时,为了提高查询效率和用户体验,分页查询显得尤为重要。Oracle数据库提供了一种高效的方法,即通过创建存储过程来实现分页功能,而Java作为...

    oracle分页存储过程千万级

    本文将基于给定的“oracle分页存储过程千万级”文件信息,深入解析其核心概念、设计思路及实现细节。 ### 核心概念解析 #### 1. 存储过程(Stored Procedure) 存储过程是一种预编译的SQL代码块,存储在数据库...

    oracle 分页存储过程

    本篇文章将深入探讨Oracle中的分页存储过程,以及如何利用源码和工具来实现这一功能。 在Oracle数据库中,进行分页查询通常涉及到ROWNUM伪列和子查询。ROWNUM是在数据检索时由Oracle自动生成的一个整数值,表示行的...

    asp.net使用oracle分页存储过程查询数据

    功能说明 写好oracle的连接字符串和查询语句,调用程序中的方法可以很方便的实现分页功能。该方法中,将参数连接字符串,查询的sql语句,... 效率不是很高,如有高人写出很厉害的分页存储过程,希望您与大家分享。

    (最好最优Oracle分页存储过程)UP_Sys_CommQuery_GetPageList

    ### Oracle 分页存储过程 UP_Sys_CommQuery_GetPageList 的详细解析 #### 一、概述 在Oracle数据库中实现高效的数据分页是一项重要的任务。本文将深入解析一个名为`UP_Sys_CommQuery_GetPageList`的存储过程,该...

Global site tag (gtag.js) - Google Analytics