IT之道-艾锑知道

您当前位置: 主页 > 资讯动态 > 艾锑分享 >

艾锑知识 |Oracle连接配置解读


2020-03-11 20:17 作者:admin
世界疫情的展将会对中国产生那些影响
 
 
在过去的一个多月,中国是世界最大的疫情受灾区,受感染的人数和死亡人数是2003年非典的10多倍,这个数据让全世界震惊,但好在中国的领导者当即立刻,做出了ALL IN的行动,全力以赴的处理这一件事,当举国上下,所有人的意识,焦点,能量全都聚焦处理这一件事的时候,很快这种靠空气就能传播的新型冠状病毒得到了很好的控制.
 
近期中国受感染的人数在持续下降,很多地区连续数日新增为零,但万万没想到中国邻近的一些国家有些人被感染,同时这些国家的领导人没有能快速反应,导致这几天在世界迅速的传播开来,从几个人扩展到了近万人的规模,本来只有一两个国家,但因为人数短时间的增长和流动,现在已经在34个国家和地区传播开来,这将导致整个世界的经济降速和减缓,美国硅谷的全球最著名的互联网公司全部放假在家办公, 好莱坞的电影业也全部暂停,还有更多的行业在陆陆续续的停止中,这场全球性的疫情将会为世界的经济带来巨大的挑战.
中国从刚开始的疫情输出国将很快变成疫情的输入国,所以我们接下来面临的是更多的封闭性的政策,不然疫情就很难被彻底的控制,前几天北京新增长的几个人全是从国外回来的,如果每个国家都开始封闭,都开始停止商业的运作,经济就会快速下滑,当世界的经济受到严重影响时,中国作为世界第二大经济体,自然也会受到重创.
 
受到最大影响的出口,中国向外出口主要有:
1.农产品:以水产品、蔬菜、水果、花卉.畜产品、粮食和食用油籽等为主。
2.通信产品:电子信息与通信技术领域
3.钢铁:焦炭.钢坯.铁合金.钢丝及制品等。
4.陶瓷
5.机电
6.服装.纺织品
7.冶金原料
8.我国高新技术产品出口最多的4 类技术领域是计算机与通信技术、电子技术、生命科学技术、光电技术。
9.汽车零部件
10.能源产品:煤
这些行业是中国的主体行业,有上亿的劳动者都在这些行业中,如果产能下降,直接导致的就是员工失业的问题,这将是我们急切需要思考的,如何帮助全球快速控制疫情的扩展,把我们的经验分享给这些疫情增长比较快的国家,从而让全球开始互帮互助.
 
只有全球疫情消失,世界的经济才能真正的恢复,钟南山院士说,全球疫情结束可能要到六月,其实他说的非常保守,只有全球所有国家像中国一样ALL IN 来处理这件事,才有可能六月结束全球疫情,如果不是这样的话,今年也结束不了,因为它的传播速度太快了,而且这种病毒它是一种细胞生命体,有生命体的细胞就具备变异的能力,一旦变异将会更难处理.
 
 
为什么中国能控制的这么好,大家看看自己的小区和出行就能明白,今天我们艾锑无限有位同事,进地铁的时候,测出了37度体温,立刻就被地铁站准备好的专车送到了医院全面检查,当然最后的结果是没有任何问题,可能是他赶地铁狂奔后温度升高的结果,但对于测量体温的人来说是,可错判一百,不能放过一个,花点钱,花点时间,都是小事,如果真是因为疏忽大意,最终放进了一个新冠患者,那后果将会不堪设想,这也就是为什么中国能在这么大范围的国家,这么多人口在疫情发展过程中这么快控制住的原因.也许这就是除中国以外的国家需要学习和效仿的.
 
 
之前我分享了八个字,可能很多人不太理解,物同体,能量合一,今天的世界将不在是分离的状态,我们在同一个星球,就像是同一个身体,如果我们身体某个部位出现了问题,就会对全身造成破坏,所以一国有难,全支援,我们不在是竞争和对立的关系,我们彼此之间如果有竞争也应该是为了让我们变得更好,我们是合一的整体,只有共同变好,才会让彼此在这个星球中活的更长,活的更久.
 
 
祝福中国,祝福世界,祝福我们这个美丽的星球,让我们联合起来,真正的去践行习主席提出的”人类命运共同体”的愿景,让我们的世界未来越来越好.
艾锑知识 |Oracle连接配置解读
安装ORACLE数据库软件,dbca安装数据库后,需要配置listener连接数据库。这里有一些概念比较难理解,记录一些分析实战结论。
从连接端讲起。
1 连接数据库的方式
oracle的连接串有几部分构成,这里就按sqlplus为例,一个完成的连接串遵循下面格式
?
1 sqlplus 用户名/密码@主机:端口号/SID 可选as sysdba
下面先讲只有listener没有tns的情况
2 listener
使用listener连接需要配置完整连接信息,这里分为两种连接方式,我们看一个listener的例子:
(带sid的listener使用netmgr增加listener的datavase services即可出现sid的配置)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LISTENER2 =
 (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = iZbp1d4tisi44j6vxze02fZ)(PORT = 1522))
 )
