oracle下主键生成,及导入导出方法

1.sql存储过程

CREATE OR REPLACE FUNCTION hunt.seqformat(prefix VARCHAR2,tablename VARCHAR2)
RETURN varchar2

/*
--创建函数生成固定格式的主键20位(前缀+时间+8位序列号)
--Author:fjfdszj
--Date:2009-08-07
--参数说明:prefix主键的前缀,tablename数据库的表名,sequence的组合可以是

--seq_tablename得到。
--例如 Sale2009080712345678(格式说明prefix=Sale,时间=20090807,8位序列号=12345678)
*/
IS
  v_sqlStr varchar2(200);--sql语句
  v_seqName varchar2(30);--sequence名字(即seq_表名)
  v_currentseq varchar2(8); --通过 sequence.nextval得到值
  v_formatseq varchar2(20)

BEGIN
  v_seqName:='seq_'||tablename;
  v_sqlStr:='select to_char('||v_seqName||'.nextval)  from dual';
  execute immediate v_sqlStr into v_currentseq; 
  v_formatseq:=lpad(prefix,4,0)||to_char(sysdate,'yyyymmdd')||lpad(v_currentseq,8,0);
  --输出提示结果
  ---dbms_output.put_line(v_returnstr);
  return v_formatseq;
END;

 

2.外部调用

select hunt.seqformat('sale','T_SYSTEM_MESSAGE') from dual;

 

3.sequence的声明

create sequence seq_T_SYSTEM_MESSAGE increment by 1 start with 1 maxvalue 100000000 cycle cache 10;

====================================

附注

--创建sequence
CREATE SEQUENCE seq_T_SYSTEM_MESSAGE
    INCREMENT BY 1-- 每次加几个
    START WITH 1-- 从1开始计数
    MAXVALUE 100000000 -- 设置最大值
    CYCLE   -- 累加,循环
    CACHE 10;--缓冲10个,如果断电,可能会出跳号

=============================

CREATE OR REPLACE FUNCTION hunt.seqformat(tablename VARCHAR2)
RETURN number
/*
--创建函数生成固定格式的主键20位(前缀+时间+8位序列号)
--Author:fjfdszj
--Date:2009-08-07
--参数说明:prefix主键的前缀,tablename数据库的表名,sequence的组合可以是seq_tablename得到。
--例如 Sale2009080712345678(格式说明prefix=Sale,时间=20090807,8位序列号=12345678)
--v_formatseq:=lpad(prefix,4,0)||to_char(sysdate,'yyyymmdd')||lpad(v_currentseq,8,0);
--ModifyDate:2009-08-10
--去除prefix主键的前缀,因性能要求用返回number(16),当前主键生成由 日期+序列号(8位)。
--参数tablename,作为查询的sequence的主键。
*/
IS
  v_sqlStr varchar2(200);--sql语句
  v_seqName varchar2(30);--sequence名字(即seq_表名)
  v_currentseq varchar2(8); --通过 sequence.nextval得到值
  v_formatseq number(16,0);
BEGIN
  v_seqName:='seq_'||tablename;
  v_sqlStr:='select to_char('||v_seqName||'.nextval)  from dual';
  execute immediate v_sqlStr into v_currentseq;
  v_formatseq:=to_number(to_char(sysdate,'yyyymmdd')||lpad(v_currentseq,8,0));
  --输出提示结果
  ---dbms_output.put_line(v_returnstr);
  return v_formatseq;
END;

================================

 

--2009-08-10
--将数据库中system用户与sys用户的表导出
   exp system/manager@TEST file=d:/daochu.dmp owner=(system,sys)
   exp hunt/hunt file=/soft/hunt.dmp owner=hunt;
--导入数据
imp pcisv62/11@ORCL file="d:/pcisv62081226.dmp"  ignore=y
imp hunt/hunt file="g:/hunt.dmp" ignore=y
/*
exp/imp已经很好用了,但是唯一的确定是速度太慢,如果1张表的数据有个百千万的,常常导入导出就长时间停在这个表这,但是从Oracle 10g开始提供了称为数据泵新的工具expdp/impdp,它为Oracle数据提供高速并行及大数据的迁移。
 imp/exp可以在客户端调用,但是expdp/impdp只能在服务端,因为在使用expdp/impdp以前需要在数据库中创建一个Directory
create directory dump_test as '/u01/oracle10g';
grant read, write on directory dump_test to piner
然后就可以开始导入导出
expdp piner/piner directory=dump_test dumpfile=user.dmp  导出用户的数据
expdp piner/piner directory=dump_test dumpfile=table.dmp tables=test1,test2 导出表数据

impdp piner/piner directory=dump_test dumpfile=user.dmp 导入该用户数据
impdp piner/piner directory=dump_test dumpfile=table.dmp  导出表数据
*/

你可能感兴趣的:(oracle,system,数据库,file,function,cache)