SQL Plus常用命令
1.set linesize 200
set linesize 可以设置一行的字符数,默认为80个字符
2.l(List)
可以显示缓存区中的最后执行的内容
3.run / r
重新运行缓存区中的语句
4.save
save可以将最后一次在缓存区中执行的语句保存到文件
5.get
get可以将文件中的sql语句放到缓存区中,采用/或r或run,可以执行
6.ed(edit)
ed可以采用记事本来编辑缓存区中的内容
7.如何直接执行sql脚本
@c:\emp.sql;
数据处理函数
Lower |
转换小写 |
upper |
转换大写 |
substr |
取子串 |
length |
取长度 |
trim |
去空格 |
to_date |
将字符串转换成日期 |
to_char |
将日期或数字转换成字符串 |
to_number |
将字符串转换成数字 |
nvl |
可以将null转换成一个具体值 |
case |
分支语句 |
decode |
同case |
round |
四舍五入 |
1.lower
l 查询员工,将员工姓名全部转换成小写
select lower(ename) from emp; |
2.expper
l 查询job为manager的员工
select * from emp where job=upper('manager'); |
3.substr
l 查询姓名以M开头所有的员工
select * from emp where substr(ename, 1, 1)=upper('m'); |
4.length
l 取得员工姓名长度为5的
select length(ename), ename from emp where length(ename)=5; |
5.rim
trim会去首尾空格,不会去除中间的空格
l 取得工作岗位为manager的所有员工
select * from emp where job=trim(upper('manager ')); |
6.to_date
l 查询1981-02-20入职的员工(第一种方法,与数据库的格式匹配上)
select * from emp where HIREDATE='20-2月 -81'; |
l 查询1981-02-20入职的员工(第二种方法,将字符串转换成date类型)
select * from emp where hiredate=to_date('1981-02-20', 'YYYY-MM-DD'); 等同 select * from emp where hiredate=to_date('1981-02-20 00:00:00', 'YYYY-MM-DD '); 默认为0时0分0秒 |
to_date可以将字符串转换成日期,具体格式to_date(字符串,匹配格式)
日期格式的说明
控制符(不区分大小写) |
说明 |
YYYY |
表示年 |
MM |
表示月 |
DD |
表示日 |
HH12,HH24 |
表示12小时制,表示24小时制 |
MI |
表示分 |
SS |
表示秒 |
7.to_char
l 查询1981-02-20以后入职的员工,将入职日期格式化成yyyy-mm-dd hh:mm:ss
select empno, ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') as hiredate from emp; |
8.to_number
将字符串转换成数值
select * from emp where sal>to_number('1,500', '999,999'); |
9.round
四舍五入
select round(2345343.1234, 2) from dual; |
Dual是oracle提供的,主要为了方便使用,因为select的时候需要用from
Group by
l 取得每个工作岗位的工资合计,要求显示岗位名称和工资合计
select job, sum(sal) from emp group by job; |
采用group by,聚合函数前面的所有字段必须参与分组
如果使用了order by,order by必须放到group by后面
分组语句
select job,deptno,sum(sal) from emp group by job,deptno; |
删除表中重复的行如:
num,qtt
1 3
2 5
3 6
1 6
3 0
2 5
4 9
删除后效果:
1 3
2 5
3 6
4 9
delete from tab1 t where t.rowid not in (select max(rowid) from tab1 t1 group by t1.num); |
如果想对分组数据再进行过滤需要使用having子句
取得每个岗位的平均工资大于2000
select job, avg(sal) from emp group by job having avg(sal) >2000; |
分组函数的执行顺序:
1、 根据条件查询数据
2、 分组
3、 采用having过滤,取得正确的数据
select语句总结:
一个完整的select语句格式如下
select 字段 from 表名 where ……. group by …….. having ……. order by …….. |
以上语句的执行顺序
1. 首先执行where语句过滤原始数据
2. 执行group by进行分组
3. 执行having对分组数据进行操作
4. 执行select选出数据
5. 执行order by排序
1、查询job包含MANAGER和包含SALESMAN的员工
select * from emp where job in('MANAGER', 'SALESMAN'); |
2.采用union来合并
select * from emp where job='MANAGER' union select * from emp where job='SALESMAN' |
l 查询部门编号为10和20的,去除薪水大于2000的(第一种方法)
select * from emp where deptno in(10, 20) and sal<=2000; |
l 查询部门编号为10和20的,去除薪水大于2000的(第二种方法,使用minus)
select * from emp where deptno in(10, 20) minus select * from emp where sal>2000 |
取五条记录
select rownum,e.* from emp e where rownum <=5; |
select * from emp where rownum > 5; |
以上语句,oracle不支持,oracle只支持rownum小于或小于等于的运算
select rownum,e.* from emp e where rownum <=5 order by e.sal desc; |
上面的结果不正确,因为采用order by不会改变rownum,rownum的值在数据插入到表中时已经形成,正确使用的方式,将排序好的数据作为一张表来使用,这样这个表的rownum是新形成的,所以可以保证它的顺序是正确的,如下
select rownum, a.* from (select * from emp order by sal desc) a where rownum<=5; |
分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置和结束位置,如每页两条数据:
第一页:记录1~2
第二页:记录3~4
。。。。。。。
因为rownum存在问题,所以需要采用三层的select嵌套完成分页,嵌套的目的将rownum转换成我们自己的字段,如:
select * from (select rownum r, t.* from (select * from emp ) t where rownum <=9) where r > 6; |
删除:
1.删除表结构:
drop table tableName;
2.清空表数据:
truncate table tableName
建立索引
如经常根据birthday进行查询,并且遇到了性能瓶颈,首先查看程序是否存算法问题,再考虑对birthday建立索引,建立索引如下:
create index idx_t_student_birthday on t_student(birthday); |
删除索引
drop index IDX_T_STUDENT_BIRTHDAY; |
主键建立后,会相应的为主键建立索引,所以根据主键查询,通常比普通字段快
如下示例:
select a.deptno, a.avg_sal, b.grade from (select deptno, avg(sal) avg_sal from emp group by deptno) a, salgrade b where a.avg_sal between b.losal and b.hisal; |
为什么使用视图?,因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题
create view v_dept_avg_sal_grade as select a.deptno, a.avg_sal, b.grade from (select deptno, avg(sal) avg_sal from emp group by deptno) a, salgrade b where a.avg_sal between b.losal and b.hisal; |
出现了没有权限创建视图,必须授予scott用户能够创建事务的权限
如何查询当前用户拥有的权限?
select * from session_privs; |
如何切换用户?
conn system/bjpowernode |
如何查看当前用户是什么?
show user |
如何让某个用户采用某种角色登录?
conn scott/tiger as sysdba; |
如何对scott用户授权?
切换到system系统
conn system/bjpowernode
为scott用户授权
grant create view to scott;
切换到scott用户
conn scott/tiger
查询scott用户拥有的权限
select * from session_privs;
序列是Oracle特有的,它可以维护一个自增的数字序列,通常从1开增长,但可以设置,例如:学生表t_student中的编号,可以采用Oracle的序列的方式来维护
还有一种经常使用的生成策略是Identity,如:Mysql/MS SQL Server
create sequence seq_student_id start with 1 increment by 1; |
使用序列
insert into t_classes(classes_id, classes_name) values(SEQ_STUDENT_ID.nextval, '603'); |
删除序列
drop sequence SEQ_STUDENT_ID; |
存储过程最直接的理解:就是保存了批量的sql(select,insert,if for),以后可以通过一个名字把这些批量的sql执行,使用存储过程在大批量数据查询或计算时会带来高性能,存储过程编写和调试比较复杂,不同数据库产品存储过程差异非常大,很难实现平滑一致
l 建立存储过程--查询
--使用游标创建查询返回单条记录的存储过程 create or replace procedure proc_test(in_var number,out_var out sys_refcursor) as begin open out_var for select * from emp where deptno=in_var; end; / --执行存储过程 var ret refcursor exec proc_test(20,:ret) print :ret
--使用游标创建查询所有数据的存储过程 create or replace procedure test(list in out sys_refcursor)is begin open list for select * from student; end; / --执行存储过程 variable x refcursor exec test(:x) --将结果集打印 print x;
--查询返回单条记录数据的存储过程 create or replace procedure test(in_id number)is s_name varchar2(10); begin select name into s_name from student where id=in_id; DBMS_OUTPUT.PUT_LINE(s_name); end test; / 执行存储过程 SER SERVEROUTPUT ON exe test(10);
l 建立存储过程--新增
create or replace procedure addrow(in_id number,in_name varchar2,in_age number,in_sex varchar2)is begin insert into student(id,name,age,sex)values(in_id,in_name,in_age,in_sex); end addrow; /
<p>执行存储过程</p><p>exec addrow(37,'Jelod',20,'男')</p>
使用循环在存储过程中循环添加19到30号数据 create or replace procedure addrow is i number; begin i:=19; while i<=30 loop i:=i+1; insert into student (id,name,age,sex)values(i,'Jeelon'||i,i,'g'||i); end loop; commit; end addrow; / exec addrow;
l 建立存储过程--修改
create or replace procedure modifyrow(in_id number,in_name varchar2,in_age number,in_sex varchar2)is begin update student set name=in_name,age=in_age,sex=in_sex where id=in_id; if SQL%found then dbms_output.put_line('successly excute'); commit; else dbms_output.put_line('error to excute'); end if; end modifyrow; / 执行存储过程 exec modifyrow(37,'天马',99,'男')
l 建立存储过程--删除
create or replace procedure delrow(in_id number)is begin delete from student where id=in_id; end delrow; / 执行存储过程 exec delrow(37)
触发器是特殊的存储过程,它与数据库的insert、update和delete相关联,如定义完成触发器之后,会在insert、update或delete语句执行前或执行后自动执行触发器中的内容
触发器示例,向emp表中加入数据,采用触发器自动再向t_log表里加入一条数据
l 首先建立t_log表
create table t_log ( log_id number(10) primary key, log_time date )
|
l 为建立t_log的主键建立sequence
create sequence seq_log_id start with 1 increment by 1; |
l 建立触发器
create or replace trigger tri_test after insert on emp begin insert into t_log(log_id, log_time) values(seq_log_id.nextval, sysdate); end;
|
l 向emp表中加入数据
insert into emp (empno, ename) values(9999, 'ls'); |
游标
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
二 类型
Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。
1. 隐式Cursor:
1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。
2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含:
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数
SQL%FOUND 布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
3) 隐式Cursor是系统自动打开和关闭Cursor.
2. 显式Cursor:
(1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含:
游标的属性 返回值类型 意 义
%ROWCOUNT 整型 获得FETCH语句返回的数据行数
%FOUND 布尔型 最近的FETCH语句返回一行数据则为真,否则为假
%NOTFOUND 布尔型 与%FOUND属性返回值相反
%ISOPEN 布尔型 游标已经打开时值为真,否则为假
(2) 对于显式游标的运用分为四个步骤:
定义游标---Cursor [Cursorü Name] IS;
打开游标---Open [Cursor Name];ü
操作数据---Fetch [Cursor name]ü
关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。ü
(3)以下是三种常见显式Cursor用法。
1. Set serveroutput on; 2. 3. declare 4. ---define Cursor 5. Cursor cur_policy is 6. select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account 7. from t_contract_master cm 8. where cm.liability_state = 2 9. and cm.policy_type = 1 10. and cm.policy_cate in ('2','3','4') 11. and rownum < 5 12. order by cm.policy_code desc; 13. curPolicyInfo cur_policy%rowtype;---定义游标变量 14. Begin 15. open cur_policy; ---open cursor 16. Loop 17. --deal with extraction data from DB 18. Fetch cur_policy into curPolicyInfo; 19. Exit when cur_policy%notfound; 20. 21. Dbms_Output.put_line(curPolicyInfo.policy_code); 22. end loop; 23. Exception 24. when others then 25. close cur_policy; 26. Dbms_Output.put_line(Sqlerrm); 27. 28. if cur_policy%isopen then 29. --close cursor 30. close cur_policy; 31. end if; 32. end; 33. 34. /
Ref Cursor(动态游标):
1) 与隐式Cursor,显式Cursor的区别:Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。而另外两种Cursor,是静态的,在编译期间就决定数据结果集。
2) Ref cursor的使用:
Type [Cursor type name] is ref cursorü
Define 动态的Sql语句ü
Open cursorü
操作数据---Fetch [Cursor name]ü
Close Cursorü
1. Set serveroutput on; 2. 3. Declare 4. ---define cursor type name 5. type cur_type is ref cursor; 6. cur_policy cur_type; 7. sqlStr varchar2(500); 8. rec_policy t_contract_master%rowtype; 9. begin 10. ---define 动态Sql 11. sqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cm 12. where cm.liability_state = 2 13. and cm.policy_type = 1 14. and cm.policy_cate in (2,3,4) 15. and rownum < 5 16. order by cm.policy_code desc '; 17. ---Open Cursor 18. open cur_policy for sqlStr; 19. loop 20. fetch cur_policy into rec_policy.policy_code, rec_policy.applicant_id, rec_policy.period_prem,rec_policy.bank_code,rec_policy.bank_account; 21. exit when cur_policy%notfound; 22. 23. Dbms_Output.put_line('Policy_code:'||rec_policy.policy_code); 24. 25. end loop; 26. close cur_policy; 27. 28. end; 29. /
我们有时采用select会返回一个结果集,使用简单的select无法得到上一行,下一行,后5行,后10行,如果想做到这一点必须使用游标,游标是存储在数据库服务器上的一个数据库查询,它不是一条select语句,他是一个结果集,有了游标就可以根据需要滚动浏览数据了
下面通过一个示例,根据岗位加工资,如果是MANAGER增加20%的工资,如果是SALESMAN增加10%的工资,其他的增加5%的工资
create or replace procedure proc_sal is cursor c is select * from emp for update; begin for v_emp in c loop if (v_emp.job = 'MANAGER') then update emp set sal = sal + sal*0.2 where current of c; elsif (v_emp.job = 'SALESMAN') then update emp set sal = sal + sal*0.1 where current of c; else update emp set sal = sal + sal*0.05 where current of c; end if; end loop; commit; end; --执行存储过程 exec proc_sal;
while循环
declare i number; begin i:=0; while i<10 loop i:=i+1; dbms_output.put_line('循环的次数是:'||i); end loop; end; /
for循环
begin for i in reverse 1..20 loop --reverse 表示由大到小 不加reverse表示默认:由小到大循环 dbms_output.put_line('for循环:'||i); end loop; end; /
常用的DBA命令
查看用户拥有的数据库对象
select object_name from user_objects; |
查看约束信息
select constraint_name from user_constraints; |
查看用户拥有的表
select table_name from user_tables; select * from tab; |
查看用户拥有的视图
select view_name from user_views; |
查看用户拥有的触发器
select trigger_name from user_triggers; |
查看用户拥有的序列
select sequence_name from user_sequences; |
查看用户拥有的存储过程
select object_name from user_procedures; |
查看用户拥有的索引
select index_name from user_indexes; |
显示当前用户
show user; |
conn system/bjpowernode; |
将用户赋予某种角色登录
查看所有的用户
conn system/bjpowernode select username from dba_users; |
查看用户拥有的权限
select * from session_privs; |
常用权限
CREATE SESSION |
连接数据库 |
CREATE TABLE |
创建表 |
CREATE VIEW |
创建视图 |
CREATE SEQUENCE |
创建序列 |
CREATE PROCEDURE |
创建存储过程 |
CREATE TRIGGER |
创建触发器 |
CREATE INDEXTYPE |
创建索引 |
UNLIMITED TABLESPACE |
对表空间的使用 |
给用户加锁
alter user scott account lock; |
给用户解锁
alter user scott account unlock; |
修改用户密码
alter user scott identified by test123;
新建用户
create user bbs identified by bbs123; |
删除用户及相关对象
drop user test1 cascade; |
给用户授权(多个采用逗号间隔)
grant create session, create table to bbs; |
分配表空间usres给用户
create table t_test(id number(10), name varchar2(30)) |
以上出现无法创建表,主要原因在于没有分配表空间,也就是我们新建的表不知道放到什么地方。
alter user bbs default tablespace users; |
授权表空间给用户
grant UNLIMITED TABLESPACE to bbs; |
导入和导出命令imp、exp
首先赋予该用户dba的权限然后:
如:将数据库文件.DMP导入到yishiyiyi2011数据库中
imp yishiyiyi2011/yishiyiyi@SID full=y file=fileLoad ignore=y
导出同理.
exp yishiyiyi2011/yishiyiyi@SID full=y file=fileLoad
注意:yishiyiyi2011 是我要导出的数据库
另一种方式:
将数据库TEST完全导出,用户名system密码manager导出到D:\daochu.dmp中exp system/manager@TEST file=d:\daochu.dmp full=y
将D:\daochu.dmp 中的数据导入TEST数据库中
imp system/manager@TEST file=d:\daochu.dmp
只有DBA才能执行完整数据库或表空间的导出
删除表空间以及相应的数据文件
drop tablespace xxxx including contents and datafiles;
查看各个表空间使用情况:
select b.tablespace_name, round(b.all_byte) all_byte, round(b.all_byte - a.free_byte) use_byte, round(a.free_byte) free_byte, 100 - round((a.free_byte / b.all_byte) * 100) percent from (select tablespace_name, sum(nvl(bytes, 0)) / 1024 / 1024 / 1024 free_byte from dba_free_space group by tablespace_name) a, (select tablespace_name, sum(nvl(bytes, 0)) / 1024 / 1024 / 1024 all_byte from dba_data_files group by tablespace_name) b where b.tablespace_name = a.tablespace_name(+) order by 5 desc, 1;
l 创建用户
create user bbs identified by bbs123; |
l 创建表空间
create tablespace ts_bbs datafile 'E:\bbs\bbs_data.dbf' size 100m; |
l 将表空间分配给用户
alter user bbs default tablespace ts_bbs; |
l 给用户授权
grant create session, create table, create view, create sequence, unlimited tablespace to bbs; |
l 以bbs登陆建立表,tt
create table tt( tt_id number(10) ); |
--判断是否存在表 select * from user_tables t where t.table_name = upper('diycolumn'); --判断是否存在表字段 select * from user_tab_columns t where t.table_name = upper('diycolumn') and t.column_name = upper('Columnid'); --判断是否存在主键 select * from user_constraints t where t.table_name =upper('diycolumn') and t.constraint_type = 'P';
/*根据内容查询存储过程、根据字段查询表明 互向*/
SELECT * FROM ALL_SOURCE where TYPE='PROCEDURE' AND TEXT LIKE '%insert into dqd_bsa_files_mid1%'; SELECT A.* FROM user_objects a where a.OBJECT_TYPE = 'TABLE'; SELECT A.* FROM all_tab_cols A where a.TABLE_NAME = 'DQD_BSA_FILES_ALL'; SELECT A.* FROM all_tables a where a.TABLE_NAME = 'DQD_BSA_FILES_ALL';
Oracle基础知识
一、数据库名
什么是数据库名?
数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:
DB_NAME=myorcl
...
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
数据库名的作用
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
跟踪文件目录:
winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。
同样,修改数据库结构的语句alter database, 当然也要指出要修改的数据库的名称。
如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。
还有在备份或恢复数据库时,都需要用到数据库名。
总之,数据库名很重要,要准确理解它的作用。
查询当前数据名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件。
修改数据库名
前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
1.关闭数据库。
2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
二、数据库实例名
什么是数据库实例名?
数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。
数据库名和实例名可以相同也可以不同。
在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。
查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询。
数据库实例名与ORACLE_SID
虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量。 ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台, ORACLE_SID还需存在于注册表中。
且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。
数据库实例名与网络连接
数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明 。
三、数据库域名
什么是数据库域名?
在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:
全国交通运政系统的分布式数据库,其中:
福建节点: fj.jtyz
福建厦门节点: xm.fj.jtyz
江西: jx.jtyz
江西上饶:sr.jx.jtyz
这就是数据库域名。
数据库域名在存在于参数文件中,他的参数是db_domain.
查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询。
全局数据库名
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz
四、数据库服务名(经常是orcl)
什么是数据库服务名?
从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。
如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。
查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在参数文件中查询。