PL/SQL入门使用详解

admin

前言

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的使用也十分的方便,再看一下下面这个小例子

我们把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

Copyright © 2088 中国战将网 - 顶级游戏活动平台 All Rights Reserved.
友情链接