oracle自学(3)
oracle自学(3)
[sql] 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_易做图 varchar(2); teacher_age number(3); cursor teacher_cur is select tid,tname,易做图,age from teacher_teacher where age >30 and age <40; begin open teacher_cur; fetch teacher_cur into teacher_id,teacher_name,teacher_易做图,teacher_age; loop exit when not teacher_cur%found; if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,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_易做图 varchar(2); teacher_age number(3); ); cursor teacher_cur is select tid,tname,易做图,age from teacher_teacher where age >30 and age <40; begin -- open teacher_cur; for teacher_record in teacher_cur loop if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); end if ; end loop; -- close teacher_cur; end; 隐式游标 begin select tid,tname,,易做图,age into teacher_id,teacher_name,teacher_易做图,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_易做图,teacher_age; loop exit when not teacher_cur%found; -- exit when teacher_cur%notfound if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,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_易做图,teacher_age; loop exit when teacher_cur%rowcount=10; if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); end if ; end loop; close teacher_cur; -- open teacher_cur; for teacher_record in teacher_cur loop ---用for循环时,系统隐含的定义了一个数据类型为 %rowcount 的记录,作为循环计数器 ,并将隐式的打开和关闭游标,所以上面的写法是多余的 if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,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_易做图,teacher_age; else open teacher_cur; end if; loop exit when teacher_cur%rowcount=10; if teacher_易做图='M'then insert into man_teacher(....) values (teacher_id,teacher_name,teacher_易做图,teacher_age); else insert into female_teacher(....) values (teacher_id,teacher_name,teacher_易做图,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; /