OracleMerge的使用

背景:
需要实现大量的如果有就更新,如果没有就添加的操作
-- 常规写法
if exists(select 1 from T where T.a='1001' )
    update T set T.b=2 Where T.a='1001' 
else 
    insert into T(a,b) values('1001',2); 

--Merge写法
MERGE INTO T T1
USING (SELECT '1001' AS a,2 AS b FROM dual) T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
    UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN 
    INSERT (a,b) VALUES(T2.a,T2.b);
--在批量处理更新Or添加操作时,merge可以说是效率较高的一种

Oracle数据库中instr函数的使用

INSTR(C1,C2,I,J) 

在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

C1 被搜索的字符串 
C2 希望搜索的字符串 
I 搜索的开始位置,默认为1 
J 出现的位置,默认为1 

SELECT instr('hello world','world') FROM dual;

还可用于代替like,并使模糊更强大

在我们使用like时一般都是:
已知字段 like 关键字

如果反过来呢
例如我有一个地址:A省B市C区D街xxx号

数据库中有一个表Table,已知字段:
A:省
B:市
C:区
D:街
E:地区信息

那么我怎么通过已知地址获取到E字段的信息?

引用instr函数实现:
select E from table 
where
instr('A省B市C区D街xxx号',A)>1
and instr('A省B市C区D街xxx号',B)>1
and instr('A省B市C区D街xxx号',C)>1
and instr('A省B市C区D街xxx号',D)>1

Oracle修改表字段类型报错

错误信息:
[Err] ORA-22858: invalid alteration of datatype

原因:
oracle对该字段类型进行了限制

解决方案:
1.删除掉该字段保存
2.重新添加该字段并设置为想要修改的值
相关java错误信息:
ORA-01461:仅可以插入LONG列的LONG值赋值

原因:
字段类型错误导致数据无法添加

解决方案:
举例:
原字段类型为varchar2改为clob文本类型

Oracle同步A表某字段值到B表某字段

-- 查询两字段值
select A.ITEM,B.ITEM from TABLE_A A 
LEFT JOIN TABLE_B B ON A.NAME=B.NAME
-- WHERE B.ITEM IS NOT NULL
;
--同步B表字段值到A表
UPDATE TABLE_A A
SET A.ITEM =(
select B.ITEM from TABLE_B B 
WHERE A.NAME=B.NAME
);

--将A表中多个字段值映射到B表多个对应字段
UPDATE TABLE_A A
SET (A.ITEM,A.ITEM_2) =(
select B.ITEM,B.ITEM_2 from TABLE_B B 
WHERE A.NAME=B.NAME
);

Oracle数据库安装教程

1.下载链接:
https://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/112010-win64soft-086667-zhs.html

2.点击下载:
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip

3.解压
将两者解压到同一个文件夹下

4.点击setup

5.弹出Installer,加载中

6.安装选项
邮箱可以不填,(之后会提示你是否不希望收到安全更新的通知,点击“是”)把更新的“√”去掉。

7.选择创建和配置数据库

8.选择桌面类

9.选择安装路径并输入口令(密码)
要确保安装盘的内存在有4G以上够用就行

10.条件检查
如果有失败或者全部失败可以选择全部忽略

11.安装
点击完成后开始安装

如安装错误:未找到wfmlrsvcapp.ear
请参考:https://blog.csdn.net/singit/article/details/70832723


Oracle数据库Date格式化及Select时Case的使用

--Date格式化片段
to_char(create_date,'YYYYMMDD') as date

--格式化系统当前日期
select to_char(sysdate,'YYYYMMDD') from dual;

--Select时Case片段
select case 
when item_a like 'A%' and item_b = 'b' then 'one'
when item_a like 'A%' and item_b = 'B' then 'two'
else 'other' end as type
from table_name

NavicatPremium创建Oracle连接失败

创建连接失败,原因:
1.IP错误
2.Port错误
3.服务名或服务ID错误
4.用户名或密码错误

那么能够到去网上搜的情况一般都不会是前四种
5.本地没有安装Oracle客户端

这种情况就导致:
Navicat获取到的连接支持只是它自己的默认支持
无法与远程Oracle匹配

解决办法:
1.去官方下载客户端(优点:可操作本地Oracle数据库)

2.下载精简版客户端(优点:安装部署方便)
Instant Client 是Oracle 公司推出的精简版客户端。
32位下载地址:
http://www.oracle.com/technetwork/topics/winsoft-085727.html

注意:
不管你的Navicat是32位的还是64位的,
你的Instant Client都要下载32位的,
因为Navicat只支持32位的客户端。

2.1解压下载的压缩包
2.2获取压缩包内的oci.dll路径,例如F:/instantclient_12_1/oci.dll
2.3打开Navicat选中工具,选中OCI,将oci.dll路径输入到OCI library
2.4重启Navicat重新尝试连接

SQLServer数据库转MySQL数据库

准备工作:
1.安装的有SQLServer服务并有对应的数据库
2.安装的有Mysql数据库并创建一个与SQLServer数据库同名的数据库
3.安装的有Navicat Premium数据库可视化工具

开始转换:
1.打开Navicat并配置两个数据库的连接
2.打开刚创建的MySQL数据库并点击右侧的“导入向导”
3.选中ODBC点击下一步
4.选中导入从中的Microsoft OLE DB Provider for SQL Server并点击下一步
5.输入用户名和密码并选择对应的数据库测试连接
6.如连接成功就可疯狂下一步
7.在下一步的过程中我们可以对要同步的表进行筛选
8.确认表之后向导会对表结构进行预测,你可以确认下是否有要调整的
9.向导提供条件查询,如果有太多不想要的数据或者字段类型有问题导致导入出错可以设置这里。
10.最后向导模式选择添加
11.大功告成

补充:
这个东西对SQLServer转MySQL数据类型转换的支持不是很好,要手动设置。

但是导入数据没有问题,最好的方式是:
先使用工具:mss2sql将SQLServer的表转换成MYSQL的表,然后在使用此工具的ODBC导数据。
http://blog.csdn.net/andrew_wx/article/details/6832404

问题记录:
1.SQLServer数据导入到MySQL时,mss2sql对bit类型的处理不太好,
所以有bit类型的字段表导入后要更改长度为8,否则后续的导入操作将会失败。
2.数据导入的时候,如果是局域网数据库,那么要选择的类型为:
SQL Native Client
3.选择连接属性时要慎重,如果中间不正确则确认其它几种属性的作用
选择正确的属性

4.SQL要修改的地方
Insert自增列要给Null(如果是简写不写列名的话);
分页大致上都要改为MySQL的Limit;
表名不要出现dbo.等前缀;

5.主键自增等字段设置会出现丢失,切记检查一下