下面是小编为大家收集的ORACLE的查询练习,本文共7篇,仅供参考,欢迎大家阅读,希望可以帮助到有需要的朋友。

篇1:ORACLE的查询练习

emp 员工表(empno 员工号/ename 员工姓名/job 工作/mgr 上级编号/hiredate 受雇日期/sal 薪金

/comm 佣金/deptno 部门编号)

dept 部门表(deptno 部门编号/dname 部门名称/loc 地点)

工资= 薪金+ 佣金

1.列出至少有一个员工的所有部门,

2.列出薪金比“SMITH”多的所有员工。

3.列出所有员工的姓名及其直接上级的姓名。

4.列出受雇日期早于其直接上级的所有员工。

5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

6.列出所有“CLERK”(办事员)的姓名及其部门名称。

7.列出最低薪金大于1500 的各种工作。

8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。

9.列出薪金高于公司平均薪金的所有员工。

10.列出与“SCOTT”从事相同工作的所有员工。

11.列出薪金等于部门30 中员工的薪金的所有员工的姓名和薪金。

12.列出薪金高于在部门30 工作的所有员工的薪金的员工姓名和薪金。

13.列出在每个部门工作的员工数量、平均工资和平均服务期限。

14.列出所有员工的姓名、部门名称和工资。

15.列出所有部门的详细信息和部门人数。

16.列出各种工作的最低工资。

17.列出各个部门的MANAGER(经理)的最低薪金。

18.列出所有员工的年工资,按年薪从低到高排序。

--------1----------

select dname from dept where deptno in(

select deptno from emp);

--------2----------

select * from emp where sal>(

select sal from emp where ename='SMITH');

--------3----------

select a.ename,(

select ename from emp b where b.empno=a.mgr) as bossname from emp a;

--------4----------

select a.ename from emp a where a.hiredate<(

select hiredate from emp b where b.empno=a.mgr);

--------5----------

select a.dname,b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,bm,b.deptno

from dept a left join emp b on a.deptno=b.deptno;

--------6----------

select a.ename,b.dname from emp a join dept b

on a.deptno=b.deptno and a.job='CLERK';

--------7----------

select distinct job as HighSalJob from emp group by job having min(sal)>1500;

--------8----------

select ename from emp where deptno=(

select deptno from dept where dname='SALES');

--------9----------

select ename from emp where sal>(

select avg(sal) from emp);

--------10---------

select ename from emp where job=(

select job from emp where ename='SCOTT');

--------11---------

select a.ename,a.sal from emp a where a.sal in (

select b.sal from emp b where b.deptno=30) and a.deptno30;

--------12---------

select ename,sal from emp where sal>(

select max(sal) from emp where deptno=30);

--------13---------

select

(select b.dname from dept b where a.deptno=b.deptno) as deptname ,

count(deptno) as deptcount,

avg(sal) as deptavgsal

from emp a group by deptno;

--------14---------

select

a.ename,

(select b.dname from dept b where b.deptno=a.deptno) as deptname,

sal

from emp a;

--------15---------

select

a.deptno,

a.dname,

a.loc,

(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) as deptcount

from dept a;

--------16---------

select job,avg(sal) from emp group by job;

--------17---------

select deptno,min(sal) from emp where job='MANAGER' group by deptno;

--------18---------

select ename,(sal+nvl(comm,0))*12 as salpersal from emp order by salpersal;

ORACLE 子句查询,分组等

A.同表子查询作为条件

a. 给出人口多于Russia(俄国)的国家名称SELECT name FROM bbc

WHERE population>

(SELECT population FROM bbc

WHERE name='Russia')

b.给出'India'(印度), 'Iran'(伊朗)所在地区的所有国家的所有信息SELECT * FROM bbc

WHERE region IN

(SELECT region FROM bbc

WHERE name IN ('India','Iran'))

c.给出人均GDP 超过'United Kingdom'(英国)的欧洲国家. SELECT name FROM bbc

WHERE region='Europe' AND gdp/population >

(SELECT gdp/population FROM bbc

WHERE name='United Kingdom')

d.这个查询实际上等同于以下这个:

select e1.ename from emp e1,(select empno from emp where ename = 'KING') e2 whe

re e1.mgr = e2.empno;

你可以用EXISTS 写同样的查询,你只要把外部查询一栏移到一个像下面这样的子查询环境

