2023-03-22 12:20:45 +08:00

15 KiB
Raw Blame History

title, date, author
title date author
Oracle 2021-03-23 10:30:31 文永达

Oracle

安装Oracle 19c

Linux下安装

rpm方式 没成功

从Oracle官网下载安装包 Linux x86-64 RPM

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

安装帮助文档

https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/preface.html#GUID-071A6B76-11E3-4421-963E-41DA6F2EF07A

下载地址

https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html浏览器搜索-19c

安装,首先执行

yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm 

会提示缺少依赖

可以去RPM源网站下载

http://www.rpmfind.net/linux/rpm2html/search.php?query=compat-libcap1(x86-64)

安装

rpm -ivh compat-libcap1-1.10-7.el7.x86_64.rpm

再次执行

yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm 

安装数据库

yum install oracle-database-ee-19c-1.0-1.x86_64.rpm

如果发生错误

Exception java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory occurred.. 
java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory 
       at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
       at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) 
       at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857) 
       at java.lang.Runtime.loadLibrary0(Runtime.java:870) 
       at java.lang.System.loadLibrary(System.java:1122) 
       at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.loadNativeLib(OiipuUnixOps.java:388) 
       at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.<clinit>(OiipuUnixOps.java:130) 
       at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201) 
       at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299) 
       at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230) 
       at oracle.sysman.oii.oiix.OiixIniPair.<init>(OiixIniPair.java:148) 
       at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809) 
       at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978) 
       at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385) 
       at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338) 
       at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296) 
       at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416) 
       at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325) 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771) 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690) 
       at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420) 
'DetachHome' failed. 
Exception in thread "main" java.lang.NullPointerException 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706) 
       at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420) 
Exception java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps occurred.. 
java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps 
       at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201) 
       at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299) 
       at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230) 
       at oracle.sysman.oii.oiix.OiixIniPair.<init>(OiixIniPair.java:148) 
       at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809) 
       at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978) 
       at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385) 
       at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338) 
       at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296) 
       at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416) 
       at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325) 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771) 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690) 
       at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696) 
'AttachHome' failed. 
Exception in thread "main" java.lang.NullPointerException 
       at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706) 
       at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696) 
[SEVERE] An error occurred while registering the Oracle home. Verify logs in /var/log/oracle-database-ee-19c/results/oraInstall.log and /opt/oracle/oraInventory for more details and try again. 
warning: %post(oracle-database-ee-19c-1.0-1.x86_64) scriptlet failed, exit status 1 

解决办法

 yum -y install /lib64/libnsl.so.1 

再次执行安装

