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
如果想对分组数据再进行过滤需要使用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排序
union和minus
union可以合并集合(相加)
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' |
minus可以移出集合(相减)
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 |
rownum隐含字段
取五条记录
select rownum,e.* from emp e where rownum <=5; |
取得大与第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; |
采用rownum进行分页
分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置和结束位置,如每页两条数据:
第一页:记录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;
序列(Sequence)
序列是Oracle特有的,它可以维护一个自增的数字序列,通常从1开增长,但可以设置,例如:学生表t_student中的编号,可以采用Oracle的序列的方式来维护
还有一种经常使用的生成策略是Identity,如:Mysql/MS SQL Server
2.22.1、创建序列
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;
循环(只列出俩种常用的for和while循环)
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
方法三:在参数文件中查询。