pl/sql
pl/sql 编程
pl/sql oracle 在自己的基础上发展的一种编程语言
pl/sql程序的主要特点:
具有模块化的结构,
使用过程化,语言控制结构
能给进行错误处理
必须在数据库环境下执行
匿名过程
循环输出1-100。
declare --定义部分
maxcount number:=100;
begin --执行部分
for i in 1..maxcount loop
dbms_output.put_line(i);
end loop;
end;
交换两个变量的值。
declare
a number:=5;
b number:=10;
c number;
begin
dbms_output.put_line(a||','||b);
c:=a;
a:=b;
b:=c;
dbms_output.put_line(a||','||b);
end;
声明常量
declare
a constant number:=10;--常量的关键字 constant
begin
dbms_output.put_line(a);
end;
变量赋值
select into
declare
re number;
begin
select count(my_id)into re from dad; 查询的同时赋值 用into
dbms_output.put_line(re);
end;
特殊数据类型(表中某一列的数据类型)
declare
mydate dad.my_date%type; --将dad表中my_date的类型赋给 mydate
begin
select my_date into mydate from dad where my_id=1; --将dad表中my_date的值赋给 mydate
end;
自己定义数据类型,并赋值
declare
type mytype is record
(
my_id number,
my_name varchar2(10),
my_age date
); --定义数据类型
my_stu mytype;
my_stu1 mytype;--声明变量的数据类型为自己定义数据类型
begin
my_stu.my_id:=1;
my_stu.my_name:='haha';
my_stu.my_age:=sysdate;
my_stu1:=my_stu;--给变量赋值
dbms_output.put_line( my_stu.my_id||','|| my_stu.my_age||','||my_stu1.my_name);
end;
自定义数据类型(例子)
create table stu_type(
type_id char(5) primary key,
type_name varchar(20)
)
create table students(
stu_id char(5) primary key,
stu_name varchar2(50),
stu_type char(5),
stu_date date
)
insert into stu_type values('00001','本科');
insert into stu_type values('00002','大专');
insert into students values('00001','杨过','00001',sysdate);
insert into students values('00002','梅超风','00002',sysdate);
insert into students values('00003','任盈盈','00001',sysdate);
declare
type my_type is record(
stuid students.stu_id%type,
stuname students.stu_name%type,
stutype stu_type.type_name%type,
studate students.stu_date%type
);
mysru my_type;
begin
select stu_id,stu_name,type_name,stu_date into mysru from students left join stu_type on students.stu_type =stu_type.type_id where students.stu_id = '00001';
dbms_output.put_line(mysru.stuid);
end;
rowtype 得到一整行的数据类型
declare
my_stu students%rowtype; --将一整行的数据类型定义为变量my_stu的数据类型
begin
select * into my_stu from students where students.stu_id='00001'; --将查询结果赋值给my_stu
dbms_output.put_line(my_stu.stu_name);
end;
流程控制语句
if <条件> then
.....
end if;
declare
cou number;
begin
select count(my_id) into cou from dad; --从表dad中得到数据总条数,并赋值给cou
if(cou<=100) then
dbms_output.put_line('记录条目小于100');
elsif (cou<=150) then
dbms_output.put_line('记录条目大于100');
else
dbms_output.put_line('记录条目大于150');
end if;
end;
case when 类似于switch case
所以上面的方法也可以写成
declare
cou number;
begin
select count(my_id) into cou from dad;
case
when (cou<=100) then
dbms_output.put_line('记录条目小于100');
when (cou<=150) then
dbms_output.put_line('记录条目大于100');
else
dbms_output.put_line('记录条目大于150');
end if;
end;
case when 也可以放到sql语句中
select stu_id,(case stu_type when '00001' then '本科' when '00002' then '大专'end) from students;
循环结构
LOOP(开始)....EXIT(退出条件)....END LOOP(结束)
退出条件一半放在if中
declare
num1 number:=10;
num2 number:=20;
i number:=0;
begin
loop
num1:=num1+1;
i:=i+1;
if num1=num2 then
exit;
end if;
dbms_output.put_line(i);
end loop;
end;
LOOP(开始)....EXIT WHEN(退出条件)....END LOOP(结束)
1-100 累加和
declare
a number:=0;
b number:=1;
begin
loop
exit when b>100;
a:=a+b;
b:=b+1;
dbms_output.put_line(a);
end loop;
end;
while<条件> LOOP ..END LOOP
1-100 累加和
declare
a number:=0;
b number:=0;
begin
while(b<100) loop
b:=b+1;
a:=a+b;
dbms_output.put_line(a);
end loop;
end;
FOR<循环范围>LOOP ...END LOOP
1-100累加
declare
a number:=0;
b number:=0;
begin
for b in 1..100 loop
a:=a+b;
dbms_output.put_line(a);
end loop;
end;