PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展,在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算,MySQL不支持PL/SQL,但支持Navicat Premium。
SQL可以编写程序PL,可以定义变量,可以使用语句流程(if、else、case、for、while),打印信息,处理异常等。
一、 开发窗口
二、 输出
dbms_output是数据库定义的程序包,类似于Java中的类,put_line是输出信息,还有一个函数put也是输出,但是信息在缓存中不输出,当put_line时把缓存中的数据一起输出。
BEGIN
dbms_output.put(1); --
dbms_output.put(2); --
-- 注掉此行代码程序不会输出内容
dbms_output.put_line(3); -- 123
end;
三、 定义变量
declare
-- declare和begin中间是定义变量的地方,其他地方不能定义变量
-- firstName是变量名,varchar是数据类型
-- 定义变量赋初始值用 :=赋值
firstName VARCHAR(2) :='张';
-- 定义变量赋初始值用default赋值
age INTEGER DEFAULT 18;
-- 用表中的字段来定义变量,变量的数据类型和该字段保持一致
-- 这样的好处是:字段数据类型改变时,变量不用修改,变量
-- 的长度和精度随着字段来定义
v_empno emp.empno%TYPE
-- 用户emp表的记录作为类型定义变量
-- 通过变量可以获取变量中的各字段信息
v_emp%ROWTYPE
BEGIN
-- 赋值不能用等号,等号用来判断,:=才是赋值
firstName:='张';
-- 两个内容拼接时用||
dbms_output.put_line(firstName||'-'||age); -- 张-18
end;
四、 if语句
declare
-- Local variables here
i integer;
begin
-- if判断要写then和end if,某个变量是否为null不能用等号,要用is
-- 不等于要用is not
IF i IS NULL THEN
dbms_output.put_line('i is null');-- i is null
END IF;
end;
else if的使用:
declare
-- Local variables here
i integer;
begin
i:=65;
IF i >= 90 THEN
dbms_output.put_line('优秀');
ELSIF i >= 80 THEN
-- elsif是else if的缩写
dbms_output.put_line('良好');
ELSIF i >= 60 THEN
dbms_output.put_line('及格'); -- 及格
ELSE
dbms_output.put_line('不及格');
END IF;
end;
五、 for循环
例题:求100以内的质数(用到了嵌套循环)
declare
-- i和j是循环变量
i integer;
j INTEGER;
flag INTEGER;-- 是否质数的标记
prime CONSTANT INTEGER :=1;-- constant定义常量,表示是质数
BEGIN
-- 质数是大于1的自然数
FOR i IN 2..100 LOOP
flag:=prime;-- 初始值为prime,默认是质数
-- 质数是除1和自身外,不能被其它数整除,排除1后,其它一但能整除就不是质数
-- in是关键字,说明变量是在此范围内
FOR j IN 2..sqrt(i) LOOP
-- MOD是数学函数,求余
IF MOD(i,j)=0 THEN
flag := 0;
-- 如果取余为0,证明能整除,不是质数,exit跳出循环
EXIT;
END IF;
END LOOP;
IF flag = prime THEN
dbms_output.put_line(i||'是质数');
END IF;
END LOOP;
end;
六、 while循环
declare
-- Local variables here
i INTEGER DEFAULT 0;
random_num INTEGER;
BEGIN
-- DBMS_RANDOM程序包可以生成随机数,这个包中的value函数
-- 可以生成[0-1)之间的小数
random_num:=DBMS_RANDOM.value()*10;
-- while加循环条件
WHILE i < random_num LOOP
dbms_output.put_line(i);
i:=i+1;
END LOOP;
end;
七、 loop...end loop
loop…end loop格式的循环条件是在循环体中进行判断,当达到某一条件时退出循环。
declare
-- Local variables here
i INTEGER DEFAULT 0;
random_num INTEGER;
BEGIN
-- DBMS_RANDOM程序包可以生成随机数,这个包中的value函数
-- 可以生成[0-1)之间的小数
random_num:=DBMS_RANDOM.value()*10;
LOOP
IF i > random_num THEN
EXIT;-- 退出循环
END IF;
dbms_output.put_line(i);
i:= i +1;
END LOOP;
end;
八、 异常处理
declare
-- Local variables here
i integer;
myex EXCEPTION;-- 定义异常对象
PRAGMA EXCEPTION_INIT(myex,-20000);-- 给异常对象赋值错误号标识
myex2 EXCEPTION;
begin
dbms_output.put_line(1);
RAISE myex;-- 抛出异常
-- 定义加抛出,指定错误号和错误提示信息
--raise_application_error (-20000/*-20000——-20999*/, '自定义错误信息');
EXCEPTION
WHEN myex OR myex2 THEN -- 处理多个异常
dbms_output.put_line('eore');
--WHEN myex THEN myex只能处理一次,和上面的二选一
-- dbms_output.put_line(2||'-'||SQLCODE||'-'||SQLERRM);
WHEN OTHERS THEN -- 其他未处理的异常打印错误号和错误信息
dbms_output.put_line(3||'-'||SQLCODE||'-'||SQLERRM);
end;