码迷,mamicode.com
首页 > 数据库 > 详细

oracle 分页存储过程

时间:2016-04-09 11:57:56      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

--创建表
技术分享declare num number; 
技术分享begin 
技术分享select count(1) into num from user_tables where table_name=‘SRCT‘;   --判断当前要创建的表在数据库中是否存在.
技术分享if num>0 
技术分享then execute immediate ‘drop table ‘||‘SRCT‘; --表名要大写
技术分享end if; 
技术分享execute immediate ‘CREATE TABLE SRCT
技术分享(  
技术分享  SN  char(11), 
技术分享  XM  varchar2(30),  --姓名 
技术分享  KSCJ  number(3),   --考试成绩
技术分享  KSRQ  Date         --考试日期
技术分享      
技术分享)‘; 
技术分享end;
技术分享/
技术分享commit;
技术分享/
技术分享
技术分享--注:上面的表名要大写.

 

技术分享--插入数据
技术分享declare
技术分享maxrecords constant int:=50;
技术分享i int:=1;
技术分享begin
技术分享for i in 1..maxrecords
技术分享loop
技术分享insert into SRCT(SN,XM,KSCJ,KSRQ)values(i,‘frj‘||i,i+10,sysdate);
技术分享end loop
技术分享--dbms_output.put_line(‘成功录入数据!‘);
技术分享commit;
技术分享end;
技术分享/
技术分享--查询数据,检查数据插入操作是否成功.
技术分享SELECT * FROM SRCT WHERE ROWNUM<3;
技术分享/

 

技术分享--检查存储过程是否存在
技术分享declare 
技术分享num number;
技术分享msg varchar2(30):= ‘数据库中不存在该存储过程‘;
技术分享begin
技术分享  select   count(1) into num    
技术分享  from   user_objects     
技术分享  where   object_type   = ‘PROCEDURE‘   
技术分享  and   object_name=‘WRITE_SRC‘  ;
技术分享  
技术分享  if num>0 
技术分享  then 
技术分享      msg:= ‘该存储过程已经存在‘;
技术分享  end if;
技术分享  dbms_output.put_line(msg); 
技术分享end ;
技术分享/

 

技术分享--创建存储过程
技术分享CREATE OR REPLACE Procedure 
技术分享WRITE_SRC( M_SN in char  , M_XM in  varchar2,M_KSCJ in integer,
技术分享M_KSRQ in Date,RES out integer,ERR out
技术分享varchar2)
技术分享as
技术分享V_COUNT number:=0;
技术分享  Begin
技术分享  
技术分享  RES:=-2;
技术分享  ERR:=‘数据库中不存在该纪录,更新失败.‘;
技术分享  select count(SN) INTO V_COUNT 
技术分享  FROM SRCT 
技术分享  Where  SN=M_SN AND XM=M_XM;
技术分享  
技术分享  IF V_COUNT>0 THEN 
技术分享    Update SRCT
技术分享    Set KSCJ=M_KSCJ,KSRQ=M_KSRQ
技术分享    Where  SN=M_SN AND XM=M_XM;
技术分享    Commit;
技术分享    RES:=1;
技术分享    ERR:=‘更新成功!‘;
技术分享   return;
技术分享  END IF;
技术分享  exception
技术分享    when others then
技术分享     RES:=-1;
技术分享     ERR:=‘更新失败‘;
技术分享   return ;
技术分享End  ;
技术分享/
技术分享
技术分享commit;
技术分享/

 

技术分享
技术分享--调用存储过程
技术分享declare 
技术分享res int;
技术分享err Varchar2(80);
技术分享Begin
技术分享res:=‘3‘;
技术分享err:=‘更新成功‘;
技术分享WRITE_SRC(‘1‘,‘frj1‘,300,sysdate,res,err);
技术分享COMMIT;
技术分享dbms_output.put_line(res);
技术分享dbms_output.put_line(err); 
技术分享End;
技术分享/
技术分享
技术分享select sn,xm,kscj from srct WHERE SN=‘1‘ AND XM=‘frj1‘;
技术分享/

 

