一、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
declarev_b number:=10; --初始值v_lastname varchar2(10):=‘XXX';-- v_firstname employees.first_name%type; --锚定变量v_salary number(6,2);
beginselect nvl(salary,0)+nvl(COMMISSION_PCT,0)*v_binto v_salary --间接赋值from employees where last_name=v_lastname;dbms_output.put_line(v_lastname||'本月的工资为:'||v_salary);
end;
三、PL/SQL 基本结构
(1)条件控制语句
declaretheGrade number:= 88;
beginif theGrade>=90 thendbms_output.put_line('杰出');elsif theGrade>=80 thendbms_output.put_line('优秀');elsif theGrade>=60 thendbms_output.put_line('合格');elsedbms_output.put_line('不及格');end if;
end;
(2)循环
简单循环
set serveroutput on;
declarei number(8):=5;
begin<<first_loop>>loopdbms_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 loopdbms_output.put_line('i = '||i);end loop;dbms_output.put_line('FOR循环已经结束!');
end;
While循环
declarei number(8):=5;
While循环
beginwhile(i > 0) loopdbms_output.put_line('i = '||i);i:=i-1;end loop while_loop;dbms_output.put_line('WHILE循环已经结束!');
end;
Case语句
set serveroutput Case语句on
declaregender varchar2(20):= '男';
begincase genderwhen '男' then dbms_output.put_line('勇敢');when '女' then dbms_output.put_line('漂亮');else dbms_output.put_line('人妖');end case;
end;
Goto语句
DECLAREi number;
BEGINi:=5;<<repeat_loop>> --循环点DBMS_OUTPUT.PUT_LINE('i='||i);i:=i-1;IF i>0 THENGOTO repeat_loop; --小于5,就goto到repeat_loopEND IF;
END;
注:Oracle入门(十四A)之PL/SQL 基本结构
四、异常处理
DECLARE v_empno employees.employee_id%TYPE:= &empno;v_sal employees.salary%TYPE;
BEGINSELECT salary INTO v_sal FROM employeesWHERE employee_id = v_empno;IF v_sal<=15000 THENdbms_output.put_line('编码为'||v_empno||'员工该加100元!');ELSEdbms_output.put_line('编码为'||v_empno||'员工工资已经超过规定值!');END IF;
EXCEPTIONWHEN NO_DATA_FOUND THENdbms_output.put_line('数据库中没有编码为'||v_empno||'的员工');WHEN TOO_MANY_ROWS THENdbms_output.put_line('程序运行错误!请使用游标');WHEN OTHERS THENdbms_output.put_line(SQLCODE||'---'||SQLERRM);
END;
注:Oracle入门(十四B)之PL/SQL异常处理