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 导出表数据
*/