pl/sql语言和编程:
declare
---申明变量
begin
---执行语句
except10n
end;
比如:
declare
v_department char(3);
v_course number;
begin
insert into classes (department,course) values(v_department,v_course);
end;
pl/sql 语句控制结构
1.选择结构
if 条件表达式 then
语句1
else if 条件表达式 then
语句2
else
语句3
end if;
这一点和shell语法是一样的
显式游标
declare
teacher_id number(5);
teacher_name varchar(10);
teacher_sex varchar(2);
teacher_age number(3);
cursor teacher_cur is
select tid,tname,sex,age from teacher_teacher where age >30 and age <40;
begin
open teacher_cur;
fetch teacher_cur into teacher_id,teacher_name,teacher_sex,teacher_age;
loop
exit when not teacher_cur%found;
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
close teacher_cur;
end;
//使用显示游标注意事项
1.使用前需要使用 %isopen 检查其是否已经打开.
2.使用游标过程中都要使用 %found %notFound 检查是否还存在可操作行
3.从游标中取数据,对应的变量个数和数据类型要一致
4.游标使用完要将其关闭
declare
type teacher_record is record
(
teacher_id number(5);
teacher_name varchar(10);
teacher_sex varchar(2);
teacher_age number(3);
);
cursor teacher_cur is
select tid,tname,sex,age from teacher_teacher where age >30 and age <40;
begin
-- open teacher_cur;
for teacher_record in teacher_cur loop
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
-- close teacher_cur;
end;
隐式游标
begin
select tid,tname,,sex,age into teacher_id,teacher_name,teacher_sex,teacher_age from teacher_table where tid = 13;
end
//1.隐式游标的注意事项:对于隐式游标而言,必须有一个into语句,因此使用隐式游标的 select 语句必须只选中一行数据或者只能产生一条数据;
游标属性:
1.是否找到游标(%found %notfound)
open teacher_cur;
fetch teacher_cur into teacher_id,teacher_name,teacher_sex,teacher_age;
loop
exit when not teacher_cur%found; -- exit when teacher_cur%notfound
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
close teacher_cur;
delete from teacher_table where tid = teacher_id
if sql%found then
insert into success values (tid);
else
insert into fail values(tid);
end if;
2.游标的行数(%rowcount)
open teacher_cur;
fetch teacher_cur into teacher_id,teacher_name,teacher_sex,teacher_age;
loop
exit when teacher_cur%rowcount=10;
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
close teacher_cur;
-- open teacher_cur;
for teacher_record in teacher_cur loop ---用for循环时,系统隐含的定义了一个数据类型为 %rowcount 的记录,作为循环计数器 ,并将隐式的打开和关闭游标,所以上面的写法是多余的
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
-- close teacher_cur;
3.游标是否打开(%isopen)
if teacher_cur%isopen then
fetch teacher_cur into teacher_id,teacher_name,teacher_sex,teacher_age;
else
open teacher_cur;
end if;
loop
exit when teacher_cur%rowcount=10;
if teacher_sex='M'then
insert into man_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
else
insert into female_teacher(....) values (teacher_id,teacher_name,teacher_sex,teacher_age);
end if ;
end loop;
close teacher_cur;
//存储过程:
set serveroutput on format wrapped
create or replace procedure drop_table(table_name varchar(20))
as
table_count:=0;
begin
select count(*) into table_count from all_tables where table_name = upper(table_name);
if table_count > 0 then
drop table ni;
end if;
end;
/
oracle自学3
最新推荐文章于 2023-08-14 16:06:30 发布