PL/SQL程序结构及组成
什么是PL/SQL?
SQL长处
经常使用的结合语言
PL/SQL的程序结构
declare
说明部分 (变量说明,光标申明,例外说明〕
begin
语句序列 (DML语句〕…
exception
例外处理语句
End;
/
变量和常量的说明
1. 基本数据类型
Number 数字型
Int 整数型
Pls_integer 整数型。产生溢出时出现错误
Binary_integer 整数型。表示带符号的整数
Char 定长字符型,最大255个字符
Varchar2 变长字符型。最大2000个字符
Long 变长字符型,最长2GB
Date 日期型
Boolean 布尔型(TRUE、FALSE、NULL三者取一)
在PL/SQL中使用的数据类型和Oracle数据库中使用的数据类型。有的含义是全然一致的,
有的是有不同的含义的。
2. 基本数据类型变量的定义方法
变量名 类型标识符 [not null]:=值;
declare
age number(3):=26; --长度为3,初始值为26
begin
commit;
end;
当中。定义常量的语法格式:
常量名 constant 类型标识符 [not null]:=值;
declare
pi constant number(9):=3.1415926;--为pi的数字型常量,长度为9,初始值为3.1415926
begin
commit;
end;
if语句
三种if语句
1. IF 条件 THEN 语句1;
语句2;
END IF;
2. IF 条件 THEN 语句序列1;
ESLE 语句序列 2;
END IF;
3. IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句;
END IF;
小知识:获取从键盘输入的数据
accept num prompt '请输入一个数字';
pnum number := #
循环语句
三种循环语句
1. WHILE total <= 25000 LOOP
.. .
total : = total + salary;
END LOOP;
2. Loop
EXIT [when 条件];
……
End loop
3. FOR I IN 1 . . 3 LOOP
语句序列 ;
END LOOP ;
光标(Cursor)==ResultSet
说明光标语法:
1.定义光标
CURSOR 光标名 [ (參数名 数据类型[,參数名 数据类型]...)]
IS SELECT 语句;
比如:
cursorc1 is select ename from emp;
演示样例
带參数的光标
定义语句:
cursor c2(jobc varchar2)
is
select ename,salfrom emp
where job=jobc;
运行语句:
Open c2(‘clerk’);
Oracle的异常处理
例外
l例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
系统定义例外
用户定义例外及处理例外
DECLARE
My_job char(10);
v_sal emp.sal%type;
No_data exception;
cursor c1 is select distinct jobfrom emp order by job;
begin
open c1;
Fetch c1 into v_job;
IF c1%notFOUND then raiseno_data;
end if;
…
EXCEPTION
WHEN no_data THEN insert into empvalues(‘fetch语句没有获得数据或数据已经处理完');
END;
两种赋值语句
利用:=赋值
lvar1:='this is a argument';lemp_rec.sal:= sal*2 + nvl(comm,0);lsum_sal:=sum_sal+v_sal;
利用into赋值
lFETCH c1 INTO e_eno , e_sal ;commit语句
凝视
-- This is a comment
或
/* This is a comment */
实例演示样例
演示样例1
从最低工资调起每人长10%,但工资总额不能超过50万元,
请计算长工资的人数和长工资后的工资总额,并输出输出长工资人数及工资总额。 先写出可能用到的sql语句 select empno,sal from emp order by sal; select sum(sal) from emp; */ set serveroutput on declare cursor c1 is select empno,sal from emp order by sal; salTotal NUMBER; --记录工资总额 empCount NUMBER := 0; --涨工资的人数 pempno emp.empno% TYPE; --记录员工的编号 psal emp.sal%type; --记录员工的工资 begin --得到当前总工资 select sum(sal) into salTotal from emp; --打开游标 open c1; --运行循环 while salTotal <= 50000 loop fetch c1 into pempno, psal;--取出一条记录 exit when c1%notfound; update emp set sal = sal * 1.1 where empno = pempno; --运行加薪 --记录涨工资后的总额 salTotal := salTotal + psal*0.1; --记录涨工资的人数 empCount := empCount + 1; end loop; close c1; commit; dbms_output.put_line('涨工资人数:' || empCount || ' 工资总额:' || salTotal); end; /演示样例2
部门 小于3000数 3000-6000 大于6000 工资总额
10 2 1 0 8750
20 3 2 0 10875
30 6 0 0 9400
createtable msg1
(deptno number,
emp_num1 number,
emp_num2 number,
emp_num3 number,
sum_salnumber);