SID_LIST_LISTENER2 =
 (SID_LIST =
  (SID_DESC =
   (GLOBAL_DBNAME = gdn1400)
   (ORACLE_HOME = /fdisk1/oracle1400/base/dbhome_1)
   (SID_NAME = orcl1400)
  )
 )
ADR_BASE_LISTENER2 = /fdisk1/oracle1400/base
 
LISTENER1 =
 (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = iZbp1d4tisi44j6vxze02fZ)(PORT = 1521))
 )
ADR_BASE_LISTENER1 = /fdisk1/oracle1400/base
这里有两个listener,有sid的叫做静态listener,没有sid的叫做动态listener。在查看状态时存在区别:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lsnrctl status listener1
...
Services Summary...
Service "orcl1400" has 1 instance(s).
 Instance "orcl1400", status READY, has 1 handler(s) for this service...
Service "orcl1400XDB" has 1 instance(s).
 Instance "orcl1400", status READY, has 1 handler(s) for this service...
The command completed successfully
 
 
lsnrctl status listener2
...
Services Summary...
Service "gdn1400" has 1 instance(s).
 Instance "orcl1400", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
注意对于lsnrctl来说,service的名字是global database name
我们在看一个连接串:
?
1 sqlplus sys/password@iZbp1d4tisi44j6vxze02fZ:1521/orcl1400 as sysdba
这个连接串中最需要关注的就是服务名了,这里是orcl1400。
注意!:这个服务名必须由listener中的某一个提供,这里listener2的服务名提供的是gdn1400,而listener1没有提供服务名。那么如何连接数据库呢?答案就是走listener1的连接会去数据库中动态的查询服务名(所以叫做动态连接)
?
1
2
3
4
5
SQL> show parameter service
 
NAME           TYPE   VALUE
------------------------------------ ----------- ------------------------------
service_names         string   orcl1400
也就是为什么使用orcl1400能连上数据库。这里我们使用静态连接试一下,也是可以连接数据库的(注意端口号和动态的不同)
?
1
2
3
4
5
6
7
8
9
10
11
12
sqlplus sys/password@iZbp1d4tisi44j6vxze02fZ:1522/gdn1400 as sysdba
 
SQL*Plus: Release 12.1.0.2.0 Production on Thu May 30 20:51:00 2019
 
Copyright (c) 1982, 2014, Oracle. All rights reserved.
 
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL>
3 TNS
那么tns是什么呢?我们看下这个连接串。
?
1 sqlplus sys/password@iZbp1d4tisi44j6vxze02fZ:1521/orcl1400 as sysdba
@后面的信息很多,能否省略呢?比如
?
1 sqlplus sys/password@tns1400 as sysdba
这样看起来简洁很多也便于管理,TNS即实现了这个功能,我们看一个tnsnames.ora的配置:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NSN1522 =
 (DESCRIPTION =
  (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = iZbp1d4tisi44j6vxze02fZ)(PORT = 1522))
  )
  (CONNECT_DATA =
   (SERVICE_NAME = gdn1400)
  )
 )
 
NSN1521 =
 (DESCRIPTION =
  (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = iZbp1d4tisi44j6vxze02fZ)(PORT = 1521))
  )
  (CONNECT_DATA =
   (SERVICE_NAME = orcl1400)
  )
 )
这里可以看到,最左面的NSN1522和NSN1521就是我们可以@的服务名字。内部的映射信息是指向listener的,这里的servicename要和上面的global database name对应上!
?
1
2
NSN1522, iZbp1d4tisi44j6vxze02fZ, 1522, gdn1400 -----> listener2
NSN1521, iZbp1d4tisi44j6vxze02fZ, 1521, orcl1400 -----> listener1
两个别名指向了两个不同的listener,连接测试:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# sqlplus sys/password@nsn1521 as sysdba
 
SQL*Plus: Release 12.1.0.2.0 Production on Thu May 30 20:58:51 2019
 
Copyright (c) 1982, 2014, Oracle. All rights reserved.
 
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL>
 
# sqlplus sys/password@nsn1522 as sysdba
 
SQL*Plus: Release 12.1.0.2.0 Production on Thu May 30 20:58:55 2019
 
Copyright (c) 1982, 2014, Oracle. All rights reserved.
 
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL>
注意:tns依赖lsnrctl使用,可以理解为hostname这样的概念,注意tns的SERVICE_NAME等信息必须和listener关联才能连接!
 