# 需要先删除 /opt/oracle/*
rm -rf /opt/oracle/*
# 再次执行安装 需要加上 --force
rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm --force 

配置数据库

/etc/init.d/oracledb_ORCLCDB-19c configure

过程较长,等待即可

可能会JDK报错

yum install libnsl

配置号后设置当前用户下的环境变量

vi ~/.bashrc
# 追加oracle环境变量信息
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 
export ORACLE_SID=ORCLCDBexport 
PATH=$ORACLE_HOME/bin:$PATH 

# 保存退出,执行
source ~/.bashrc

验证安装是否正确

su oracle

sqlplus / as sysdba

# 提示
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 17 12:25:27 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to an idle instance.

启动监听

image-20221017123327552

Docker方式

安装Docker

sudo wget -qO- https://get.docker.com/ | bash
docker --version
systemctl start docker
systemctl status docker
systemctl enable docker

拉取镜像 quay.io/maksymbilenko/oracle-12c

docker pull quay.io/maksymbilenko/oracle-12c

如果有本地镜像则使用

docker build -t quay.io/maksymbilenko/oracle-12c .

构建容器

# 首先创建本地目录
mkdir /oracle/data
# 授予权限
chmod -R 777 /oracle/data
docker run --name o12c -d -p 8080:8080 -p 1521:1521 -v /oracle/data:/u01/app/oracle quay.io/maksymbilenko/oracle-12c
# 查看日志
docker logs -f # 字符串ID

image-20221017145702216

安装完成

数据库连接信息

hostname: localhost
port: 1521
sid: xe
service name: xe
username: system
password: oracle

进入容器修改账号密码设置

# 查看所有容器信息
docker ps -a 
docker exec -it [containerID] /bin/bash
# 切换成oracle用户
su oracle
# 进入sqlplus
$ORACLE_HOME/bin/sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Sun Aug 1 03:15:37 2021

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production

# 设置密码有效期为无限制
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Profile altered.

SQL> alter user SYSTEM account unlock;

User altered.

# 创建一个账号为act_test的用户密码设置为test
SQL> create user act_test identified by test;

User created.
# 为这个用户赋予管理员的权限
SQL> grant dba to act_test;

Grant succeeded.

# ctrl + p + q 退出容器注意不要exit退出防止容器直接关闭了

Oracle SQL Developer

设置自动提示

工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 完成设置

image-20221017111632399

设置代码模板

工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 代码模板

image-20221017112825105

同时打开多个表

工具栏 -> 工具 -> 首选项 -> 数据库 ->对象查看器

image-20221020141231505

SQL PLUS

解决控制台输错命令删除

使用Ctrl + backspace代替backspace

登录

# 以oracle账号登录
su oracle
$ORACLE_HOME/bin/sqlplus / as sysdba

语法

新建表空间

CREATE TABLESPACE ACT_DEV 
    DATAFILE 
        '\oracle\data\oradata\xe\FILE_SPECIFICATION1.dbf' SIZE 52428800 AUTOEXTEND ON NEXT 52428800 MAXSIZE 2147483648 
    
    EXTENT MANAGEMENT LOCAL;

解除占用

select l.session_id,o.owner,o.object_name
from v$locked_object l,dba_objects o
where l.object_id=o.object_id;

SELECT sid, serial#, username, osuser FROM v$session where sid = sid;

alter system kill session 'sid,serial#';

修改表

-- 表重命名
ALTER TABLE BOOK 
RENAME TO BIND_PHONE_NUMBER;
-- 添加表字段Column
ALTER TABLE BIND_PHONE_NUMBER 
ADD (USERNAME VARCHAR2(20) );
-- 修改表字段Column名
ALTER TABLE BIND_PHONE_NUMBER RENAME COLUMN NAME TO APPNAME;

使用关键字做完表名,列名

使用双引号""形式,如"INDEX"

删除表数据

TRUNCATE TABLE 表名
-- or
DELETE FROM 表名

从其他表中复制数据到插入一张表中

-- 标准语法
INSERT INTO table2
SELECT * FROM table1;
-- 多表插入到一张表 示例,ID为GUID,
-- 需要注意的是如果指定插入到哪些列中不是根据后面SELECT的列的别名来插入而是通过列的顺序插入语句后可接WHERE条件
INSERT INTO table1(ID,NAME,TEXT) SELECT SYS_GUID(), t2.NAME, t3.TEXT FROM DUAL, TABLE2 t2, TABLE3 t3;

内连接与外连接

内连接

合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行

语法:

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 条件;

类似于:

方式一
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);

方式二:
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;

这种查询方式它会把所有的符合where条件的字段查询出来。但是有这样一种情况就是两张表的数据有的不存在某种关系。

缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。

于是引入外连接。

外连接

查询多表时一般要求中出现:查询所有的数据时,就一定会用到外连接。

两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。没有匹配的行时,结果表中相应的列为空(NULL)。

满外连接

FULL JOIN

LEFT JOIN UNION RIGHT JOIN

左外连接

语法:

SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 条件;

类似于:

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

employees表中的数据会全部显示出来

右外连接

语法:

SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 条件;

类似于:

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

departments表中的数据会全部显示出来

UNION的使用

·语法:

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分不去重。

Oracle 函数

NVL()

image-20230228133334777

SELECT a.OSPREQID,a.OSPREQNO FROM T_OSP_REQ a,T_OSP_REQDETAIL b WHERE a.OSPREQID = b.OSPREQID AND b.OSPNO IN (SELECT OSPNP FROM T_BPM_OSP WHERE OSPNO IN ('OSP202302280002')) AND NVL(DATASTATUS, ' ')<>'撤销'

如果DATASTATUSNULL,则返回**' ',否则返回DATASTATUS**

官方解释

The Oracle NVL () function allows you to replace null with a more meaningful alternative in the results of a query. The following shows the syntax of the NVL () function: The NVL () function accepts two arguments. If e1 evaluates to null, then NVL () function returns e2. If e1 evaluates to non-null, the NVL () function returns e1.

Oracle NVL()函数允许您在查询结果中用更有意义的替代项替换NULL。下面显示了NVL()函数的语法NVL()函数接受两个参数。如果e1的计算结果为空则NVL()函数返回e2。如果e1的计算结果为非空则nvl()函数返回e1。

DECODE()

用法 DECODE(表达式, 条件1,返回值1,条件2,返回值2)

SELECT DECODE(AMOUNT, 0, NULL, AMOUNT) FROM T_PO_ORDERDETAIL;

如果AMOUNT等于0,则返回NULL,否则返回AMOUNT

SELECT DECODE(AMOUNT, 0, NULL, 1, 1, AMOUNT) FROM T_PO_ORDERDETAIL;

如果AMOUNT等于0,则返回NULL否则如果AMOUNT等于1则返回1否则返回AMOUNT

DECODE替换NVL

在Oracle中DECODE函数通常可以替换使用NVL函数。DECODE函数可以在字段值满足多个条件时返回不同的结果值语法如下

DECODE(expr, search, result, default)

其中expr是要进行条件判断的表达式search是需要匹配的条件值result是匹配成功后返回的结果值default是在没有匹配成功时返回的默认值。

使用DECODE函数来替换NVL函数的示例如下

使用NVL函数处理NULL值

SELECT NVL(name, '未知') AS name FROM user;

使用DECODE函数替换NVL函数

SELECT DECODE(name, NULL, '未知', name) AS name FROM user;

以上语句中使用DECODE函数将name参数的NULL值替换为“未知”字符串。当name不为NULL时返回它本身的值。