zoukankan      html  css  js  c++  java
  • oracle 学习笔记(五)

         由于在学习oracle,总会不有自主的将它与微软的Sql Server相比较,有时候会把自己弄糊涂,就下定决心把这个两个主流数据库的存储过程总结一下。说道存储过程,那么存储过程有什么优势呢,相对于在应用程序执行sql语句。

      吸收前人的经验总结下它的优点,主要有四点。 

      ★允许模块化程序设计,以后可以重复调用;可以由专人来完成,并可独立于程序源代码而单独修改。这样一个项目在需求分析、界面设计以及数据库设计完了以后,就可以开始写存储过程了,同一时间数据访问层也可以开始写了。没有必要等详细设计说明完成了在编码的时候才开始写SQL语句。

      ★执行更快,存储过程都是预编译命令,执行起来比SQL语句更快。

      ★减少网络流量。

      ★可作为安全机制,能够屏蔽数据库,用户并不知道数据库的真实结构。

      分页存储过程是最好来说明这个过程的,下面是oracle的语句。

    create  procedure fenye
    (tableName in varchar2, --定义分页的表名
    Pagesize in number, --定义每页的大小
    pageNow in number, --定义当前第几页
    myrows out number,
    myPageCount out number, --定义输出这个表一共有几页
    p_cursor out testpackage.test_cursor) is
    v_sql varchar2(1000);
    v_begin number:=(pageNow-1)*Pagesize+1; --定义某页开始选第几行
    v_end number:=pageNow*Pagesize; --定义某页结束第几行
    begin
    v_sql:='select * from (select t1.*,rownum rn from (select * from '|| tableName
    ||') t1 where rownum<='||v_end||') where rn>='||v_begin;
    open p_cursor for v_sql;
    v_sql:='select count(*) from '|| tableName;
    execute immediate v_sql into myrows;
    if mod(myrows,Pagesize)=0 then
    myPageCount:=myrows/Pagesize;
    dbms_output.put_line(myPageCount);
    else
    myPageCount:=myrows/pagesize+1;
    end if;
    --close p_cursor;
    end;

    下面是微软数据库的分页存储过程

    create procedure usp_Pagin
    @pageSize int,
    @pageIndex int,
    @pageCount int output
    as
    declare @count int
    select * from
    (select row_number() over(order by sId)as num,* from student) as newTable
    where num between (@pageSize*(@pageIndex-1)+1) and (@pageSize*@pageIndex)
    select @count=count(*) from student
    set @pageCount=ceiling(@count/convert(float,@pageSize))

    从结构语法来说

          微软                                                                                           oracle

    定义参数  create procedure 过程名 输入的参数名1,... as             create procedure 过程名(输入的参数名1.....) is

    定义变量     declare @变量名 类型(declare @count int)             变量名 类型; //(v_sql varchar2(1000);)

    变量赋值     =                                  :=

    变量输入输出定义  变量名 类型 in/output                      变量名 in/out 类型

      到现在为止,就这么多吧!

  • 相关阅读:
    Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用
    Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
    Java sun.misc.Unsafe类的学习笔记
    Java 并发编程学习笔记 理解CLH队列锁算法
    深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
    Java并发编程学习笔记 深入理解volatile关键字的作用
    JVM Client Server启动设置
    双重检查锁定与延迟初始化
    Tomcat 添加为系统服务 开机自动启动
    配置TOMCAT 修改默认ROOT路径
  • 原文地址:https://www.cnblogs.com/xianrongbin/p/2378177.html
Copyright © 2011-2022 走看看