技术分享--注:易犯错误
技术分享--以上语句均在"SQL*Plus 工作单"上运行;
技术分享
技术分享  1.每一个小单元的语句后要加‘;‘号;
技术分享  2.不能将字符串赋值的单引号写成双引号;
技术分享    如: err:=‘更新成功!‘; 不能写成 err:="更新成功!";
技术分享    以上错误系统将提示:"警告: 创建的过程带有编译错误。"
技术分享  3.存储过程传递与赋值的参数名称,个数,类型(字段类型,返回的类型(in/out))要与调用的存储过程以及该存储过程
技术分享    所访问的表中相应的字段类型严格对应.
技术分享    还有一些约定的写法也需遵守.
技术分享    如:其中的" M_KSCJ "对应表中的" KSCJ "字段, 应写成(M_KSCJ in integer)不能写成( M_KSCJ in  number(3));
技术分享    "M_SN"对应表中的 "SN" 字段,应写成 (M_SN in char) 不能写成 (M_SN in Varchar2)
技术分享  4.在c#中进行调用时,还要注意它的输入/输出类型,如上例中的" out integer res "  为输出类型,应将其
技术分享      OracleParameter[] parm = new OracleParameter[1];
技术分享      parm[0] = new OracleParameter("RES", OracleType.Int16   );
技术分享      parm[0].Direction = ParameterDirection.Output  ; --将其设为输出类型;
技术分享      具体调用方法将在稍后进行介绍;
技术分享  5.定义存储过程时,其参数名称最好不要与字段名称同名(不区分大小写);
技术分享     如上面的存储过程建议不要写成:
技术分享     WRITE_SRC( SN in char  , XM in  varchar2,KSCJ in integer,
技术分享                KSRQ in Date,RES out integer,ERR out varchar2)

 

技术分享//--在c#中的调用
技术分享 
技术分享 
技术分享   public int upInfo(string m_sn,string m_sxm,int m_ikscj,DateTime m_dksrq, out int m_ires, out string m_serr)
技术分享技术分享        技术分享{
技术分享            string ConnStr=GetConnStr();
技术分享            OracleCommand cmd = new OracleCommand();
技术分享            OracleConnection conn = new OracleConnection(ConnStr);
技术分享            int rows = 0;
技术分享            mres = -110;
技术分享            merr = "";
技术分享            try
技术分享技术分享            技术分享{
技术分享                cmd.CommandType = CommandType.StoredProcedure;
技术分享                cmd.CommandText = "WRITE_SRC";
技术分享                OracleParameter[] parm = new OracleParameter[6];
技术分享                //in
技术分享                parm[0] = new OracleParameter("M_SN", OracleType.Char, 11);   --与SQL区别,sql存储过程需要在定义与此处,在其参数前加"@"符号;
技术分享                parm[1] = new OracleParameter("M_XM", OracleType.VarChar, 2);
技术分享                parm[2] = new OracleParameter("M_KSCJ", OracleType.Number, 3);
技术分享                parm[3] = new OracleParameter("M_KSRQ", OracleType.DateTime , 8);
技术分享                //out
技术分享                parm[4] = new OracleParameter("RES", OracleType.Int16);
技术分享                parm[5] = new OracleParameter("ERR", OracleType.VarChar, 50);
技术分享
技术分享                //指明参数是输入还是输出型
技术分享                for (int i = 0; i < parm.Length-2; i++)
技术分享技术分享                技术分享{
技术分享                    parm[i].Direction = ParameterDirection.Input;
技术分享                }
技术分享                parm[4].Direction = ParameterDirection.Output;
技术分享                parm[5].Direction = ParameterDirection.Output;
技术分享
技术分享              
技术分享                //给参数赋值
技术分享                parm[0].Value = m_sn;
技术分享                parm[1].Value = m_sxm;
技术分享                parm[2].Value = m_ikscj;
技术分享                parm[3].Value = OracleDateTime.Parse(m_dksrq.ToShortDateString());
技术分享                --直接用update语句更新时,需要采用下面的日期格式.
技术分享                -- string msksrq = mksrq.Day.ToString() + "-" + mksrq.Month.ToString() + "月" + " -" + mksrq.Year.ToString().Substring(2, 2);
技术分享          
技术分享                //传递参数给Oracle命令
技术分享                for (int i = 0; i < parm.Length; i++)
技术分享技术分享                技术分享{
技术分享                    cmd.Parameters.Add(parm[i]);
技术分享                }
技术分享
技术分享                //打开连接
技术分享                if (conn.State != ConnectionState.Open)
技术分享                    conn.Open();
技术分享
技术分享                cmd.Connection = conn;
技术分享                rows = cmd.ExecuteNonQuery();
技术分享
技术分享                //取出返回值
技术分享                m_ires = Convert.ToInt16(parm[4].Value);//res
技术分享                m_serr = parm[5].Value.ToString();//err
技术分享
技术分享            }
技术分享            catch (Exception er)
技术分享技术分享            技术分享{
技术分享                merr = System.Environment.NewLine + "res:" + m_ires.ToString() + "err:" + er.ToString();
技术分享                MrfuWriteEventLog.C_WriterEventLog.WriteEventLogAppend("UploadDriInfo: mres=" + m_ires.ToString() + "merr:" + er.ToString());
技术分享            }
技术分享            finally
技术分享技术分享            技术分享{
技术分享                //关闭连接,释放空间.
技术分享                if (conn.State == ConnectionState.Open)
技术分享                    conn.Close();
技术分享                conn.Dispose();
技术分享                cmd.Parameters.Clear();
技术分享                cmd.Dispose();
技术分享            }
技术分享
技术分享            return rows;
技术分享        }
技术分享

 

