case when 简单case when(oracle推荐用decode更简单) 条件case when(mysql oracle只能用这种了)
-- mysql 有 'false' 'true'类型
(CASE WHEN user_status=0 THEN 'false' ELSE 'true' END) AS "isNormal"
-- oracle 没有boolean'类型 使用 0 1表示
(CASE WHEN FLOOR(SYSDATE - B.EFFDT) <![CDATA[<=]]> 30 THEN 1 ELSE 0 END) AS "isNewFlag"
-- 1. 简单case when (相当于 oracle的 decode函数)
(case b.HRCS_COMPENSATION_COM WHEN 1 THEN 'COMP1-年基本工资'
WHEN 2 THEN 'COMP2-年度固定薪酬' WHEN 3 THEN 'COMP3-年度总现金薪酬'
WHEN 4 THEN 'COMP4-年度直接薪酬' ELSE 'COMP5-年度整体薪酬' end
) as hrcsCompensationComp
-- 2.条件 case when ( case when 是连着写的, 在 oracle中decode只能处理简单的case when 有条件判断, 请使用oracle的 case when 和mysql 条件case when 一样)
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
mybatis oracle日期的TO_CHAR(B.EFFDT, 'yyyy-mm-dd hh24:mi:ss') AS "effdt", 即便数据库存的 年月日, 也要有hh24:mi:ss,
最后用spring的注解来转为 2019-01-01, 如下代码即可 要指定时区,要不展示的少一天
@JsonFormat(pattern = "yyyy-MM-dd", locale = "zh", timezone = "GMT+8")
所以,不涉及日期的计算, 还是 推荐 直接将date 定义为 string
ORACLE里面是没有 true false 之分的, 使用 数字 1 0 或'1' '0' 来表示 true false都可以
oracle里面的decode函数, 只是枚举, 不能做 逻辑判断, 所以, 要做逻辑判断,还是用 case when
如下写法是oracle 带order 排序 分页查询效率最高的(注意是3个子查询, 推荐使用)
传入 (pageNum-1 )* pageSize 和 pageNum * pageSize
-- <= pageNum * pageSize 后面写 > (pageNum-1 )* pageSize
--rownum关键字:oracle对外提供的自动给查询结果编号的关键字,与每行的数据没有关系。
<!-- 带order 排序的分页查询, 入/离职 职员工公告的sql-->
<!--入/离职 职员工公告的sql-->
<!--入/离职 职员工公告的sql-->
<select id="getEntryAnnouncement" resultType="com.hrp.persist.employee.myConsole.model.EntryDimissionAnnouncement">
SELECT * FROM (
SELECT ROWNUM AS ROWNO,TAB1.* FROM (
SELECT
TO_CHAR(B.EFFDT, 'yyyy-mm-dd') AS "effdt",
B.NAME_FORMAL AS "nameFormal",
B.CRC_DEPT_DESC AS "crcDeptDesc",
decode(B.ACTION,'XFR',1,0) AS "isTransfer",
(CASE WHEN FLOOR(SYSDATE - B.EFFDT) <![CDATA[<=]]> 30 THEN 1 ELSE 0 END) AS "isNewFlag"
FROM PS_MANGO_CRC_EMP_RL_TBL B
WHERE 1 = 1 AND B.CRC_RL_FLAG = #{crcRlFlag}
<if test="keyword != null and keyword!= ''">
AND (B.NAME_FORMAL LIKE '%${keyword}%' OR B.CRC_DEPT_DESC LIKE '%${keyword}%')
</if> ORDER BY B.EFFDT DESC
) TAB1 WHERE ROWNUM <![CDATA[<=]]> #{endSize}
) TAB2 WHERE TAB2.ROWNO <![CDATA[>]]> #{beginSize}
</select>
<!-- 查询总数 -->
<select id="getEntryAnnouncementCount" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM PS_MANGO_CRC_EMP_RL_TBL B
WHERE 1 = 1 AND B.CRC_RL_FLAG = #{crcRlFlag}
<if test="keyword != null and keyword!= ''">
AND (B.NAME_FORMAL LIKE '%${keyword}%' OR B.CRC_DEPT_DESC LIKE '%${keyword}%')
</if>
</select>
--如下写法是oracle 不带order排序的分页查询(注意是2个子查询,推荐使用)
SELECT *
FROM (SELECT ROWNUM AS ROWNO, B.*, BD.PRICE
FROM BOOK B
LEFT JOIN BOOK_DETAIL BD
ON B.ID = BD.ID
WHERE ROWNUM <= 10) TAB2
WHERE TAB2.ROWNO > 0;
--PL/SQL可视化界面创建表结构,tools-export tables导出表结构,注意手动加 ; 才可以创建表和创建索引的sql一起执行
1.字段不要使用char(20), 应该定义为 VARCHAR2(20), 因为char(10)为定长字符串, 存入 张三, 会自动补空格
2.oracle日期类型中没有datetime类型
Date类型的数据可以显示到年月日,也可以显示到年月日时分秒,主要看存储数据的精确度
--2019/11/11 TO_DATE在使用中 -- 那么后面的也是 -- 长度一样
INSERT INTO PS_CRC_EMP_RL_TBL
VALUES
('R', TO_DATE('2019-11-11', 'yyyy-mm-dd'), '置地', '李四五', '1000083');
--2019/12/25 14:11:28
INSERT INTO PS_CRC_EMP_RL_TBL
VALUES
('R', SYSDATE, '置地', '李四六', '1000083');
3.mysql中 有 date datetime的区分,date存年月日, datetime存 年月日时分秒, timestamp是时间戳,在定义update字段时,可以使用(注意勾选随mysql系统时间更新此字段)
create table BOOK
(
id NUMBER not null,
name VARCHAR2(20),
create_time DATE
);
alter table BOOK
add constraint PK_ID primary key (ID);
INSERT INTO book(ID, NAME , create_time) VALUES(1, '张三', to_date('2014-02-14 20:47:00','yyyy-mm-dd hh24:mi:ss'));
COMMIT;
--必须将 前台传入的 字符用to_date 转为 oracle日期,才可以insert成功
select to_date('2019-03-16 13:13:13', 'yyyy-mm-dd hh24:mi:ss') from dual;
INSERT INTO book(ID, NAME , create_time) VALUES(1, '张三', to_date('2014-02-14 20:47:00','yyyy-mm-dd hh24:mi:ss'));
COMMIT;
-- between 开始时间 and 结束时间 也要用 to_date
SELECT * FROM book b WHERE b.create_time BETWEEN to_date('2019-10-20 20:47:00','yyyy-mm-dd hh24:mi:ss') AND
to_date('2019-10-22 20:47:00','yyyy-mm-dd hh24:mi:ss');
--mybatis查询时间需要格式化为日期字符串
SELECT to_char(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') datetime FROM dual;
mybatis对 小于等于 进行转义 <![CDATA[<=]]> 30
mybatis oracle日期的TO_CHAR(B.EFFDT, 'yyyy-mm-dd hh24:mi:ss') AS "effdt", 即便数据库存的 年月日, 也要有hh24:mi:ss,
不写的话,用如下注解转json会报错
@JsonFormat(pattern = "yyyy-MM-dd", locale = "zh", timezone = "GMT+8")
调整plsql开发工具的背景色
PrefAutomaticStatistics=True
SelectedStatNames=
FixedHistory=24574443451744154505438738534343457743474469483146013315334132553361321133493423317734273325341531694603502933593465483547335015
=25814791464147954661476732094723470147274593469947253439346531233485314333933467310935033513347535494983464132273109468749214595
=2121
AutoCommitSQL=True
AutoExecuteSQL=False
AutoSelectSQL=True
NumberFieldsToChar=False
DateFieldsToChar=False
QueryResultStyle=1
QueryResultCount=20
NullValueColor=26367
MNullValueColor=6723891
AltRowColor=15073253
AltRowColorEnabled=True
KeywordsEnabled=True
KeywordsBold=True
KeywordsItalic=False
KeywordsColor=16711935
KeywordsBkg=0
CommentEnabled=True
CommentBold=True
CommentItalic=True
CommentColor=16776960
CommentBkg=0
StringsEnabled=True
StringsBold=True
StringsItalic=False
StringsColor=32768
StringsBkg=0
NumbersEnabled=True
NumbersBold=True
NumbersItalic=False
NumbersColor=32768
NumbersBkg=0
SymbolsEnabled=True
SymbolsBold=True
SymbolsItalic=False
SymbolsColor=26367
SymbolsBkg=0
CustomEnabled=True
CustomBold=True
CustomItalic=False
CustomColor=65280
CustomBkg=0
KeywordsCase=1
AutoReplaceEnabled=True
AutoReplaceFilename=D:\java\shortcuts.txt
BeautifierOptionsProgWindow=False
BeautifierOptionsTestWindow=False
BeautifierOptionsSQLWindow=True
BeautifierOptionsRepWindow=False
BeautifierOptionsPlanWindow=False
BeautifierAfterCreating=True
BeautifierAfterLoading=True
BeautifierBeforeCompiling=True
BeautifierBeforeSaving=True
BrowserFontName=Segoe UI
BrowserFontCharset=1
BrowserFontColor=0
BrowserFontSize=12
BrowserFontBold=False
BrowserFontItalic=False
BrowserBkg=10079487
GridFontName=Segoe UI
GridFontCharset=1
GridFontColor=0
GridFontSize=12
GridFontBold=False
GridFontItalic=False
GridBkg=-16777211
EditorFontName=宋体
EditorFontCharset=0
EditorFontColor=16776960
EditorFontSize=14
EditorFontBold=False
EditorFontItalic=False
EditorBkg=0
SpecialSpaceChar=183
SpecialTabChar=187
SpecialBreakChar=182
MainFontName=Segoe UI
MainFontCharset=1
MainFontSize=9
[KeyConfiguration]
File / Open / New / SQL Window=16465
File / Open / New / Command Window=16469
File / Save / Save=16467
File / Close / Close=16471
File / Application / Exit=32883
Edit / Clipboard / Cut=16472
Edit / Clipboard / Copy=16451
Edit / Clipboard / Paste=16470
Edit / Text / Undo=16474
Edit / Text / Redo=24666
Edit / Text / Select All=16449
Edit / Text / Recall Statement=16453
Edit / Text / Macro=123
Edit / Text / Macro / Record=122
Edit / Search / Find Replace=16454
Edit / Search / Find Next=16460
Edit / Search / Find Previous=24652
Edit / Search / Replace=16464
Edit / Search / Find Matches=16461
Edit / Selection / Indent=16457
Edit / Selection / Uppercase=24665
Edit / Selection / Lowercase=24664
Edit / Selection / Comment=16575
Edit / Selection / Uncomment=24767
Edit / Navigation / Go to Line=16455
Edit / Breakpoints / Toggle=16450
Session / Action / Execute=119
Session / Action / Commit=121
Session / Action / Rollback=8313
Session / Action / Break=8219
Tools / Source / Explain Plan=116
Tools / Source / Code Assistant=32959
View / Windows / Full Screen=16506
Help / Oracle / Oracle HTML Manuals=112
Window: Next Window=16393
Window: Previous Window=24585
Window: Next Tab page=16456
Window: Previous Tab page=24648
Editor: Start of Document=16417
Editor: End of Document=16418
Editor: Start of Line=36
Editor: End of Line=35
Editor: Delete Line=16460
Editor: Delete Next Word=16430
Editor: Delete Prev Word=16392
Editor: Word Left=16421
Editor: Word Right=16423
Editor: Set Bookmark=16459
Editor: Navigate Back=32805
Editor: Navigate Forward=32807
Editor: Font size increase=16491
Editor: Font size decrease=16493
Editor: Font size 100%=16480
Debug: Start debugger=120
Debug: Run=16466
Debug: Step Into=16462
Debug: Step Over=16463
Debug: Step Out=16468
SQL Window: Previous SQL=16422
SQL Window: Next SQL=16424
SQL Window: Fetch next page=32802
SQL Window: Fetch last page=32803
SQL Window: Execute current statement=16503
Ribbon Tab: File=32838
Ribbon Tab: Project=32848
Ribbon Tab: Edit=32837
Ribbon Tab: Session=32851
Ribbon Tab: Tools=32852
Ribbon Tab: Configure=32835
Ribbon Tab: View=32854
Ribbon Tab: Help=32840
Ribbon Tab: Plug-Ins=32856
新建一个 shortcuts.txt 放到D:\java\shortcuts.txt, 内容如下
i=INSERT
u=UPDATE
s=SELECT * FROM
f=FROM
w=WHERE
o=ORDER BY
d=DELETE
df=DELETE FROM
sf=SELECT * FROM
sc=SELECT COUNT(*) FROM
sfu=SELECT * FROM FOR UPDATE
cor=CREATE OR REPLACE
p=PROCEDURE
fn=FUNCTION
t=TIGGER
v=VIEW
sso=SET serveroutput ON;
Oracle Client(客户端) 安装与配置
https://www.oracle.com/database/technologies/112010-win64soft.html
双击exe, 安装类型选择管理员, 下面界面按住shift,全选中文和英文
在登陆历史里设置如下, 可以不用密码直接登陆pl/sql
MANGO/[email protected]/HR91DEV
NUMBER [ (p [, s]) ]
p(精度): 1-38
s(小数位数): -84-127
不指定p(整数)和s(小数) 即:number 省略()及()内的p,s, 表示允许范围的最大值, 都可以存储
用于表示浮点数,其精度和小数位数都是oracle所能支持的最大,
不指定小数 即:number(p) 即s=0
表示整数,有效位数=p
--追加 小时, 分钟, 秒
SELECT to_date('2019-10-21 00:00:01','yyyy-mm-dd hh24:mi:ss') +23/24 +23/24/60+23/24/60/60 FROM dual;
--oracle 查看一张表共有几个字段
select count(*) from user_tab_columns t where t.TABLE_NAME='表名/视图名(必须是大写才可以查询到!)'
--写完一句sql,光标在最右边(如果不在最右边,你也可以end后,shift+home选中),
--你可以,shift+home选中 光标所在行的sql, f8执行即可
--oracle的nvl()函数, 相当于mysql的ifnull()
select nvl (null, '0') from dual;
--oracle的uuid 32位大写 mysql是 select uuid(); 32位小写且加4个短-
select sys_guid from dual;
-- between 开始时间 and 结束时间 也要用 to_date
SELECT * FROM book b WHERE b.create_time BETWEEN to_date('2019-10-20 20:47:00','yyyy-mm-dd hh24:mi:ss') AND
to_date('2019-10-22 20:47:00','yyyy-mm-dd hh24:mi:ss');
--mybatis查询时间需要格式化为日期字符串 记得tochar一定要起as 别名
SELECT to_char(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') datetime FROM dual;
后者字符在前面单词出现的位置(从1开始) 这里必须是单引号哦 from dual不能省略, 在mysql可以省略
select instr('helloworld','wo') from dual; --返回结果:6 即“w”开始出现的位置
select instr('helloworld','l',2,2) from dual; --返回结果:4 也就是说:在"helloworld"的第2(e)号位置开始,查找第二次出现的“l”的位置
select substr('123', 0, 2); --结果是: 12 从0脚标开始取2位
先简单的介绍下oracle的substr函数和instr函数,后面我会用这2个函数模拟mysql的substring_index函数
oracle和mysql都有concat函数, 将多个字段拼接
--oracle和mysql的 转大写, 转小写 函数是一样的
select lower('Q') from dual;
select upper('q') from dual;
ctrl+tab alt+←/→ 都可以切换sql window窗口
文档注释的快捷键设置, 不是单行注释的快捷键 --我的注释
ctrl+q打开sql window
ctr+u打开 command window
1.将.sql文件拖动到pl/sql的brower或sql window空白处,会自动打开sql文件,点击f8执行即可。
也可以点击下图的图标,打开.sql文件,点击f8执行
2.ctrl+u 打开command window窗口, 执行 .sql文件
3.export user objects 包括 表结构,表数据,函数, 存储过程,触发器,视图等
4.export tables 仅导出表结构 和 表数据
点击解锁, select for update,点击锁, 修改完, 点 对号,保存到本地内存中, 点击 绿色提交事务
plsql中,你写 select cid(字段名小写或大写, oracle都可以找到表中的字段) from table
oracle查询 as 驼峰命名(注意双引号不能少), 和 mybatis 返回的vo对象 映射 sql美化按钮,可以将 小写 表名 美化为 大写 的表名
如何查看一个表的表结构:字段定义 和 注释comment
1. select * from pm_guideline; ctr+鼠标左键 表名, 就会出现小手, 点击进入表结构
2.打开命令窗口-》(命令窗口或者叫"command window")不是"sql window/sql 窗口"。然后用命令desc tableName回车。如desc book 回车即可查看表结构, select * from pm_guideline; ctr+鼠标左键 表名, 就会出现小手, 点击进入表结构