当前位置:数据库 > Oracle >>

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;  
/  

 

 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,