PL是Procedural Language的缩写, 表示过程化编程语言
PL/SQL主要包括DECLARE部分, BEGIN….END部分, 和EXCEPTION部分
[DECLARE declaration_statments;]
BEGIN
executable_statment;
[EXCEPTION ecception_handing_statment;]
END;
/
Oracle 标识符规定
- 名称必须以字母开头
- 名称长度不能超过30个字符
- 名称中不能包含减号和空格
- 不能是SQL保留字
除了可以使用与SQL相同的数据类型以外, Oracal还专门为了PL/SQL程序块提供了特定类型
数值数据类型
字符数据类型
布尔数据类型
日期和时间间隔数据类型
大对象数据类型
声明常量时使用CONSTANT关键字, 并且必须在声明时就为该常量赋值,而且在程序其他部分不能修改该常量的值
constant_name CONSTANT data_type {:= |DEFAULT} value;
声明变量时候不需要使用CONSTANT关键字, 而且可以不用为其赋初始, 其值可以在程序的其他部分被修改
variable_name data_type [ [NOT NULL ] {:= | DEFAULT} value];
使用PL/SQL 程序块, 输出显示scott.emp表中的部分数据数据
SET SERVEROUTPUT ON -- 命令打开服务器输出
DECLARE
emp_number CONSTANT NUMBER(4) := 7900;
emp_name varchar2(10);
emp_job varchar2(9);
emp_sal number(7, 2);
BEGIN
SELECT ename, job, sal INTO emp_name, emp_job, emp_sal -- select...into 语句可以为变量赋值
FROM scott.emp WHERE empno = emp_number;
DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number); -- 控制台输出语句, || 用来连接字符串
DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || emp_name);
DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || emp_job);
DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || emp_sal);
END;
/
%TYPE类型
PL/SQL 程序块中, 有时候会使用表中的数据为变量赋值, 例如示例中的emp_name 变量, 此时需要用户知道变量所对应的数据类型, 否则不能确定变量的数据类型, 此时使用%TYPE类型就可以解决这类问题
%TYPE 用于隐式的将变量的数据类型指定为对应列的数据类型
定义形式如下
variable_name table_name.column_name%TYPE
[[NOT NULL] {:=|DEFAULT} value];
修改上次示例, 使用%TYPE类型
SET SERVEROUTPUT ON -- 命令打开服务器输出
DECLARE
emp_number CONSTANT emp.empno%TYPE := 7900;
emp_name emp.ename%TYPE;
emp_job emp.job%TYPE;
emp_sal emp.sal%TYPE;
BEGIN
SELECT ename, job, sal INTO emp_name, emp_job, emp_sal -- select...into 语句可以为变量赋值
FROM scott.emp WHERE empno = emp_number;
DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number); -- 控制台输出语句, || 用来连接字符串
DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || emp_name);
DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || emp_job);
DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || emp_sal);
END;
/
%ROWTYPE 类型
%TYPE 类型针对表中的某一列, %ROWTYPE针对一张表, 或一行
定义形式如下
variable_name table_name%ROWTYPE;
修改上次示例, 使用%RWOTYPE类型
SET SERVEROUTPUT ON -- 命令打开服务器输出
DECLARE
emp_number CONSTANT emp.empno%TYPE := 7900;
one_emp emp%ROWTYPE
BEGIN
SELECT * INTO ont_emp -- select...into 语句可以为变量赋值
FROM scott.emp WHERE empno = emp_number;
DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number); -- 控制台输出语句, || 用来连接字符串
DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || one_emp.ename);
DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || one_emp.job);
DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || one_emp.sal);
END;
/记录类型和表类型
PL/SQL记录类型和表类型都是用户自定义的复合数据类型, 其中记录数据类型可以存储多个字段值, 类似于表中的一行数据; 表类型则可以存储多行数据.
记录类型
记录类型与数据库中表的行结构非常相似, 使用记录类型定义的变量可以存储由一个或多个字段组成的一行数据
创建记录类型需要用到TYPE语句, 语法如下
TYPE record_name IS RECORD (
field_name data_type [ [not null] {:= : DEFAULT} value][, ....]
);
在PL/SQL中创建一个记录类型, 然后使用该类型定义一个变量, 并赋值
set serveroutput on
declare
type emp_type is record (
empno number(4),
ename varchar2(10),
job varchar2(9),
sal number(7, 2)
);
one_emp emp_type;
begin
select empno, ename, job, dal
into one_emp
from scott.emp where empno=7900;
DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number); -- 控制台输出语句, || 用来连接字符串
DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || one_emp.ename);
DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || one_emp.job);
DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || one_emp.sal);
end;
/
表类型
使用记录类型只能保存一行数据, 这限制了select语句的返回行数, Oracle提供了一种自定义类型, 表类型, 可以接收多行数据. 类似于表.
TYPE table_name is table of data_type [ not null ]
index by binary_integer;
创建表类型
set serveroutput on
declare
type emp_type is table of emp%ROWTYPE
index by BINARY_INTEGER;
new_emp emp_type;
begin
new_emp(1).empno := 6800;
new_emp(2).empno := 6900;
new_emp(1).ename := 'TRACY';
end;
/
IF condition1 THEN
statements1
[elseif condition2 then]
statements2
[else
statemtnts3]
end if;
在plsql中, 使用IF条件语句判断成绩61分所处的等级
set serveroutput on;
declare
score BINARY_INTEGER := 61;
begin
if score >= 90 then
DBMS_OUTPUT.PUT_LINE('优秀');
elseif score >= 80 then
DBMS_OUTPUT.PUT_LINE('良好');
elseif score >= 60 then
DBMS_OUTPUT.PUT_LINE('及格');
else
DBMS_OUTPUT.PUT_LINE('不及格');
end if;
end;
/
简单case语句表达式
case search_expression
when expression1 then result1;
when expression2 then result2;
...
[else default_result;]
end case;
使用简单的case语句判断’良好’所对应的分数阶段, 如下
set serveroutput on
declare
grade varchar2(4) := '良好';
begin
case grade
when '优秀' then DBMS_OUTPUT.PUT_LINE('大于等于90分');
when '良好' then DBMS_OUTPUT.PUT_LINE('大于等于80分');
else DBMS_OUTPUT.PUT_LINE('小于60分');
end case;
end;
/
搜索表达式
搜索表达式使用条件来确定返回值
case
when condition1 then result1;
when condition2 then result2;
when condition3 then result3;
...
[else default_result;]
end case;
与简单表达式相比, case关键字后不跟待求表达式, 而when子句中表达式也换了条件语句(condition)
使用case语句判断处于61分以下的成绩
SET SERVEROUTPUT ON
declare
score binary_integer := 61;
begin
case
when score >= 90 then DBMS_OUTPUT.PUT_LINE('优秀');
when score >= 80 then DBMS_OUTPUT.PUT_LINE('良好');
when score >= 60 then DBMS_OUTPUT.PUT_LINE('及格');
else DBMS_OUTPUT.PUT_LINE('不及格');
end case;
end;
/
使用和java的do…while语句差不多
LOOP
statements;
[exit [when condition]];
end loop;
使用loop语句, 输出1到10
DEClARE
i binary_integer := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i := i + 1;
exit when i > 10;
end loop;
end;
/
while语句是在loop语句的基础上添加循环条件
WHILE condition
LOOP
statments;
end loop;
使用while输出1-10
declare
i binary_integer := 1;
while i < 10
loop
DBMS_OUTPUT.PUT_LINE(i);
i := i + 1;
end loop;
end;
/
for是在loop语句生添加循环次数
for loop_variable in [reverse] lower_bound .. upper_bound
loop
statements;
end loop;
使用for语句输出
BEGIN
for i in 1 .. 10
LOOP
DBMS_OUTPUT.PUT_LINE(i);
end loop;
end;
/