zoukankan      html  css  js  c++  java
  • PL/SQL编程

    declare --声明
      v_sal teacher.sal%type; --创建变量
      v_tname teacher.tname%type;
      v_rank varchar2(10);
      v_sal_rank VARCHAR2(20);
    begin
      select t.sal,t.tname
      into v_sal,v_tname  --赋值
      from teacher t 
      where t.tno=1004;
      if v_sal < 2000 then  --IF   start
        v_rank:='临时工';
      elsif v_sal >=2000 and v_sal <15000 then
        v_rank:='蓝领';
      elsif v_sal >=15000 and v_sal <40000 then 
         v_rank:='白领';
      else 
        v_rank:='金领';
      end if;             --IF  end
      CASE v_rank         --CASE START
      WHEN '临时工' THEN
        v_sal_rank:='小于2000';
      WHEN '蓝领' THEN
        v_sal_rank:='[2000,15000)';
      WHEN '白领' THEN
        v_sal_rank:='[15000,40000)';
      ELSE
        v_sal_rank:='大于40000';
      END CASE;            --CASE END
      dbms_output.put_line(v_tname||':'||v_rank||',薪水:'||v_sal_rank);  --输出
    end;
    IF/CASE控制语句
     1 -- 游标:是系统给我们用户开设的一个数据缓冲区!存放的是sql语句执行结果!
     2 --每个游标区都有一个名字,用户通过游标一行一行的获取记录!
     3 
     4 --01、隐式游标  在我们pl/sql中,程序执行sql语句时,自动创建!就是我们平常的sql语句
     5 --02、显式游标  可以返回多行的查询!
     6 --03、REF游标   用于处理运行时才能确定的动态sql  查询结果
     7 
     8 --隐式游标属性
     9   --01、sql%found  影响了一行或者多行,都返回true
    10   --02、sql%notfound  没有影响行数,返回true
    11   --03、sql%rowcount  sql语句影响的行数 
    12   --04、sql%isopen    游标是否打开,始终为false
    13 declare 
    14   tname teacher.tname%TYPE;--声明一个变量
    15   CURSOR teacher_cursor IS SELECT tname FROM teacher; --声明游标
    16   
    17 begin
    18   OPEN teacher_cursor;  --打开游标
    19   FETCH teacher_cursor INTO tname;
    20 
    21   --循环输出tname
    22   WHILE teacher_cursor%FOUND
    23     LOOP
    24       dbms_output.put_line(''||teacher_cursor%ROWCOUNT||'行,'||'教师的姓名:'||tname);
    25       FETCH teacher_cursor INTO tname;
    26     END LOOP;
    27     CLOSE teacher_cursor;   --关闭游标
    28   
    29 end;
     1 -- 触发器
     2    -- :old 代表之前的值
     3    --:new 代表之后现在的值
     4    --这两个值   只能在for each  row中使用
     5    
     6 --update语句 :old    :new
     7 --insert语句 :new
     8 --delete语句 :old
     9 
    10 --创建一个teacher_log(只要有人动teacher表,数据就会记录在teacher_log表中)
    11 
    12 CREATE TABLE teacher_log(
    13   logid NUMBER NOT NULL,
    14   old_value VARCHAR2(200),
    15   create_date DATE,
    16   log_type NUMBER,
    17   tno NUMBER
    18 );
    19 --给logid设置主键
    20 ALTER TABLE teacher_log add CONSTRAINT pk_teacher_logid primary key(logid);
    21 
    22 --创建序列
    23 CREATE sequence sq_teacher_logid
    24 minvalue 1
    25 maxvalue 99999999
    26 START WITH 1
    27 increment BY 1
    28 cache 20;
    29 
    30 --创建触发器  or replace表示如果存在则修改
    31 CREATE OR REPLACE TRIGGER tr_teacher
    32 AFTER INSERT OR UPDATE OR DELETE  --会在增修删之后出发
    33 ON teacher FOR EACH ROW
    34 
    35 --声明pl/sql开始
    36 DECLARE 
    37 v_old_value teacher_log.old_value%TYPE;
    38 v_type teacher_log.log_type%TYPE;
    39 v_tno teacher_log.tno%TYPE;
    40 BEGIN
    41   IF inserting THEN
    42     v_type:=1;--新增
    43     v_tno:=:new.tno;
    44     v_old_value:=:new.tno||'===='||:new.tname;
    45    ELSIF deleting THEN
    46     v_type:=2;--删除
    47     v_tno:=:old.tno;
    48     v_old_value:=:old.tno||'===='||:old.tname;
    49    ELSE
    50      v_type:=3;--修改
    51      v_tno:=:old.tno;
    52      v_old_value:=:old.tno||'===='||:old.tname||'===='||:new.sal;
    53     END IF;
    54    
    55   --将记录写入到teacher_log
    56   INSERT INTO teacher_log
    57   VALUES(sq_teacher_logid.nextval,v_old_value,SYSDATE,v_type,v_tno);
    58   
    59 END tr_teacher;
     1 --函数 function
     2 CREATE OR REPLACE FUNCTION fn_teacher_tid(
     3   f_tid VARCHAR2
     4 )
     5 RETURN VARCHAR2
     6 IS
     7 f_result teacher.tid%TYPE;
     8 
     9 BEGIN
    10   IF LENGTH(f_tid)!=18 THEN
    11     dbms_output.put_line('身份证不正确');
    12   ELSE
    13     dbms_output.put_line('身份证正确');
    14   END IF;
    15   --给返回值赋值
    16   f_result:=SUBSTR(f_tid,1,6)||'*****'||SUBSTR(f_tid,15);
    17   RETURN f_result;
    18 
    19 END fn_teacher_tid;
    20 
    21 
    22 --调用函数
    23 SELECT fn_teacher_tid(110101198603304014) FROM dual;
     1 --存储过程   一组完成特定功能的sql语句集
     2 --新增教师   身份证不满足要求,抛出异常
     3 
     4 CREATE OR REPLACE PROCEDURE pro_add_teacher
     5 (
     6 p_tno teacher.tno%TYPE,
     7 p_tname teacher.tname%TYPE,
     8 p_tid teacher.tid%TYPE,
     9 p_sal teacher.sal%TYPE
    10 )
    11 IS 
    12 e_tid_validate EXCEPTION;
    13 
    14 BEGIN
    15   IF LENGTH(p_tid)!=18 --判断身份证号不满足18位
    16     THEN --抛出异常
    17       RAISE e_tid_validate;
    18    END IF;
    19    
    20 INSERT INTO teacher(tno,tname,tid,sal)
    21 VALUES(p_tno,p_tname,p_tid,p_sal);
    22 --提交事务
    23 COMMIT;
    24 
    25 --对异常进行处理
    26 EXCEPTION WHEN e_tid_validate THEN
    27   dbms_output.put_line('请输入正确的身份证号');
    28   WHEN OTHERS THEN
    29     dbms_output.put_line('其他异常');
    30   END pro_add_teacher;
    31 
    32 
    33 
    34 --调用存储过程
    35 CALL pro_add_teacher(2001,'小黑黑','123456789123456789',5000);
     1  
     2 DECLARE
     3    v_temp NUMBER:=0;--循环变量
     4    v_max_deptnum dept_loop.deptno%TYPE;--最大增加值
     5 BEGIN 
     6   SELECT MAX(deptno) INTO v_max_deptnum FROM dept_loop;
     7   LOOP   --LOOP START
     8     v_max_deptnum:=v_max_deptnum+1;--每次循环加1
     9     INSERT INTO dept_loop
    10     VALUES(v_max_deptnum,'部门'||v_max_deptnum,'地址'||v_max_deptnum);
    11     v_temp:=v_temp+1;--每次循环变量加一
    12     EXIT WHEN v_temp>99;
    13    END LOOP; --LOOP END
    14    
    15    v_temp:=0; --初始化循环变量
    16    WHILE v_temp<100 LOOP  --WHILE LOOP START
    17       v_max_deptnum:=v_max_deptnum+1;
    18        INSERT INTO dept_loop
    19        VALUES(v_max_deptnum,'部门'||v_max_deptnum,'地址'||v_max_deptnum);
    20        v_temp:=v_temp+1;
    21    END LOOP;        --WHILE LOOP END
    22    
    23    FOR v_temp IN v_max_deptnum+1..v_max_deptnum+100 LOOP   --FOR LOOP START
    24      INSERT INTO dept_loop
    25       VALUES(v_temp,'部门'||v_temp,'地址'||v_temp);
    26    END LOOP;        --FOR LOOP END
    27 END;
    3种循环控制
  • 相关阅读:
    第一次博客作业
    C++基础笔记(int转string)
    C++基础笔记(string截取)
    20145222 《信息安全系统设计基础》期中总结
    20145222《信息安全系统设计基础》Linux常用命令汇总
    20145222《信息安全系统设计基础》第七周学习总结(1)
    《Markdown 一些基本语法》
    20145222《信息安全系统设计基础》我的第1-6周考试错题汇总
    20145222《信息安全系统设计基础》第六周学习总结(2)
    20145222《信息安全系统设计基础》第六周学习总结(1)
  • 原文地址:https://www.cnblogs.com/wiseroll/p/7065546.html
Copyright © 2011-2022 走看看