oracle自学(3)(一)

2014-11-24 16:18:15 · 作者: · 浏览: 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_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_cou