您的位置:首页 > 数据库 > Oracle

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

2009-08-10 21:37 375 查看
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 导出表数据
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: