前言
PL/SQL是Oracle数据库对SQL语句的扩展,可以让我们实现
if
、else
等逻辑判断、for循环执行等功能加入到SQL逻辑的执行过程中,很大程度上提高了SQL的灵活性,也能让我们更好的处理日常工作中遇到的一些复杂的业务场景。本文将对PL/SQL语言的基本语法和使用进行简要的讲解,希望能够对各位读者有所帮助。
一、PL/SQL简介
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算
二、PL/SQL语法介绍
1、PL/SQL的总体书写格式
[declare]
--声明变量
begin
-- 程序体
[exception]
--例外;异常
end;
--declare和exception部分可以没有,但是begin部分和end必须要有。
其中declare
和exception
为可选模块,作用分别是申明变量和异常处理,begin
和end
为必要模块,我们一般在begin
模块中写入我们的具体代码语句,end
用于标识语句已经结束。
案例输出结果
(二)变量的定义
有些读者可能已经注意到,在上面的例子中我们定义了一个变量i
,并在后面的语句中使用了这个变量。在
PL/SQL中可使用标识符来声明变量、常量、游标、用户定义的异常等,并在SQL语句或过程化的语句中使用。
那么变量的定义格式是怎么样的呢?
变量名称 变量类型 [
NOT NULL]
[
:= |DEFAULT expr]
;
其中:=
为赋值符号,后面接着具体要赋的值。使用NOT NULL
约束条件定义变量时,必须为变量赋予一个值。
变量的类型分解类型可以分为如下三类:
变量分类 | 变量类型 |
---|---|
标量类型 | 数字、字符、布尔、日期时间 |
LOB类型 | BFILE、BLOB、CLOB、NCLOB |
属性类型 | %TYPE、%ROWTYPE |
其中,标量类型只能存储单值、内部没有分量(即非对象类型),像数值、字符、日期等就都属于是标量类型;
LOB类型表示大型的对象;
属性类型看起来似乎有点抽象,其实它相当于是一种逻辑的抽象,比如%TYPE
可以用来表示表中的字段属性,%ROWTYPE
可以表示表中的数据行,我们把这些属性抽象成一个对象来使用,可以减少我们在实际写代码的工作量。
下面我们来用属性类型的变量来写一个小例子:
在这个案例中我们想要打印出员工号为7566的姓名,但是我们并不知道在
EMP
表中,ENAME
的数据类型是什么,我们可以直接使用表名.列名%TYPE
的方式来将这个字段的类型赋予给变量名v_name
。并在执行查询语句时,使用into
关键字将查询到的字符赋值给变量v_name
,最后实现变量的输出。同理,
%ROWTYPE
的使用也十分的方便,再看一下下面这个小例子%ROWTYPE演示用例
%ROWTYPE演示结果
我们把v_row的数据类型定义为ROWTYPE
,表示一行数据,在查询过程中将查询到的数据用into
关键字赋值给我们的行变量。最后使用行变量.字段名称
的方式输出对应的结果
(三)控制语句结构之条件控制
1、 条件语句IF
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSE
其它语句
END IF;
演示用例:
declare
i int := dbms_random.value(0,10);
begin
if i<4 then
dbms_output.put_line('num is less then 4');
elsif i<6 then
dbms_output.put_line('num is less then 6');
else
dbms_output.put_line('num is more then or eq 6');
end if;
end;
这里需要记住elsif
的写法,不要拼写错误了
2、 条件语句CASE
CASE 条件表达式
WHEN 条件表达式结果1 THEN
语句段1
WHEN 条件表达式结果2 THEN
语句段2
......
WHEN 条件表达式结果n THEN
语句段n
[ELSE 条件表达式结果]
END;
------------------
CASE
WHEN 条件表达式1 THEN
语句段1
WHEN 条件表达式2 THEN
语句段2
......
WHEN 条件表达式n THEN
语句段n
[ELSE 语句段]
END;
演示用例:
DECLARE
V_grade char(1) := UPPER('&p_grade');
V_appraisal VARCHAR2(20);
BEGIN
V_appraisal :=
CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||' Appraisal: '|| v_appraisal);
END;
DECLARE
v_first_name employees.first_name%TYPE;
v_job_id employees.job_id%TYPE;
v_salary employees.salary%TYPE;
v_sal_raise NUMBER(3,2);
BEGIN
SELECT first_name, job_id, salary INTO
v_first_name, v_job_id, v_salary
FROM employees WHERE employee_id = &emp_id;
CASE
WHEN v_job_id = 'PU_CLERK' THEN
IF v_salary < 3000 THEN v_sal_raise := .08;
ELSE v_sal_raise := .07;
END IF;
WHEN v_job_id = 'SH_CLERK' THEN
IF v_salary < 4000 THEN v_sal_raise := .06;
ELSE v_sal_raise := .05;
END IF;
WHEN v_job_id = 'ST_CLERK' THEN
IF v_salary < 3500 THEN v_sal_raise := .04;
ELSE v_sal_raise := .03;
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('该岗位不涨工资: '||v_job_id);
END CASE;
DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id
||'、的工资是'||v_salary
||'、工资涨幅是'||v_sal_raise);
END;
这里要注意,演示用例在定义变量的时候使用到了&
这个符号,这个符号表示该变量的值会在执行过程中由执行者手动输入再确定。
(四)控制语句结构之循环控制
PL/SQL中一共有三种循环方式,分别是while、loop和for。下面来讲解一下三种循环方式的使用:
1. loop循环(类似于java中的do while循环)
loop
要执行的语句
exit when <条件语句>;
end loop;
演示用例:
declare
i int := 1;
begin
loop
dbms_output.put_line(i);
i := i+1;
exit when i>10;
end loop;
end;
2. while循环
while <布尔表达式> loop
要执行的语句;
end loop;
演示用例:
declare
i int := 1;
begin
while i<10 loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
3. for循环
for 循环计数器 in [reverse] 下限..上限 loop
要执行语句;
end loop;
演示用例:
declare
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
使用for循环的时候,可以不用再前面的declare
模块中定义数值变量i
,在for
中直接使用即可。
(五)代码块注释
在PL/SQL中使用--
表示单行注释,用/**/
表示多行注释
关于PL/SQL基本的入门语法就介绍到这里了,有需要了解更多PL/SQL的高阶用法的读者,可以在参考资料中阅读或者自行百度。
参考资料:
PLSQL编程详解 :https://www.jianshu.com/p/3d5acb46936e
PL/SQL 编程语言 : https://www.cnblogs.com/wlym/p/7455650.html
网友评论