以system或其他管理员登录 创建Oracle管控目录
CREATE DIRECTORY hc_name_data_dir AS 'c:\ora\external\hc_name\';
CREATE DIRECTORY hc_name_log_dir AS 'c:\ora\external\hc_name\'; 确认
SELECT * from dba_directories WHERE directory_name like '%HC%'; 授予目录相应权限给需要创建外部表的用户
GRANT WRITE ON DIRECTORY hc_name_log_dir TO scott;
GRANT READ ON DIRECTORY hc_name_data_dir TO scott; 确认
SELECT * from dba_tab_privs WHERE table_name like '%_DIR' AND grantee = 'SCOTT'; 以该用户身份登录,如例中的scott 创建外部管理表
CREATE TABLE name(id number(6), firstname VARCHAR2(100), surname VARCHAR(36)) ORGANIZATION EXTERNAL(TYPE oracle_loader DEFAULT DIRECTORY HC_NAME_DATA_DIR ACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII BADFILE 'HC_NAME_LOG_DIR' : 'name.bad' LOGFILE 'HC_NAME_LOG_DIR' : 'name.log' FIELDS TERMINATED BY " " OPTIONALLY ENCLOSED BY '\t') LOCATION ('name.txt')) REJECT LIMIT UNLIMITED; 确认
SELE ......
导出. 想要导出其他用户的对象需要有EXP_FULL_DATABASE角色
exp 用户名/密码 file=路径 tables=(表名1,表名2,...) 导入. 想要导入其他用户的对象需要有IMP_FULL_DATABASE角色
imp 用户名/密码 file=路径 数据泵导出
a.) 只能导出到Oracle管控目录. 可以使用默认的DATA_PUMP_DIR
b.) 查询DATA_PUMP_DIR信息. 可以看到对应具体的物理路径.
SELECT * from dba_directories WHERE directory_name = 'DATA_PUMP_DIR';
c,.) 授权将要导出的用户,相应目录的权限
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO scott;
d.) 将参数写入一个文件好方便使用.如写入到c:\para.txt
DIRECTORY=DATA_PUMP_DIR
tables=tables=(表名1,表名2,...)
DUMPFILE=scott.dmp
QUERY=scott.表名1:"WHERE 条件"
e.) 运行
expdp 用户名/密码 parfile=c:\para.txt ......
经常使用oracle10g,我们可以发现以前删除的表在数据库中出现了特别多的垃圾表,如下例:
BINjR8PK5HhrrgMK8KmgQ9nw==
这一类的表通常无法删除,并且无法用"delete"删除,这种情况的出现,
一般不会影响正常的使用,但是有遇到以下几种情况时则必须删掉它。
◆1.这些表占用空间
◆2.如果使用Middlegen-Hibernate-r5的朋友会发现一些问题[问题描述:在运行ant build.xml会出现ORA-01424: 转义符之后字符缺失或非法],不你象以前用oracle9时那么顺的生成hibernate配置文件,原因就在这里将它删除就没有问题了.
◆3.其它情况
BINjR8PK5HhrrgMK8KmgQ9nw==
这一类的表是是10g 的新特性。
Drop Table 后,没有真正的删除表,而是在“垃圾站”中了。可以通过下面看到。
SQL> SHOW RECYCLEBIN
如果要彻底删除,可以使用:
SQL> PURGE TABLE "BINjR8PK5HhrrgMK8KmgQ9nw==";
删除这一个或删除全部。
SQL> PURGE RECYCLEBIN;
......
确认闪回启用中
SHOW PARAMETER RECYCLEBIN; 启用闪回
ALTER SYSTEM SET RECYCLEBIN = ON; 闪回DROP的表
FLASHBACK TABLE xxx TO BEFORE DROP; 彻底清除DROP的表,将不能再闪回.
PURGE TABLE xxx; 直接彻底DROP掉表
DROP TABLE xxx PURGE; 清空所有DROP的表
PURGE RECYCLEBIN; 确认最大可闪回多久(秒数)之前的DML操作.(不保证)
SHOW PARAMETER undo_retention; 改变最大可闪回多久之前的DML操作
ALTER SYSTEM SET undo_retention = 7200; 闪回误DML操作.以误操作emp表job字段为例
a.)确认相应的xid
SELECT versions_xid, job from emp VERSIONS BETWEEN SCN minvalue AND maxvalue;
b.)确认相应需要执行的SQL语句. 即是下面查询结果集的UNDO_SQL字段的内容
SELECT operation, start_scn, undo_sql from flashback_transaction_query WHERE xid = hextoraw('来自上一查询的xid');
c1.)执行相应的SQL语句. 本方法比较准确,不会影响之后发生的其他字段的变化.
c2.)不方便执行上一方法时,执行以下语句.注意在相应操作之后表中发生的所有操作都将被回复. ......
在ETL过程中,经常会碰到取结果集的最后或最前一条记录。如取活期存款的当前利率,开户金额,协定利率等。如果不用LOOKUP的方式,如通过游标取或者ETL工具LOOKUP组件什么的,在一条SQL里实现,目前实现有几种方法。
1.以时间或其他字段分组后在自连自己,这样不仅可以带出需要LOOKUP的字段,还可以带出其他需要的字段。
SELECT A.CDDPTY CDDPTY,A.CDCURR CDCURR,A.CDVLDT CDVLDT,
A.CDYRAT CDYRAT
from DCPPDATA.TBBFMCDRT A INNER JOIN
(SELECT B.CDDPTY,B.CDCURR,MAX(B.CDVLDT) CDVLDT
from DCPPDATA.TBBFMCDRT B
GROUP BY B.CDDPTY, B.CDCURR) C
ON A.CDDPTY =C.CDDPTY   ......
在ETL过程中,经常会碰到取结果集的最后或最前一条记录。如取活期存款的当前利率,开户金额,协定利率等。如果不用LOOKUP的方式,如通过游标取或者ETL工具LOOKUP组件什么的,在一条SQL里实现,目前实现有几种方法。
1.以时间或其他字段分组后在自连自己,这样不仅可以带出需要LOOKUP的字段,还可以带出其他需要的字段。
SELECT A.CDDPTY CDDPTY,A.CDCURR CDCURR,A.CDVLDT CDVLDT,
A.CDYRAT CDYRAT
from DCPPDATA.TBBFMCDRT A INNER JOIN
(SELECT B.CDDPTY,B.CDCURR,MAX(B.CDVLDT) CDVLDT
from DCPPDATA.TBBFMCDRT B
GROUP BY B.CDDPTY, B.CDCURR) C
ON A.CDDPTY =C.CDDPTY   ......
Oracle中如何用一条SQL快速生成10万条测试数据
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,
那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法。
产生测试数据的SQL如下:
SQL> select rownum as id,
2 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
3 trunc(dbms_random.value(0, 100)) as random_id,
4 dbms_random.string('x', 20) as random_string
5 from dual
6 connect by level <= 10;
ID INC_DATETIME RANDOM_ID RANDOM_STRING
---------- ------------------- ---------- --------------------------------------------------------------------------------
......
Oracle中如何用一条SQL快速生成10万条测试数据
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,
那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法。
产生测试数据的SQL如下:
SQL> select rownum as id,
2 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
3 trunc(dbms_random.value(0, 100)) as random_id,
4 dbms_random.string('x', 20) as random_string
5 from dual
6 connect by level <= 10;
ID INC_DATETIME RANDOM_ID RANDOM_STRING
---------- ------------------- ---------- --------------------------------------------------------------------------------
......