IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> oracle适配总结 -> 正文阅读

[大数据]oracle适配总结

背景:

原来使用的是mysql:5.7,现在需要适配oracle数据库;

项目框架:SpringBoot:2.2.11.RELEASE + MybatisPlus:3.3.2

问题总结:

1、名字长度

oracle12.1的表、字段、索引名、视图名命名长度不能超过30,12.2版本以后即可支持;

2、默认值丢失

在mysql中有默认值,迁移到oracle中没有设置默认值;

3、注意字段大小写问题

4、时间字符串格式

oracle需要使用to_date()函数转换:

TO_DATE( ‘2022-06-07 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’ )

5、order by

oracle的order by 字段不在group by中就会报错;

6、sql末尾不能加分号 “;”

7、引号、as、关键字问题:

sql语法的支持反单引号 ·单引号 ’双引号 "as 别名
oracle字段名×支持×支持
mysql字段名支持× 识别为字符串了× 识别为字符串了支持
oracle 字段 as 别名××支持-
mysql字段 as 别名支持支持支持-
oracle表名××支持区分大小写×
mysql表名支持××支持
oracle表名 as 别名----
mysql表名 as 别名支持××-
  • 字段名:oracle只支持单引号;mysql只支持反单引号;(设计时考虑多数据库的关键字,避免使用)

  • as字段别名:oracle和mysql都支持双引号;

  • oracle表别名不支持as的方式, 可以去掉as,直接拼接别名;(字段别名支持as);

  • 遇到的关键字,可以加单引号解决(‘as’ 、‘level’ 、‘uid’、 ‘display’)

8、字段类型问题

  • CLOB、NCLOB 对应 jdcbType=“VARCHAR“ 时,插入数据没问题,但是查询数据有问题;要么把字段类型改为NVARCHAR2,要么把jdbcType改为对应数据库的类型;

  • BLOB字段类型表示二进制存储,一般用不到这种,可以修改为NVARCHAR2或者NCLOB或者CLOB;

  • 关于oracle字符串类型的介绍:https://developer.aliyun.com/article/687922

在这里插入图片描述
在这里插入图片描述

常见错误日志

(以下只代表我的处理记录,仅作参考,同一个错误提示其实可能是多种结果导致的)

ORA-01465: invalid hex number

解决:BLOB类型可以改成NCLOB

ORA-00932: inconsistent datatypes: expected - got NCLOB

解决:NCLOB类型改为NVARCHAR2,或者是添加注解:

@TableField(value = "defSSOJson",    jdbcType = JdbcType.NCLOB,    typeHandler = NClobTypeHandler.class)

ORA-00923:FROM keyword not found where expected

解决:sql查询中字段别名有关键字,需要加双引号

ORA-00933: SQL command not properly ended

解决:

  • sql末尾有分号,去掉分号即可;

  • oracle表别名不支持as的方式, 可以去掉as,直接拼接别名;(但字段别名还是支持as的)

ORA-00911: invalid character

解决:字段的反单引号替换成单引号

SQL state [99999]; error code [17068]; Invalid argument(s) in call;

解决:升级oracle驱动包(适配oracle19c版本时报的错)

<!--oracle12c使用  12.2.0.1 -->
<!--oracla19c使用  19.3.0.0 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>${oracle.version}</version>
</dependency>

Non supported character set (add orai18n.jar in your classpath): ZHS16GBK

在本地debug启动报错如下:

java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK]

解决:添加依赖

<dependency>
    <groupId>cn.easyproject</groupId>
    <artifactId>orai18n</artifactId>
    <version>12.1.0.2.0</version>
</dependency>

ORA-00904: “NODE_UUID”: invalid identifier

解决:数据库字段缺失,少了NODE_UUID这个字段

ORA-12704: character set mismatch

解决:使用UNION时,字符集不匹配问题,字符串前面加 “N”

查询不出数据

解决:oracle不支持 <> ‘’ 空字符串,需要使用空格来代替 <> ’ ’
在这里插入图片描述

ORA-00979: not a GROUP BY expression

oracle的order by 字段不在group by中就会报错;

Invalid column type: 1111

saveOrUpdate 中因为selectById的Id为null导致报错;但是在mysql中没问题;

解决: 修改活新增的判断改为手动判断ID是否为null,而不是selectById去查库判断;

ORA-01400: cannot insert NULL into (“ESCUSER”. “PI_SS0_MOBILE_DEVICE”.“ID”)

解决:设置主键自增

oracle设置主键自增

-- 表名:PI_SSO_MOBILE_DEVICE 
-- 主键字段:id
alter table PI_SSO_MOBILE_DEVICE add constraint id primary key (id);

-- 自定义序列名 PI_SSO_MOBILE_DEVICE_SEQ
create sequence PI_SSO_MOBILE_DEVICE_SEQ
increment by 1 
start with 1 
nomaxvalue 
nominvalue 
nocache;