技术分享--按时间段分页显示
技术分享 
技术分享select sn,xm,kscj,ksrq from SRCT  
技术分享where ksrq between  to_date(‘2003-01-01‘,‘yyyy-mm-dd‘)   and   to_date(‘2007-06-28‘,‘yyyy-mm-dd‘) order by ksrq;
技术分享/
技术分享
技术分享
技术分享select * from 
技术分享( select b.*,rownum row_num from
技术分享    (
技术分享     select  sn,xm,kscj,ksrq from SRCT  c
技术分享     where ksrq between  to_date(‘2003-01-01‘,‘yyyy-mm-dd‘)   and   to_date(‘2007-06-28‘,‘yyyy-mm-dd‘) order by c.sn 
技术分享     )b
技术分享)a where a.row_num between 1 and 10; 
技术分享
技术分享/
技术分享--注: oracle的rownum是在提取记录时就已经生成,它先于排序操作,所以必须使用子查询先排序.

 

技术分享--==转oracle分页存储过程==
技术分享CREATE OR REPLACE  PACKAGE DotNet  is
技术分享
技术分享  TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集
技术分享  PROCEDURE DotNetPagination
技术分享  (
技术分享  Pindex in number,                --分页索引
技术分享  Psql in varchar2,                --产生dataset的sql语句
技术分享  Psize in number,                 --页面大小
技术分享  Pcount out number,               --返回分页总数
技术分享  v_cur out type_cur               --返回当前页数据记录
技术分享  );
技术分享  procedure DotNetPageRecordsCount
技术分享  (
技术分享  Psqlcount in varchar2,           --产生dataset的sql语句
技术分享  Prcount   out number             --返回记录总数
技术分享  );
技术分享end DotNet;
技术分享/
技术分享CREATE OR REPLACE  PACKAGE BODY DotNet  is
技术分享 --***************************************************************************************
技术分享  PROCEDURE DotNetPagination
技术分享  (
技术分享  Pindex in number,
技术分享  Psql in varchar2,
技术分享  Psize in number,
技术分享  Pcount out number,
技术分享  v_cur out type_cur
技术分享  )
技术分享  AS
技术分享  v_sql VARCHAR2(1000);
技术分享  v_count number;
技术分享  v_Plow number;
技术分享  v_Phei number;
技术分享  Begin
技术分享  ------------------------------------------------------------取分页总数
技术分享  v_sql := ‘select count(*) from (‘ || Psql || ‘)‘;
技术分享  execute immediate v_sql into v_count;
技术分享  Pcount := ceil(v_count/Psize);
技术分享  ------------------------------------------------------------显示任意页内容
技术分享  v_Phei := Pindex * Psize + Psize;
技术分享  v_Plow := v_Phei - Psize + 1;
技术分享  --Psql := ‘select rownum rn,t.* from cd_ssxl t‘ ;            --要求必须包含rownum字段
技术分享  v_sql := ‘select * from (‘ || Psql || ‘) where rn between ‘ || v_Plow || ‘ and ‘ || v_Phei ;
技术分享  open v_cur for v_sql;
技术分享  End DotNetPagination;
技术分享 --**************************************************************************************
技术分享  procedure DotNetPageRecordsCount
技术分享  (
技术分享  Psqlcount in varchar2,
技术分享  Prcount   out number
技术分享  )
技术分享  as
技术分享  v_sql varchar2(1000);
技术分享  v_prcount number;
技术分享  begin
技术分享  v_sql := ‘select count(*) from (‘ || Psqlcount || ‘)‘;
技术分享  execute immediate v_sql into v_prcount;
技术分享  Prcount := v_prcount;                  --返回记录总数
技术分享  end DotNetPageRecordsCount;
技术分享 --**************************************************************************************
技术分享end DotNet;
技术分享
技术分享/
技术分享

 