中就可以了:

select ename from emp e

where exists (select 0 from emp where e.mgr = empno and ename = 'KING');

当你在一个WHERE 子句中写EXISTS 时,又等于向最优化传达了这样一条信息,即你想让外

部查询先运行,使用每一个值来从内部查询(假定:EXISTS=由外而内)中得到一个值,

B.异表子查询作为条件

a.select * from studentExam where studentid=( select studentid from student whe

re name='吴丽丽');

b.select * from studentexam where studentid in (

select studentid from student) order by studentid;

c.select * from student where studentid in (select studentid from studentexam w

here mark>80);

3.select studentexam.mark,studentexam.studentid as seid, student.studentid,stud

ent.name from studentexam,student where student.studentid=studentexam.studentid;

过滤分组:

顺序为先分组,再过滤,最后进行统计(实际值).

select studentid,count(*) as highpasses from studentexamwhere mark>70group by s

tudentid;

假使我们不想通过数据表中的实际值,而是通过聚合函数的结果来过过滤查询的结果.

select studentid,avg(mark) as averagemarkfrom studentexamwhere avg(mark)<50 or

avg(mark)>70group by studentid;(此句错误,where 句子是不能用聚合函数作条件的)此

时要用having.

select studentid,avg(mark) from studentexam group by studentid having avg(mark)

>70 or avg(mark)<50;

select studentid,avg(mark) from studentexam where studentid in(1,7,9,5)group by

studentid having avg(mark)>70;(先分组,再过滤,再having 聚合,最后再统计).

select studentid ,avg(mark) as averagemarkfrom studentexamwhere examid in(5,8,1

1)group by studentidhaving avg(mark)<50 or avg(mark)>70;

返回限定行数查询:

select name from student where rownum<=10;

oracle 中使用rownum 关键字指定,但该关键字必须在where 子句中与一个比较运算符一起

指定,而不能与order by 一起配合便用,因为rownum 维护的是原始行号.如果需要用group

by\order by 就用子句查询作表使用的方法:

select studentid,averagemark from(select studentid,avg(mark) as averagemarkfrom

studentexamgroup by studentid order by averagemark desc)where rownum<=10;

篇2:oracle层次查询

1 定义:

层次查询使用树的遍历,走遍含树形结构的数据集合,来获取树的层次关系报表的方法

树形结构的父子关系,你可以控制:

① 遍历树的方向,是自上而下,还是自下而上

② 确定层次的开始点(root)的位置

层次查询语句正是从这两个方面来确定的,start with确定开始点,connect by确定遍历的方向

2 语法:

注释:

① level是伪列,表示等级

② from后面只能是一个表或视图,对于from是视图的,那么这个view不能包含join

③ Where条件限制了查询返回的行,但是不影响层次关系,属于将节点截断,但是这个被截断的节点的下层child不受影响

④ prior是个形容词,可放在任何地方

⑤ 彻底剪枝条件应放在connect by;单点剪掉条件应放在where子句,但是,connect by的优先级要高于where,也就是sql引擎先执行connect by

⑥ 在start with中表达式可以有子查询,但是connect by中不能有子查询

3 遍历树:

㈠ Start with子句

Start with确定将哪行作为root,如果没有start with,则每行都当作root,然后查找其后代,这不是一个真实的查询。Start with后面可以使用子查询或者任何合法的条件表达式

例子:

[sql]

select level,id,manager_id,last_name,title from s_emp

start with title=(select title from s_emp where manager_id is null)

connect by prior id=manager_id;

㈡ Connect by子句

Connect by与prior确定一个层次查询的条件和遍历的方向(prior确定)

Connect by prior column_1=column_2;

其中prior表示前一个节点的意思,可以在connect by等号的前后,列之前,也可以放到select中的列之前

Connect by也可以带多个条件,比如 connect by prior id=manager_id and id>10

1. )自顶向下遍历:

先由根节点,然后遍历子节点。column_1表示父key,column_2表示子key。即这种情况下:connect by prior 父key=子key表示自顶向下,等同于connect by 子key=prior 父key.

例子:

[sql]

select level,employee_id,manager_id,last_name,job_id from s_emp

start with manager_id=100

connect by employee_id=prior manager_id;

2. )自底向上遍历:

