imp到不同的tablespace中
关于把dmp导入到不同的表空间中conn ashuang/ashuangselect * from user_tables where table_name='DAVE'此时ashuang.dave的tablespace是ycupexp shuang/ashuang tables=dave file=d:test.dmp 创建user abc用来测试create user abc identified by ashuangdefault tablespace userstemporary tablespace tempgrant dba to abc --注意dba的role中包含了unlimited tablespace的权限imp ashuang/ashuang fromuser=ashuang touser=abc file=d:test.dmpselect * from dba_tables where table_name='DAVE' and owner='ABC'此时的abc.dave的tables
唯一索引和“隐藏”约束
创建unique index还会隐藏的创建约束条件吗,create table inf_stat_test as select no,org_id from inf_statcreate unique index inf_stat_index on inf_stat_test(no)此时inf_stat_test没有inf_stat_index这项约束,而且没有任何关于主键和唯一键的约束。select * from dba_constraints where constraint_name='INF_STAT_INDE没有任何数据行,oracle数据字典视图认为不存在此项约束。'insert into inf_stat_test values('asdf','sdfg')但是当我连续插入两次同样的no值后,oracle居然违反唯一约束inf_stat_index。但是查看dba_constraints
merge into只扫描一次table。
oracle merge into详细介绍今天一看见sql中还有merge into的sql使用,查过资料是oracle9I新增的语法,主要是用于合并update和insert语句,由于update要带来一次全表扫描,insert又来带来一次全表的扫描merge into则可以解决上述问题,让表只进行一次扫描基本语法就是merge into table1 ausing table2 bon (a.col1=b.col2)when matched thenupdate set when not matched theninsert values现在来看看上面的一堆sql是什么意思,首先merge into是需要更新的table1,using是用来对比的关联表,on用于两张表的关联条件。下面的两个when matched
lead和lag函数
lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合select id,name from daveid name4 SF3 oracle4 eygle5 rman4 exportdave表中有id和name的数据。lag函数是取出数据的前n行的数据,lead函数是取出数据的后n行的数据,直接在例子吧,简单明了select id,name,lag(id,4) over (order by id) as v_ab from daveid name v_ab3 oracle 4 export 4 SF 4 eygle5 rman 3lag(id,n,values)才是整个lag的完整形式,其中的id是column_name,n就是前n行的,values就是缺省的值,如果省略n和values,默认n是1,va
数据磊原理和工具
今天个人使用expdp和impdp弄了几个小时,终于整理出大概,对于数据磊工具的原理整理出下面的心得。expdp/impdp是通过API调用,把传统的exp和imp交互模式的操作转化为oracle内部的job来完成,所以可以实现任务的中止和重启动.oracle10g中出现了数据磊,数据磊的所有工作都由数据库实例来完成,数据库可以并行来处理这些工作。可以建立多个数据磊进程来读写正在导入的数据,也可以建立并行I/O服务器进程来读取数据,从而exp和imp的单进程瓶颈得到解决expdp impdp和exp imp的不同点除了可控制job还有局限于数据磊工具必须在服务器端运行。因为
绑定变量在静态sql和动态sql中
关于oracle的中绑定变量oracle中的sql分为静态和动态sql,静态sql是已经编译成功直接执行的sql,动态sql在程序执行时才进行编译。ITPUB一个版主提到oracle的所有静态sql都是软解析,动态sql可以由程序设计者来掌握是否是软解析和硬解析。依个人来看前半句可能需要实践后半句确实是存在的,下面的代码中我就利用动态sql来让sql使用绑定变量来进行软解析。动态sql比静态sql灵活可以解决静态sql无法解决的问题,比如对数据字典的读取。oracle中的sql的执行计划:在shared pool中查找是否有sql的缓存明确的应该是在库缓存中查找,库缓存中保留
动态sql和利用动态sql解决数据字典的读取
oracle中的动态sql的一些理解,动态sql通俗说也就是执行的时候才去检查的sql。dml语句可以在pl/sql程序中加载,但是ddl语句是无法在pl/sql中执行的,这个时候就可以使用动态sql来完成ddl语句和不确定的dml语句。首先在oracle数据库开发pl/sql程序中的sql分为:静态sql语句和动态sql语句。静态sql语句是在程序编译期间就明确的,执行的是确定的对象,而动态sql在pl/sql程序编译时sql语句是不确定的。编译程序对动态语句部分不进行处理,只在程序运行时动态创建语句并分析语法然后执行。procedure中包含动态sql执行ddl语句create or replace
logminer工具对redo log或archive log的挖掘
oracle中可能需要对数据库中产生的redo log和archive log进行日志挖掘,来更好查看数据库的内部信息,此时oracle提供了logminer来对日志文件进行挖掘。挖掘的具体步骤:oracle10g中的logminer工具安装的脚本是:l $ORACLE_HOME/rdbms/admin/dbmslm.sql 2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql. logminer需要oracle的dbms_logmnr的package,如果系统包没有装好后面的步骤都处理不了,运行上述脚本,可以查询desc dbms_logmnrdesc dbms_logmnr_d查看具体的package的下面的procedure。1 设置utl_file_dir目录,主要用于服务器放置数据字典文
文本文件的数据装载工具sqlldr
--sqlldr使用简单说明 oracle中要把txt文件或者csv文件的数据导入到数据库表中,此时需要使用oracle一个自带的sqlldr工具。此时有test.txt文件1,2,32,3,53,5,6需要把txt的文件装载到oracle中的test_sqlldr表中此时我们优先创建一个测试用表test_sqlldrcreate table test_sqlldr(id_1 number,id_2 number,id_3 number);然后需要填写控制文件test.ctl,这个也是sqlldr工具使用最重要的部门load data infile "d:test.txt"append into table test_sqlldrfields terminated by ','trailing nullcols --txt(id_1,id_2 ,id_3)ctl文件填
imp中的indexfile参数解决imp指定表空间问题
exp和imp工具中可能存在把table从一个库exp然后imp到另一个数据库出现没有指定tablespace而无法imp,imp的indexfile参数中可以解决的imp userid/userid@service_name file=d:test.dmp tables=tablename indexfile=d:test.idx rows=n首先把dmp文件中的信息导入到d:test.idx中去,查看d:test.idx如下REM CREATE TABLE "ABC"."INDEXFILE_TEST" ("USER_ID" NUMBER(16, 0) NOT NULL REM ENABLE, "DEPT_ID" CHAR(32), "STAFF_CODE" VARCHAR2(200) NOT NULL REM ENABLE, "USER_NAME"
oracle中的递归sql查询 connect by prior实现递归
oracle中的递归sql查询,connect by prior实现递归可以使用start with...connect by子句递归查询一般用于一个表维护树形结构的应用table的具体columna b1 02 13 14 25 3如果想查找a=2及其下面的的所有数据,则:select a,b from table start with a=2 connect by prior a=b a b2 14 2其中也就是把a=2这条数据当做一个根目录开始递归查询。其中的connect by prior a=b中靠近prior的a则表示a是父节点,在另一侧表示子节点。接着找b能跟上一个父节点a相等的值也就是b=2的
公有私有synonym中的权限实际指向和dblink中global_names和权限封装
公有和私有同义词和数据库链路访问同义词主要是用于访问用户的对象的一种方式,特别是公有同义词可以省去别的user例如select * from user.tablename,dba最常用的做法就是先grant select username.tablename,然后建public synonym赋予相应的select synonym或者本表,其实就是授予select synonym也实际上授予的是本表如果同义词和本表的name相同,默认的是优先访问本表,然后私有同义词,最后公有同义词下面涉及到同义词的一些细节的地方都是本人测试的结果 oracle 10G 10.2.0drop public synonym r$user 删除public synonymdrop synonym r
update select用法
update seslect用法如果更新value是从一条select语法引出来,而且还有很多列,平常的update tablename set column_name=values where就很吃力了insert into table select * from tablename是可以同时插入对应table的多列的,其实update也是可以的表A id name 表B id_1 name_1 1 oracle 2 tkprof 2 dmp 3 sql_trace 3 logminer 1 autotrace利用表A的ID做链接更新表B的name_1为表A相对应的name,想使
remote_login_passwordfile和口令文件 远程管理员登录的关系
REMOTE_LOGIN_PASSWORDFILE参数增强系统的安全性,在此总结一下在REMOTE_LOGIN_PASSWORDFILE参数取不同值时的行为特性。REMOTE_LOGIN_PASSWORDFILE参数可以有三种取值:EXCLUSIVE(默认)、NONE和SHARED。1)当取值为EXCLUSIVE时,tom在9I和10I编程中exclusive提到是只有一个数据库使用一给定的密码文件sql>show parameter remote_login_passwordfile;默认的是exclusivealter system set remote_login_passwordfile=exclusive scope=spfilesql>conn sys/oracle@test as sysdbasql>grant sysdba to ashuangsql>revoke sysdba f
字典管理表空间DMT和本地管理表空间LMT
字典管理表空间是通过两个数据字典uet$和fet$管理,uet$数据字典中存储的是tablespace中已经使用extent,fet$中存储的是tablespace中空闲的extent,当segment中需要分配新的extent时,也就是需要建的segment或者一个segment需要分配新的extent时,oracle就会从fet$查找extent列表,找到的extent编号A吧用于新extent需求,马上这个编号A的extent中会写入uet$这个数据字典中;同样当删除一个segment或者从segment中移除一个extent时,先从uet$中删除extent记录然后插入到fet$中去。此种方式的发生过程是连续的,串行的,非常容易造成竞争和等