PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。
PL/SQL块的结构如下:
DECLARE
–声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数
BEGIN
– 执行部分: 过程及SQL 语句 , 即程序的主要部分
EXCEPTION
– 执行异常部分: 错误处理
END;
数据类型
基本数据类型+pl/sql扩展的数据类型
number() int integer (只是用pl/sql编程,数据库不可用)
两种赋值语句:
1、 :=
2. select …into (只能一对一赋值,否则出现异常)
%ROWTYPE
PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
使用%ROWTYPE特性的优点在于:
l 所引用的数据库中列的个数和数据类型可以不必知道;
l 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
%TYPE
定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE。
使用%TYPE特性的优点在于:
所引用的数据库列的数据类型可以不必知道;
所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
oracle 语言逻辑
条件分支: if, case
循环:loop , while, for
与c语言,java语法格式不一样(见下面的代码块)
--最小的pl/sql块
declare
a int;
b int;
begin
a:=10; --赋值
select sal into b from emp where empno=7369;
dbms_output.put_line(a);
dbms_output.put_line(b);
end;
--标准PL/SQL
declare
a number(7,2);
begin
a:=10.12;
select sal into a from emp; --没有where条件会有多条数据赋值,出错
dbms_output.put_line(a);
exception
when others then dbms_output.put_line('出错了');
end;
select * from emp;
--%type属性
declare
a emp.sal%type; --把emp表sal字段的类型给a
b int;
begin
b:=&工号;
select sal into a from emp where empno=b;
dbms_output.put_line('工资:'||a);
end;
--%rowtype属性
declare
a emp%rowtype; --把emp表所有字段的类型给a
b int;
begin
b:=&工号;
select * into a from emp where empno=b;
dbms_output.put_line('工资:'||a.sal||' 姓名'||a.ename);
end;
--if
declare
b int;
begin
b:=&输入成绩;
if b>=60 then
dbms_output.put_line('及格');
else
dbms_output.put_line('不及格');
end if;
end;
--多重if
declare
b int;
begin
b:=&输入成绩;
if b<60 then
dbms_output.put_line('不及格');
elsif b<=70 then
dbms_output.put_line('及格');
elsif b<=80 then
dbms_output.put_line('良好');
else
dbms_output.put_line('优秀');
end if;
end;
--case 相当于swicth
declare
b varchar2(20);
begin
b:='&输入考试等级';
case b
when 'a' then dbms_output.put_line('优秀');
when'b' then dbms_output.put_line('良好');
when'c' then dbms_output.put_line('及格');
when'd' then dbms_output.put_line('不及格');
else
dbms_output.put_line('输入不正确');
end case;
end;
create table ttt (tid int)
--loop 天生就是一个死循环
declare
i int;
begin
i:=1;
loop
if i=10 then
exit;
end if;
insert into ttt values(i);
i:=i+1;
end loop;
end;
select * from ttt;
select count(*) from ttt;
--while循环
declare
i int;
begin
i:=1;
while i<10 loop
insert into ttt values(i);
i:=i+1;
end loop;
end;
--for
declare
i int;
begin
for i in 1..100 loop
insert into ttt values(i);
end loop;
end;