先由最底层的子节点,遍历一直找到根节点。与上面的相反。Connect by之后不能有子查询,但是可以加其他条件,比如加上and id !=2等。这句话则会截断树枝,如果id=2的这个节点下面有很多子孙后代,则全部截断不显示。

例子:

[sql]

select level,employee_id,manager_id,last_name,job_id from s_emp

start with manager_id=100

connect by prior employee_id=manager_id and employee_id120;

4 使用level和lpad格式化报表:

Level是层次查询的一个伪列,如果有level,必须有connect by,start with可以没有

Lpad是在一个string的左边添加一定长度的字符,并且满足中间的参数长度要求,不满足自动添加

例子:

[sql]

select level,employee_id,manager_id,lpad(last_name,length(last_name)+(level*4)-4,'_'),job_id from s_emp

start with manager_id=100

connect by prior employee_id=manager_id and employee_id120

5 修剪branches:

where子句会将节点删除,但是其后代不会受到影响,connect by 中加上条件会将满足条件的整个树枝包括后代都删除。要注意,如果是connect by之后加条件正好条件选到根,那么结果和没有加一样

6 实际应用

1)查询每个等级上节点的数目

[sql]

先查看总共有几个等级:

select count(distinct level)

from s_emp

start with manager_id is null

connect by prior employee_id=manager_id

要查看每个等级上有多少个节点,只要按等级分组,并统计节点的数目即可,可以这样写:

select level,count(last_name)

from s_emp

start with manager_id is null

connect by prior employee_id=manager_id

group by level

2)查看等级关系

比如给定一个具体的员工看是否对某个员工有管理权

[sql]

select level,a.* from

s_emp a

where first_name='Douglas' --被管理的节点

start with manager_id is null --开始节点,即:根节点

connect by prior employee_id=manager_id

3)删除子树

比如有这样的需求,现在要裁员,将某个部门的员工包括经理全部裁掉

将id为2的员工管理的所有员工包括自己删除

[sql]

delete from s_emp where employee_id in(

elect employee_id from

s_emp a

start with employee_id=2 --从id=2的员工开始查找其子节点,把整棵树删除

connect by prior employee_id=manager_id)

4)找出每个部门的经理

[sql]

select level,a.* from

s_emp a

start with manager_id is null

connect by prior employee_id=manager_id and department_id !=prior department_id;--当前行的dept_id不等于前一行的dept_id,即每个子树中选最高等级节点

5)查询一个组织中最高的几个等级

[sql]

select level,a.* from

s_emp a

where level <=2 –查找前两个等级

start with manager_id is null

connect by prior employee_id=manager_id and department_id !=prior department_id;

6)合计层次

有两个需求,一是对一个指定的子树subtree做累加计算salary,一是将每行都作为root节点,然后对属于这个节点的所有子节点累加计算salary,

[sql]

第一种很简单,求下sum就可以了,语句:

select sum(salary) from

s_emp a

start with id=2—比如从id=2开始

connect by prior id=manager_id;

第2个需求,需要用到第1个,对每个root节点求这个树的累加值,然后内部层次查询的开始节点从外层查询获得。

select last_name,salary,(

select sum(salary) from

s_emp

start with id=a.id –让每个节点都成为root

connect by prior id=manager_id) sumsalary

from s_emp a;

7)找出指定层次中的叶子节点

Leaf(叶子)就是没有子孙的孤立节点。Oracle 10g提供了一个简单的connect_by_isleaf=1,0表示非叶子节点

[sql]

select level,id,manager_id,last_name, title from s_emp

where connect_by_isleaf=1 –表示查询叶子节点

start with manager_id=2

connect by prior id=manager_id;

7 10g新特性:

① 使用SIBLINGS关键字排序

如果使用order by排序会破坏层次,在oracle10g中,增加了siblings关键字的排序

语法:order siblings by

它会保护层次,并且在每个等级中按expre排序

例子:

[sql]

select level,

employee_id,last_name,manager_id

from s_emp

start with manager_id is null

connect by prior employee_id=manager_id

order siblings by last_name;

② CONNECT_BY_ROOT

Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值

例子:

[sql]

select connect_by_root last_name root_last_name, connect_by_root employee_id root_id,

employee_id,last_name,manager_id

from s_emp

start with manager_id is null

connect by prior employee_id=manager_id

篇3:oracle 大数据量分页查询