create or replace trigger PI_SSO_MOBILE_DEVICE_SEQ  
before insert on PI_SSO_MOBILE_DEVICE for each row 
begin 
        select PI_SSO_MOBILE_DEVICE_SEQ.nextval into :new.id from dual; 
end;

oracle修改字段类型

-- 要修改的字段名:PATH , 改为  NVARCHAR2(2000) :
-- 先添加一个PATH_NEW字段,然后把源字段值复制过来之后,
-- 再删除源字段,最后重命名一下新增的字段即可
alter table ACL_MENU add PATH_NEW NVARCHAR2(2000);
COMMENT ON COLUMN "ACL_MENU"."PATH_NEW" IS '字段描述';
update ACL_MENU set PATH_NEW=PATH;
alter table ACL_MENU drop column PATH;
alter table ACL_MENU rename column PATH_NEW to PATH;

附:oracle部署笔记

docker部署oracle19c

来源:Docker安装Oracle19c史上最全步骤(图文并茂)

# 下载镜像 
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
# 创建文件
mkdir -p /mydata/oracle/oradata
# 授权,不授权会导致后面安装失败
chmod 777 /mydata/oracle/oradata

docker run -d  \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCLCDB \
-e ORACLE_PDB=ORCLPDB1 \
-e ORACLE_PWD=123456 \
-e ORACLE_EDITION=standard \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /mydata/oracle/oradata:/opt/oracle/oradata \
--name orcle19c \
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c

docker部署oracle 12.2

来源:docker安装orcale-12c_幻千纷纭的博客-CSDN博客

docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle-12c
# 创建文件
mkdir -p /mydata/oracle-12/oradata
# 授权,不授权会导致后面安装失败
chmod 777 /mydata/oracle-12/oradata
# 12.2
# -e ORACLE_CHARACTERSET=zhs16gbk \
docker run  --name myoracle12.2 \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=orcl \
-e ORACLE_PDB=orclpdb1 \
-e ORACLE_PWD=123456 \
-v /mydata/oracle-12/oradata:/opt/oracle/oradata \
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle-12c:latest

# 连接数据库登录 默认账号密码:sys/123456
docker exec -it  myoracle12.2   /bin/bash
sqlplus sys/123456@localhost:1521/orclpdb1  as sysdba
# 使用以下命令获取安装的数据库的服务名称。 -- 默认是 xe
select value from v$parameter where name='service_names'; 
# 查看oracle现在的状态 ,状态为 OPEN 则正常,表
select status from v$instance;  
# 修改用户 system 的密码为 oracle ,可以自定义
alter user sys identified by "123456";   

# 创建表空间
mkdir -p /home/oracle/escdb
chmod 777  /home/oracle/escdb
sqlplus sys/123456@localhost:1521/orclpdb1  as sysdba
create tablespace ESCDB datafile '/home/oracle/escdb/escdb.dbf' size 100M;
# 创建账户 create user 账户名 identified by 密码  使用表空间名;
create user IAM identified by 123456 default tablespace ESCDB;
GRANT CONNECT, RESOURCE, DBA TO IAM;
# 给用户授予权限
 # 授予dba权限后,这个用户能操作所有用户的表
grant dba to IAM; 
# 删除用户
# drop user IAM cascade;

其它命令

# 查看版本
select * from v$version;
# 查询oracle server端的字符集
select userenv('language') from dual;
# 查询所有账户
SELECT * FROM ALL_USERS;
# 查看制定概要文件(默认为DEFAULT)的密码有效期:
select  * from dba_profiles where profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';
# 然后将密码的有效期有180天设置为“无限制”;
ALTER PROFILE  DEFAULT  LIMIT PASSWORD_LIFE_TIME UNLIMITED;
# 解除锁定
alter user IAM account unlock;

navicat连接:

在这里插入图片描述

如果连接报错:

在这里插入图片描述

Oracle数据库报错:Oracle net admin error

去下载 https://www.oracle.com/database/technologies/instant-client/downloads.html

下载后解压,配置navicat环境:(需要重启navicat后生效)

在这里插入图片描述

我的springBoot项目中连接oracle的配置

spring.datasource.url=jdbc:oracle:thin:@//192.168.2.23:1521/你的服务名
spring.datasource.username=abc
spring.datasource.password=secret
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.dialect=org.hibernate.dialect.Oracle12cDialect
spring.datasource.hikari.schema=你的服务名
spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.hikari.connection-test-query=SELECT 1 from dual
secret
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.dialect=org.hibernate.dialect.Oracle12cDialect
spring.datasource.hikari.schema=你的服务名
spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.hikari.connection-test-query=SELECT 1 from dual
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-20 23:03:25  更:2022-06-20 23:03:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:56:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码