一、PL/SQL 基本语法
PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展。
(1)
(2)
(3)
(5)
(6)
(7)数据类型
- Number 数字型
- Varchar2 变长字符型,最大32767个字符
- Date 日期型
- Boolean 布尔型(TRUE,FALSE,NULL三者取一)
- Char 定长字符型,最大32767个字符
- Int 整数型
- Pls_integer 整数型,产生溢出时出现错误
- Binary_integer 整数型,表示带符号的整数
- Long 变长字符型,最长2GB
(8)标识符
用来命名常量、变量、游标、程序和包1)必须以字母(A-Z)开头
2)其后跟字母、数字(0-9)或特殊字符$#_
3)标识符不超过30字符
4)标识符中不包含空格
5)标识符不能为保留字
6)标识符不区分大小写
非法标识符:12_sal; first-name; sec name;
(9)变量的定义
变量名 数据类型 [not null] [:= 值]例1: vn_snum number;
例2: vs_name varchar2(10);
例3: vn_sid tab_server.sid%type ; --锚定列
(10)常量定义
常量名 constant 数据类型 [not null] :=值
例1:vn_num constant number := 10;
(11)
(12)赋值语句: 赋值语句
包括直接赋值和间接赋值
直接赋值 v_num := 20000;
间接赋值(select into、fetch into)
select max(innum), min(innum)
into v_max, v_min
from tab_ingoods;
二、应用案例
编写一个匿名块程序实现:
根据一个员工姓名的本月绩效(变量初始值为10)计算并输出该员工本月收入
本月收入=基本工资(salary)+佣金百分比(COMMISSION_PCT)*绩效
set serveroutput on --dbms_output 输出有效,用在sql developer
declare
v_b number:=10; --初始值
v_lastname varchar2(10):=‘XXX';
-- v_firstname employees.first_name%type; --锚定变量
v_salary number(6,2);
begin
select nvl(salary,0)+nvl(COMMISSION_PCT,0)*v_b
into v_salary --间接赋值
from employees where last_name=v_lastname;
dbms_output.put_line(v_lastname||'本月的工资为:'||v_salary);
end;
三、PL/SQL 基本结构
(1)条件控制语句
declare
theGrade number:= 88;
begin
if theGrade>=90 then
dbms_output.put_line('杰出');
elsif theGrade>=80 then
dbms_output.put_line('优秀');
elsif theGrade>=60 then
dbms_output.put_line('合格');
else
dbms_output.put_line('不及格');
end if;
end;
(2)循环
简单循环
set serveroutput on;
declare
i number(8):=5;
begin
<<first_loop>>
loop
dbms_output.put_line('i = '||i);
i:= i-1;
exit first_loop when i = 0;
end loop;
dbms_output.put_line('LOOP循环已经结束!');
end;
For循环
beginFor循环
for i in -3..3 loop
dbms_output.put_line('i = '||i);
end loop;
dbms_output.put_line('FOR循环已经结束!');
end;
While循环
declare
i number(8):=5;
While循环
begin
while(i > 0) loop
dbms_output.put_line('i = '||i);
i:=i-1;
end loop while_loop;
dbms_output.put_line('WHILE循环已经结束!');
end;
Case语句
set serveroutput Case语句on
declare
gender varchar2(20):= '男';
begin
case gender
when '男' then dbms_output.put_line('勇敢');
when '女' then dbms_output.put_line('漂亮');
else dbms_output.put_line('人妖');
end case;
end;
Goto语句
DECLARE
i number;
BEGIN
i:=5;
<<repeat_loop>> --循环点
DBMS_OUTPUT.PUT_LINE('i='||i);
i:=i-1;
IF i>0 THEN
GOTO repeat_loop; --小于5,就goto到repeat_loop
END IF;
END;
四、异常处理
DECLARE
v_empno employees.employee_id%TYPE:= &empno;
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE employee_id = v_empno;
IF v_sal<=15000 THEN
dbms_output.put_line('编码为'||v_empno||'员工该加100元!');
ELSE
dbms_output.put_line('编码为'||v_empno||'员工工资已经超过规定值!');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('数据库中没有编码为'||v_empno||'的员工');
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('程序运行错误!请使用游标');
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE||'---'||SQLERRM);
END;