(一)分页实现及性能

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用,

分页查询格式:

SELECT * FROM

(

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

WHERE ROWNUM <= 40

)

WHERE RN >= 21

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

SELECT * FROM

(

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

)

WHERE RN BETWEEN 21 AND 40

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对 于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率 要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO 一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

SELECT /*+ FIRST_ROWS */ * FROM

(

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

WHERE ROWNUM <= 40

)

WHERE RN >= 21

(二)Oracle Top n

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

WHERE ROWNUM <= 40

以上是oracle 实现top n的功能

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

WHERE ROWNUM between 2 and 100

总是返回空记录

原因:

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀,

举例说明:

例如表:student(学生)表,表结构为:

ID char(6)--学号

name VARCHAR2(10) --姓名

create table student (ID char(6), name VARCHAR2(100));

insert into sale values('01',‘张一’);

insert into sale values('200002',‘王二’);

insert into sale values('200003',‘李三’);

insert into sale values('200004',‘赵四’);

commit;

(1) rownum 对于等于某值的查询条件

如 果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因 为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

SQL>select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)

SQL>select rownum,id,name from student where rownum=1;

ROWNUM ID NAME

---------- ------ ---------------------------------------------------

1 200001 张一

SQL>select rownum,id,name from student where rownum =2;

ROWNUM ID NAME

---------- ------ ---------------------------------------------------

(2)rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum>n(n>1的自然数)这种条件依旧不成立,所以查不到记录

SQL>select rownum,id,name from student where rownum >2;

ROWNUM ID NAME

---------- ------ ---------------------------------------------------

那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>select * from(select rownum no ,id,name from student) where no>2;

NO ID NAME

---------- ------ ---------------------------------------------------

3 200003 李三

4 200004 赵四

SQL>select * from(select rownum,id,name from student)where rownum>2;

ROWNUM ID NAME

---------- ------ ---------------------------------------------------

(3)rownum对于小于某值的查询条件

如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum

篇4:oracle查询带有单引号的

一条查询语句

select * from table where a ='['0','女'],['1','男']';

后来通过查资料用chr(39)来转换单引号格式可以写成这样:

select '['||chr(39)||'0'||chr(39)||','||chr(39)||'女'||chr(39)||']'||

','||'['||chr(39)||'1'||chr(39)||','||chr(39)||'男'||chr(39)||']' translation from dual这样查询是没有问题的,所以得想办法将客户端参数转义。

String Strinfo=“['0','女'],['1','男']”;

StringBuffer str = new StringBuffer;