艾锑知识 |Oracle中多表关联批量插入批量更新与批量删除操作
首先要明白一点,为什么会有批量这一个概念,无非就是数据太多了,在java端把数据查出来然后在按照100-300的批次进行更新太耗性能了,而且写出来的代码会非常的臃肿,所谓好的实现是用最少的,最精简的代码实现需求,代码越少,留给自己犯错误的机会更少。
还有一个知识点就是多表关联,对于查询肯定是可以多表关联的,其实对于除了查询之外也是可以进行多表关联过滤数据的,从而达到在Oracle中查到目标数据即可更新,从而规避规避以往需要单独查一次数据然后在按照100-300的批次做插入,更新,删除的操作 。
创建必须的表和序列语句:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--创建部门表 dept:
CREATE TABLE dept
(
 deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
 dname VARCHAR2(14) ,
 loc VARCHAR2(13) ,
 CREATEDTIME DATE,
 UPDATEDTIME DATE,
 CREATEDBY NUMBER(7,0),
 UPDATEDBY NUMBER(7,0)
) ;
 
--创建员工表 emp:
CREATE TABLE emp
(  empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
  ename VARCHAR2(10),
  job VARCHAR2(15),
  mgr NUMBER(4),
  hiredate DATE,
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  deptno NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT,
  CREATEDTIME DATE,
  UPDATEDTIME DATE,
  CREATEDBY NUMBER(7,0),
  UPDATEDBY NUMBER(7,0)
);
 
--创建员工表 emp_copy:
CREATE TABLE emp_copy
(  empno NUMBER(4),
  ename VARCHAR2(10),
  job VARCHAR2(15),
  mgr NUMBER(4),
  hiredate DATE,
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  deptno NUMBER(2),
  CREATEDTIME DATE,
  UPDATEDTIME DATE,
  CREATEDBY NUMBER(7,0),
  UPDATEDBY NUMBER(7,0)
 );
--自定义一个序列
 create sequence emp_sequence
    increment by 1 --每次增加几个,我这里是每次增加1
    start with 1  --从1开始计数
    nomaxvalue   --不设置最大值
    nocycle     --一直累加,不循环
    nocache    --不建缓冲区
 
--插入dept表数据:
INSERT INTO dept VALUES(10,'ACCOUNTING','NEW YORK',sysdate,sysdate,123123,123123);
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS',sysdate,sysdate,123123,123123);
INSERT INTO dept VALUES(30,'SALES','CHICAGO',SYSDATE,SYSDATE,123123,123123);
INSERT INTO dept VALUES(40,'OPERATIONS','BOSTON',sysdate,sysdate,123123,123123);
 
--插入emp表数据:
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,to_date('19-4-87','dd-mm-yyyy'),3000,NULL,20,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,to_date('23-5-87','dd-mm-yyyy'),1100,NULL,20,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30,sysdate,sysdate,123123,123123);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20,SYSDATE,SYSDATE,123123,123123);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10,sysdate,sysdate,123123,123123);
插入数据之后的dept表:
插入数据之后的emp表:
1.多表关联批量插入
要求:批量复制部门dept表 loc在 CHICAGO的,且工资大于1600的人员信息到emp_copy表,emp_copy的empno需要使用序列emp_sequence
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INSERT INTO emp_copy
SELECT emp_sequence.nextVal,C.* FROM (
  SELECT
  e.ename ,
  e.JOB ,
  e.mgr ,
  e.hiredate,
  e.sal ,
  e.comm ,
  e.deptno,
  SYSDATE AS CREATEDTIME,
  SYSDATE AS UPDATEDTIME,
  123124 AS CREATEDBY,
  123124 as UPDATEDBY
  FROM emp e, dept d
  WHERE e.deptno = d.deptno
  AND d.loc='CHICAGO'
  and e.sal>=1500
 )C;
插入之后的emp_copy表结果:
其中SELECT emp_sequence.nextVal,C.* 这种格式保证了C.*的多条数据都能取到不同的序列值
2.多表关联批量更新
要求:批量更新部门dept表 loc在 CHICAGO的,且职位job为'SALESMAN'的员工,comm在原来基础上加200
操作之前的数据:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
MERGE INTO emp e
 USING
 (
  SELECT e1.job, e1.ename,e1.comm FROM emp e1, dept d1
  WHERE e1.deptno = d1.deptno
  AND d1.loc='CHICAGO'
  and e1.job='SALESMAN'
 )t
 ON (
  e.job = t.job and e.ename = t.ename
 )
 WHEN MATCHED THEN
  UPDATE
   set e.comm= t.comm+200
操作之后的数据:
其中e.job = t.job and e.ename = t.ename只是展示可以关联多个条件,这里有一个关键点为 USING ( … ) t 中查询到的是一个list,而merge可以对匹配到的list进行批量更新
3.多表关联批量删除
要求:批量删除部门dept表 loc在 CHICAGO的,且工资小于1500的人员信息
操作之前的数据:
?
1
2
3
4
5
6
7
DELETE FROM
(
 SELECT c.*
 FROM emp c,dept d
 WHERE d.deptno = c.deptno AND d.loc = 'CHICAGO'
 and c.sal < 1500
);
操作之后的数据:

相关文章

IT外包服务
二维码 关闭