技术分享//==使用示例==
技术分享技术分享       /**//// <summary>
技术分享       /// 填充dataSet数据集-Oracle库
技术分享       /// </summary>
技术分享       /// <param name="pindex">当前页</param>
技术分享       /// <param name="psql">执行查询的SQL语句</param>
技术分享       /// <param name="psize">每页显示的记录数</param>
技术分享       /// <returns></returns>
技术分享      private bool gridbind(int pindex, string psql, int psize)
技术分享技术分享     技术分享{
技术分享            OracleConnection conn = new OracleConnection();
技术分享            OracleCommand cmd = new OracleCommand();
技术分享            OracleDataAdapter dr = new OracleDataAdapter();
技术分享            conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
技术分享            cmd.Connection = conn;
技术分享            cmd.CommandType = CommandType.StoredProcedure;
技术分享            conn.Open();
技术分享            cmd.CommandText = "DotNet.DotNetPageRecordsCount";
技术分享            cmd.Parameters.Add("psqlcount", OracleType.VarChar).Value = psql;
技术分享            cmd.Parameters.Add("prcount", OracleType.Number).Direction = ParameterDirection.Output;
技术分享            
技术分享            cmd.ExecuteNonQuery();
技术分享            string PCount = cmd.Parameters["prcount"].Value.ToString();
技术分享            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("v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
技术分享            cmd.Parameters.Add("pcount", OracleType.Number).Direction = ParameterDirection.Output;
技术分享            dr.SelectCommand = cmd;
技术分享            try
技术分享技术分享            技术分享{
技术分享                ds = new DataSet();
技术分享                dr.Fill(ds);
技术分享                //显示页码条的状态
技术分享                showStatus(Convert.ToInt32(cmd.Parameters["pindex"].Value) + 1,
技术分享                    Convert.ToInt32(cmd.Parameters["pcount"].Value),
技术分享                    Convert.ToInt32(PCount));
技术分享                for (int i = 0; i < ds.Tables.Count; i++)
技术分享技术分享                技术分享{ //把数据行为零的表删除
技术分享                    if (ds.Tables[i].Rows.Count == 0)
技术分享                        ds.Tables.Remove(ds.Tables[i].TableName);
技术分享                }
技术分享            }
技术分享            catch (Exception ex)
技术分享技术分享            技术分享{
技术分享                Console.WriteLine(ex.Message);
技术分享                return false;
技术分享            }
技术分享 
技术分享            conn.Close();
技术分享            return true;
技术分享    }

oracle 分页存储过程

标签:

原文地址:http://www.cnblogs.com/pendy2016/p/5371221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!