for(int i=0;i

{

String ss =Convert.ToString(Strinfo.charAt(i));

if(ss.equalsIgnoreCase(“[”)){

str.append(“'['||”);

}

else if(ss.equalsIgnoreCase(“'”)){

str.append(“chr(39)||”);

}

else if(ss.equalsIgnoreCase(“]”)){

if(i!=Strinfo.length()-1){

str.append(“']'||”);

}

else{

str.append(“']'”);

}

}

else{

str.append(“'”+Strinfo.charAt(i)+“'||”);

}

}

通过以上方法我们就可以查询了,

select * from table where a in (select '['||chr(39)||'0'||chr(39)||','||chr(39)||'女'||chr(39)||']'||

','||'['||chr(39)||'1'||chr(39)||','||chr(39)||'男'||chr(39)||']' translation)

篇5:有关Oracle 数据库连接查询SQL语句

内连接(inner join)。

外连接:

全连接(full join)、左连接(left join)、右连接(right join)。

交叉联接(cross join)。

外连接与内连接不一样,外连接返回的查询结果中不仅包含符合条件的行,还包括左表(左外连接),右表(右外连接)或者两个连接表(全外连接)中的所有不符合条件的数据行。

1.左连接 (left [outer] join)

左外连接就是将左表的所有数据分别于右表的每条数据进行连接组合,返回的结果除内连接的数据外,还有左表中不符合条件的数据,并在右表的相应列中填上null值。

SQL语句如下:

select * from mt_pb_org o left join mt_pb_orgframe f on o.PB_ORGFRAMEID = f.PB_ORGFRAMEID;

等价语句:

select * from mt_pb_org o,mt_pb_orgframe f where o.pb_orgframeid = f.pb_orgframeid(+);

2.右连接 (right [outer] join)

右外连接就是将右表中的所有数据分别与左表的每条数据进行连接组合,返回的结果除了内连接的数据外,还有右表中不符合条件的数据,并在左表相应的列中填上null值。

SQL语句如下:

select * from mt_pb_org o right join mt_pb_orgframe on o.pb_orgframeid = f.pb_orgframeid;

等价语句:

select * from mt_pb_org o,mt_pb_orgframe f where o.pb_orgframeid(+) = f.pb_orgframeid;

3.全外连接 (full [outer] join)

全外连接就是将左表的所有数据分别与右表的每条数据进行连接组合,返回的结果除了内连接的数据外,还有两个表中不符合条件的数据,并在左表或者右表的相应列中填上null值。

SQL语句如下:

select * from mt_pb_org o full join mt_pb_orgframe o.pb_orgframeid = f.pb_orgframeid;

4.交叉连接(cross join)

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

SQL语句如下:

select * from mt_pb_org o cross join mt_pb_orgframe f;

篇6:Oracle跨服务器查询插入数据

想实现insert into 当前库表 select 远程库中的表数据这种方式的数据同步,于是配置了一下oracle服务,远程和本地服务都是oracle

一、在当前库中插入数据

create public database link remotedb connect to username identified by password using 'db';

create public database link curdb connect to username identified by password using 'curdb';

其中db,curdb是配置的别名【注意,这个需要配置在服务器端的tnsnames.ora中,如果是配置在客户端的tnsnames.ora中,则会报TNS:无法解析指定的连接标示符】

二、接下来就可以直接写语句了

insert into tb@curdb(field)

select field from tb@remotedb where rownum<=3

这个配置关键是tnsnames.ora需要配置在服务器端,不要在客户端

篇7:Oracle跨数据库查询并插入

Oracle跨数据库查询并插入

工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数据库服务器都是远程的!我的实现方法是在本地使用PL/SQL操作两个远程服务器,实现方式如下: 

1.

为你需要操作的远程数据库服务器建立本地服务名:

在本地数据库安装文件中,找到$ORACLE_HOME/network/admin/tnsnames.ora文件,

末尾添加

--第一个远程服务器的服务名:MYORACLE1

MYORACLE1 =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 221.131.228.256)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = orcl)

)

)

--第一个远程服务器的服务名:MYORACLE2

MYORACLE2 =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 211.161.192.46)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = orcl)

)

)

--如果有更多的远程数据库需要同时操作,可以依次增加!

--如果本机用的Windows操作系统,可以使用Oracle自带的Net Manager 工具,以图形化的操作方式来建立服务名!

2.

在本机上使用sysdba的角色登录本地数据库,创建database link:

执行如下sql语句:

--远程服务器一的对应database link

create public database link MYDBLINK1 --可以随便取名,当然,不能是关键字或保留字

connect to dbUserName1 identified by dbpwd1

using ' MYORACLE1';

--远程服务器二的对应database link

create public database link MYDBLINK2 --可以随便取名,当然,不能是关键字或保留字

connect to dbUserName2 identified by dbpwd2

using ' MYORACLE2';

--其中using后面填对应的数据库服务名,dbUserName1,dbpwd1填对应的数据服务器登录名,密码

--删除database link

Drop database link MYDBLINK1; --本例中是MYDBLINK1和MYDBLINK2

3.

操作远程服务器上的表,在要在对应的表后面加上@ linkName(对应的数据库链接名),就跟操作本地数据库中的表差不多,可以从不同数据库服务器中提取数据!很方便!

insert into GIS_WEICHAI_DATA_1S@MYDBLINK1 select * from GIS_WEICHAI_DATA_1S@ MYDBLINK2 where rownum<=10000;

4.

如果需要频繁的使用远程服务器中的表,上面的写法有点烦人,这时候可以考虑为这个表创建一个同义词

create synonym syName for GIS_WEICHAI_DATA_1S@MYDBLINK1;

以后在要使用GIS_WEICHAI_DATA_1S@MYDBLINK1的时候用syName就可以了!

删除同义词的语法为:

drop synonym syName;

5.

查看当前数据库的DB Link;

select * from user_db_links; --用户 DB Link

select * from dba_db_links; --dba DB Link

select * from v$dblink;   --当前DB Link

更多推荐

ORACLE的查询练习