oracle自学3

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值