Oracle数据库学习(三)

--plsql 编程语言
--用于Oracle编写的
--由三个块组成,声明部分、执行部分、异常处理部分
--DECLARE BEGIN EXCEPTION END;
set serveroutput on  --为了有结果
declare
         --声明的变量、类型、游标
begin
  dbms_output.put_line('hello word!');    
     --程序的执行部分
--exception
         --提供处理机制
         --when .... then
end;

--使用循环语句打印 1-100
set serveroutput on 
declare
     --声明一个变量
     v_i number(5) := 1;
begin
      loop 
        dbms_output.put_line(v_i);
        exit when v_i >= 100;   --当大于等于100结束
             v_i := v_i + 1;
       end loop;     
end;
--使用循环语句打印 1-100
begin 
       for c reverse in 1..100 loop  --加reverse反向
         dbms_output.put_line(c);
        end loop;
-- while loop; end loop;   
--输出1-100间的质数
declare 
   v_i number(3):=2;
   v_j number(3):=2;
   v_flag number(1):=1;
begin
  while v_i <=100 loop
        while v_j <= sqrt(v_i) loop
          if  mod(v_i,v_j)  = 0 then v_flag := 0;
          end if;
          v_j :=v_j + 1;
         end loop;
      if v_flag =1 then dbms_output.put_line(v_i);
      end if;
      v_j :=2;
      v_i := v_i + 1;
      v_flag :=1;
   end loop;
end; 
--输出1-100间的质数
declare 
   v_flag number(1) :=1;
begin
   for v_i in 2..100 loop
     for vj in 2..sqrt(v_i) loop
         if mod(v_i,v_j) = 0 then v_flag := 0;
         goto lable;   --跳到lable 点     exit 是退出
         end if;
      end loop;
      <<lable>>
      if v_flag = 1 then dbms_output.put_line(v_i);
      end if;
      v_flag := 1;
    end loop;
end;
--游标
--游标是一个指向上下文的句柄或指针,通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。
--非查询语句  隐士的
--结果是单行的查询语句 隐士的或显示的
--结果是多行的查询语句  显示的       
--显示游标处理四个PL/SQL步骤
--1.定义游标 
--2.打开游标 
--3.提取游标数据 
fatch into
-- 4.关闭游标
--打印出80号部门的所有的员工的工作 salary :xxx
declare
 v_sal employees.salary%type;
 v_empid employees.employee_id%type;
 --1.定义游标
 cursor emp_sal_cursor is 
        select salary from employees,employee_id where department_id = 80;
begin
  --2.打开游标
  open emp_sal_cursor;
  --3.提取游标
  fetch emp_sal_cursor into v_sal,v_empid; --提取第一个值
   
  while emp_sal_cursor%found loop --found一直到最后一个
      dbms_output('salary:'v_sal);
        fetch emp_sal_cursor into v_sal,v_empid;  --提取下一个值
  end loop;
  --4,关闭游标
  close emp_sal_cursor;
end;
--游标 for in 循环可以自动打开游标、提取游标、关闭游标
--游标可以带参数并且  游标的赋值  sal=>1000
--隐式游标:更新指定员工salary(涨工资10),如果该员工没有找到,则答应 查无此人
 begin
     update employees
     set salary = salary +10
     where employee_id = 101;
           --隐式游标
     if sql%notfound then dbms_output.put_line('查无此人');
      end if;
  end; 
--异常处理
--1.预定义错误 predefined
--2.非预定错误 nopredefined
--3.用户定义错误 User_define
--预定义异常
declare
           v_salary employees.salary%type;
begin
           select salary into v_salary
           from employees
           where employee_id > 100;
           dbms_output.put_line(v_salary);
exception
           when too_many_rows then
             dbms_output.put_line('行数太多了啊');
end;
--非预定义异常
declare
             e_deleteid_exception exception;--定义异常
             PRAGMA exception init(e_deleteid_exception,-2292); --初始化异常  -2292    ORA号
begin
             delete from employees where employee_id = 100;
exception
              when e_deleteid_exception then
                   dbms_output.put_line('有外键');
end;
--用户自定义异常
declare 
       e_too_high_sal exception;
       v_sal employees.salary%type;
begin 
  select salary into v_sal from employees where employee_id = 100;
  if v_sal > 100000 then
    raise e_too_high_sal;  --抛出异常
    end if;
exception
  when  e_too_high_sal then dbms_output.put_line('工资太高了');
end;

--函数
create or replace function func_name(dept_id number,salary number)
return number
is 
       --定义函数在使用的过程中,需要声明的变量
begin
        --函数执行体
exception
        --处理函数的异常
end;
--  数据库当前时间     sysdate
-- OUT参数,因为函数只能有一个返回值,PL/SQL程序可以通过OUT型的参数实现由多个返回值

--函数名后面是一个可选的参数列表,其中包含IN,OUT或IN OUT标记,参数之间用逗号隔开,
--IN参数标记表示传递给函数的值在该函数执行中不改变;OUT标记表示一个值在函数中进行计算并
--通过该参数传递给调用语句;IN OUT标记表示传递给函数的值可以变化并传递给调用语句,如省略标记,则参数
--隐含为IN.
--获取给定部门的工资总和 和该部门的员工总数
create or repalce function get_sal(dept_id number ,total_out out number) --total_out 返回值
return number
is
        v_sumsal number(10) := 0;
        cursor
                 salary_cursor is
                    select salary from employees where department_id = dept_id;
begin
                    total_count := 0;   --返回值
                    for c in salary_cursor loop
                        v_sumsal := v_sumsal + c.salary;
                        total_count := total_count +1;
                     end loop;
         return v_sumsal;
end;
--调用函数
declare
  v_num number(5);
begin
        dbms_output.put_line(get_sal(80,v_num));
         dbms_output.put_line(v_num); --把v_num也带了出来
end;
--储存过程
set serveroutput on --开启储存过程
create or repalce procedure sum_procedure
is

begin
  
end;
--输出当前的错误信息
show errors;
--触发器
--在Oracle 中触发器类似与储存过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
--触发器组成:
--1.触发时间:After BEfore
--2.触发事件:TRIGGER  insert update delete
--3.触发频率:触发器内定义的动作被执行的次数,即语句级(STATEMENT)触发器和行级(ROW)触发器。
--     a.语句级触发器:是指当某触发事件发生时,该触发器只执行一次。
--     b.行级(ROW)触发器:是指当某触发事件发生时,多收到该操作影响的每一行数据,触发器都单独执行一次。
--4.触发器本身:即该Trigger被触发后的目的和意图,正是触发器本身要做的事情,例如PL/SQL块;
--创建触发器
   create or replace trigger update_emp_trriger
    after 
         update on emp
    for each row  --行级(ROW)触发器  默认的是STATEMENT 语句块的
    begin
        dbms_output.putline('喝咯欧文 ');
    end;
--old 和 new 的使用  可以显示更新以前和更新以后的数据
   create or replace trigger update_emp_trriger
    after 
         update on emp
    for each row  --行级(ROW)触发器
    begin
        dbms_output.putline('old:salary'||:old.salary || ',' || 'new salary:':new.salary);
    end;
--编写一个触发器,在对My_emp删除的时候,在my_emp_bak表中备份对应的记录
create or replace trigger delete_emp_trigger
before
      delete on my_emp
for each row
begin
  insert into my_emp_bak
  values(:old.emplyee_id,:old.salary);
end;

来自CSDN用户 nothing 地址http://blog.csdn.net/u011687186
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值