目录
[一、CRUD 增删改查(基础)](#一、CRUD 增删改查(基础))
[二、常用 SQL](#二、常用 SQL)
[1. exists 搭配 select 1](#1. exists 搭配 select 1)
[2. FROM DUAL](#2. FROM DUAL)
[3. INSTR()函数](#3. INSTR()函数)
[4. 提取字串](#4. 提取字串)
[5. IF 条件](#5. IF 条件)
[6. 循环](#6. 循环)
[7. 格式化文本(换行)](#7. 格式化文本(换行))
[8. 游标](#8. 游标)
[① 系统自带:SYS_REFCURSOR](#① 系统自带:SYS_REFCURSOR)
[② 自定义强类型](#② 自定义强类型)
[① 定义游标时赋值](#① 定义游标时赋值)
[② 打开游标时赋值](#② 打开游标时赋值)
[9. SQL编辑器中的输出语法](#9. SQL编辑器中的输出语法)
[10. SQL编辑器中的异常信息](#10. SQL编辑器中的异常信息)
[11. 查询clob字段的值](#11. 查询clob字段的值)
[① 首先判断clob字符长度](#① 首先判断clob字符长度)
[② 查询内容](#② 查询内容)
[12. 日期处理(decode、nvl)](#12. 日期处理(decode、nvl))
[13. LAG() 和 LEAD() 窗口函数](#13. LAG() 和 LEAD() 窗口函数)
[(1)LAG(column, n)](#(1)LAG(column, n))
[(2)LEAD(column, n)](#(2)LEAD(column, n))
一、CRUD 增删改查(基础)
(一)查询
查询前10行记录
sql
SELECT ROWNUM, t.* FROM XXX t WHERE ROWNUM <= 10;
(二)插入
sql
INSERT INTO 表名 (栏位名1,栏位名2) VALUES ('值1','值2'));
注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。
(三)更新
sql
UPDATE 表名
SET 栏位名 = '值', 栏位名2 = '值2'
WHERE 栏位名 = '值' and 栏位名2 = '值2';
注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。
(四)清空
sql
TRUNCATE TABLE 表名;
注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。
二、常用 SQL
1. exists 搭配 select 1
select 1常用于判断子查询是否成功,返回的结果是满足查询条件的每行记录都返回1。
exists (子查询) 常搭配select 1子查询,用于判断子查询是否包含行,返回的结果是布尔值。
例如:
sql
select * from Book Bk where exists (select 1 from Author where Bk.id = Author.bookid)
其中,若 select 1 这个子查询有返回值,则子查询满足条件,exists 返回True(理解:Book表中id是否在Author表中的bookid也有对应)。
2. FROM DUAL
理解:DUAL 是 Oracle 的虚拟表,不能更改该表(包括数据)。它只有一行一列。
作用:常用于从系统函数中取值时,保证查询语句完整来正常执行。
例如,查询当前系统时间:select sysdate from dual。
3. INSTR()函数
字符查找函数。查找一个字符串在另一个字符串中首次出现的位置,若找不到,则返回0。起始位置从1开始。
例如:INSTR("这是一个字符串,一个字符串喔", '一个')的结果是3。
4. 提取字串
substr(string, start_position, length)
5. IF 条件
(1)基本写法
sql
IF ... THEN ... END IF;
(2)嵌套写法
sql
IF <condition1> THEN
-- 处理条件1为TRUE时的逻辑
IF <condition2> THEN
-- 处理条件2为TRUE时的逻辑
ELSE
-- 处理条件2为FALSE时的逻辑
END IF;
ELSE
-- 处理条件1为FALSE时的逻辑
END IF;
6. 循环
(1)for循环
sql
FOR i in 1 .. length(变量名)
LOOP
...
END LOOP;
(2)loop循环
相当于do..while循环
sql
loop
...
exit when 条件;
end loop;
7. 格式化文本(换行)
写法: CHR(13) || CHR(10)
8. 游标
(1)游标类型
① 系统自带:SYS_REFCURSOR
举例:
sql
游标名 SYS_REFCURSOR;
② 自定义强类型
举例:
sql
TYPE 游标类型名 IS REF CURSOR; -- 自定义REF CURSOR 强游标类型
游标名 游标类型名; -- 定义游标
(2)游标属性
sql
%isopen -- 游标是否打开
%rowcount -- 已从游标中读取的记录数
%found -- 该行是否有值
%notfound -- 该行是否没有值
(3)用法
① 定义游标时赋值
在begin前定义:
sql
cursor 游标名 IS SQL查询语句; --- 赋值SQL语句
打开:
sql
open 游标名; --- 使用前必须先打开
获取一行游标:
sql
fetch 游标名 into 变量名 ; --- (变量名类型定义:表名.栏位名%type)
关闭:
sql
close 游标名 ; --- 一经打开记得关闭
② 打开游标时赋值
在begin前定义:
sql
TYPE 游标类型 IS REF CURSOR; 游标名 游标类型; -- REF CURSOR 类型(强类型)
打开:
sql
OPEN 游标名 FOR SQL查询语句; --- 赋值SQL语句
9. SQL编辑器中的输出语法
sql
DBMS_OUTPUT.PUT_LINE(' ');
注意:
DBMS_OUTPUT最大長度为32767。若想全部打印且不报异常,则如下:
首先定义时,
sql
maxLength CONSTANT NUMBER := 32767; -- DBMS_OUTPUT最大長度
然后begin时,
sql
curLength := LENGTH(SQL变量名); --- 获取当前SQL语句的最大长度
FOR i IN 1..CEIL( curLength / maxLength) LOOP --- 循环打印出SQL语句
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQL变量名, (i - 1) * maxLength + 1, maxLength));
END LOOP;
10. SQL编辑器中的异常信息
sql
DBMS_UTILITY.format_error_backtrace
例如,打印出异常信息:
sql
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.format_error_backtrace);
11. 查询clob字段的值
该内容针对的是字段,若是Test,直接使用下方的变量值输出框即可查看CLOB值(注意使用 "=> :变量名"的冒号形式)。
(1)用PLSQL的Editor查看
在PLSQL中的表格数据中,右击,选择Open in Editor。
或者直接点击该单元格旁边的三点符号。

(2)用SQL语句查询
① 首先判断clob字符长度
sql
SELECT DBMS_LOB.GETLENGTH(栏位名)
FROM 表名
WHERE ROWNUM <10;
② 查询内容
sql
-- 查询某栏位的前3500个字符,从第1个位置开始。
-- 使用SUBSTR方法时,长度不可超出4000。
SELECT DBMS_LOB.SUBSTR(栏位名, 3500, 1)
FROM 表名
WHERE ROWNUM <10;
12. 日期处理(decode、nvl)
(1)decode函数
sql
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
--- 若条件1等于值1,则返回值1,然后依次检查,若都不满足,则默认缺省值,若没有缺省值,则默认为null。
(2)nvl函数
sql
nvl(column, 默认值) --- 若某字段为null,则显示默认值。
13. LAG() 和 LEAD() 窗口函数
(1)LAG(column, n)
访问当前行之前的最近某行中的数据。
sql
LAG(column, 1, 默认值) OVER(ORDER BY column) --- 查询column该字段中每行的前面最近1行的数据,若无值则默认值。
(2)LEAD(column, n)
访问当前行之后的最近某行中的数据。
sql
LEAD(column,2, 默认值) OVER(ORDER BY column) --- 查询column该字段中每行的后面次近1行(第2近行)的数据,若无值则默认值。
注意:
一般需要搭配排序(如OVER(ORDER BY column)),LAG和LEAD函数才有意义。