oracle plsql 使用

 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

 

PLSQL怎样导出oracle表结构和数据

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+鼠标左键 表名, 就会出现小手, 点击进入表结构

发布了78 篇原创文章 · 获赞 12 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_29883183/article/details/87981936