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;

posted on 2015-09-28 17:01  就是爱学习呀  阅读(112)  评论(0编辑  收藏  举报

导航