oracle学习

来源:互联网 发布:java开发平台简介 编辑:程序博客网 时间:2024/05/02 00:05

1。标识列的实现

CREATE SEQUENCE emp_sequence
     INCREMENT BY 1   -- 每次加几个
     START WITH 1     -- 从1开始计数
     NOMAXVALUE       -- 不设置最大值
     NOCYCLE          -- 一直累加,不循环
     CACHE 10;

Oracle里没有标识列这种说法的,只有序列;  
   
  在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。    
  1、Create   Sequence    
  你首先要有CREATE   SEQUENCE或者CREATE   ANY   SEQUENCE权限,    
  CREATE   SEQUENCE   emp_sequence    
  INCREMENT   BY   1    --   每次加几个    
  START   WITH   1     --   从1开始计数    
  NOMAXVALUE      --   不设置最大值    
  NOCYCLE     --   一直累加,不循环    
  CACHE   10;                 --缓存序列个数,有助于提高效率,但可能造成跳号。  
   
  一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL    
  CURRVAL=返回   sequence的当前值    
  NEXTVAL=增加sequence的值,然后返回   sequence   值    
  比如:    
  emp_sequence.CURRVAL    
  emp_sequence.NEXTVAL    
   
  可以使用sequence的地方:    
  -   不包含子查询、snapshot、VIEW的   SELECT   语句    
  -   INSERT语句的子查询中    
  -   NSERT语句的VALUES中    
  -   UPDATE   的   SET中    
   
  可以看如下例子:    
  INSERT   INTO   emp   VALUES    
  (empseq.nextval,   'LEWIS',   'CLERK',7902,   SYSDATE,   1200,   NULL,   20);    
   
  SELECT   empseq.currval   FROM   DUAL;    
   
  但是要注意的是:    
  -   第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT  BY值,然后返回增加后的值。CURRVAL  总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?    
   
 -  如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。   使用cache或许会跳号,   比如数据库突然不正常down掉(shutdown  abort),cache中的sequence就会丢失.   所以可以在create   sequence的时候用nocache防止这种情况。   
   
  2、Alter   Sequence    
 你或者是该sequence的owner,或者有ALTER   ANY   SEQUENCE   权限才能改动sequence.  可以alter除start至以外的所有sequence参数.如果想要改变start值,必须   drop   sequence   再  re-create   .    
  Alter   sequence   的例子    
  ALTER   SEQUENCE   emp_sequence    
    INCREMENT   BY   10    
    MAXVALUE   10000    
    CYCLE     --   到10000后从头开始    
    NOCACHE   ;    
   
   
  影响Sequence的初始化参数:    
  SEQUENCE_CACHE_ENTRIES   =设置能同时被cache的sequence数目。    
   
  可以很简单的Drop   Sequence    
  DROP   SEQUENCE   order_seq;

 

3    分页存储过程

 

create or replace package DB_Oper as
  type ref_DataSet IS REF CURSOR;
  function GetCount(mTableName varchar2, mTerm varchar2) return number;
procedure return_DataSet(
     mTableName in varchar2,    --表名
     mTerm in varchar2,         --条件
     mPageSize in number,       --每页显示记录数
     mPageIndex in number,      --当前页
     mOrderField in varchar2,   --排序字段
     mOrderStyle in number,    --排序方式 0 升序 1 降序
     mTotalRecords out number,  --总记录数
     mDateSet out ref_DataSet    --记录
     );
end DB_Oper;

create or replace

package body DB_Oper as

  -----  获取记录数  ------
  function GetCount(mTableName varchar2, mTerm varchar2) return number is
    i number;
    vSql varchar2(1000);
  begin
    i := 0;
    vSql := 'select count(*)  from ' || mTableName ;

    if length(mTerm) > 0 then
      vSql := vSql || ' where ' || mTerm;
    end if;

    execute IMMEDIATE  vSql into i;

    return(i);
  end;

  -----  数据分页  ----------
  procedure return_DataSet(
     mTableName in varchar2,    --表名
     mTerm in varchar2,         --条件
     mPageSize in number,       --每页显示记录数
     mPageIndex in number,      --当前页
     mOrderField in varchar2,   --排序字段
     mOrderStyle in number,    --排序方式  0 升序 1 降序
     mTotalRecords out number,  --总记录数
     mDateSet out ref_DataSet    --记录集
     ) is
  begin
    declare
      Invalid_Input Exception;
      vSql varchar2(1000);
      Start_page number;
      End_page number;
      n_PageIndex number;
      n_PageSize number;
      --mTotalRecords number;
    begin
      mTotalRecords := GetCount(trim(mTableName), trim(mTerm));
      vSql := 'select * from ' || mTableName;
      if length(trim(mTerm)) > 0 then
        vSql := vSql || ' where ' || trim(mTerm) ;
      end if;
      if length(trim(mOrderField)) > 0 then
       begin
          vSql := vSql || ' order by ' || trim(mOrderField);
          if morderStyle > 0 then
            vSql := vSql || ' desc ';
          end if;
       end;
      end if;

      --
      n_PageSize := mPageSize;
      if mPageSize <= 0 then
        n_PageSize := 10;
      end if;
      n_PageIndex := mPageIndex;
      if mPageIndex <= 0 then
        n_PageIndex := 1;
      end if;
      if mTotalRecords > 0 and n_PageIndex > 1 then
      begin
            --如果n_pageindex大于实际的页数,则取实际页数
        if n_PageIndex > round((mTotalRecords / n_PageSize) + 0.5) then
          n_PageIndex := round((mTotalRecords / n_PageSize) + 0.5);
        end if;
      end;
      end if;
      Start_page := (n_PageIndex - 1) * n_PageSize + 1;
      End_page := n_PageIndex * n_PageSize;
      vSql := 'SELECT * FROM (SELECT A.*, rownum r FROM ( ' || vSql || ' ) A WHERE rownum <= ' || End_page || ' ) B WHERE r >= '|| Start_page;

      Open mDateSet for vSql;

    exception
      When Invalid_Input Then
        open mDateSet for select null from dual;
    end;
  end return_DataSet;
end DB_Oper;