Oracle PL/SQL基本语法练习

详细链接 http://blog.csdn.net/acmman/article/details/52422492
– 查询

select * from myemp;

– 通过as创建表

create table empvd20 as select * from emp041301;

– 创建数据源

create table EMP0413(EMPNO NUMBER,
                     ENAME VARCHAR2(10),
                     JOB VARCHAR2(9),
                     MGR NUMBER,
                     HIREDATE DATE,
                     SAL BINARY_DOUBLE,
                     COMM BINARY_DOUBLE,
                     DEPTNO NUMBER);
create table dept0413(DEPTNO NUMBER, DNAME VARCHAR2(50));

– 插入数据一种方法

INSERT INTO EMP041301
SELECT 1110, '张三', '主管', 1110, to_date('12-3-14', 'dd-MM-yy'), 5200, 0, 20 FROM dual 
UNION ALL
SELECT 1111, '李四', '销售', 1116, to_date('03 - 11 - 15', 'dd-MM-yy'), 3400, 500, 30 FROM dual
UNION ALL
SELECT 1112, '王五', '销售', 1116, to_date('25 - 4 - 12', 'dd-MM-yy'), 4400, 800, 30 FROM dual 
UNION ALL
SELECT 1113, '赵二', '后勤', 1110, to_date('30-5-11', 'dd-MM-yy'), 3450, 0, 40 FROM dual 
UNION ALL
SELECT 1114, '李磊磊', '会计', 1110, to_date('22-12-15', 'dd-MM-yy'), 2500, 0, 50 FROM dual 
UNION ALL
SELECT 1115, '张少丽', '销售', 1110, to_date('11-3-16', 'dd-MM-yy'), 2400, 1400, 30 FROM dual 
UNION ALL
SELECT 1116, '林建国', '主管', 1116, to_date('22-1-16', 'dd-MM-yy'), 5700, 0, 20 FROM dual 
UNION ALL
SELECT 1117, '马富邦', '后勤', 1116, to_date('22-7-13', 'dd-MM-yy'), 2800, 0, 40 FROM dual 
UNION ALL
SELECT 1118, '沈倩', '会计', 1116, to_date('06-5-10', 'dd-MM-yy'), 2100, 0, 50 FROM dual;
commit;

– 第二种 增删改 需要提交才能数据改变;

insert into t(c1,c2) values(date'2010-2-12',timestamp'2010-2-12 13:24:52.234123211');

insert into EMP0413 values(1110,'张三','主管',1110, to_date('12-3-14','dd-MM-yy'),5200,0,20);
commit;

– 表 dept0413
20,‘管理部门’
30,‘销售部门’
40,‘后勤部门’
50,‘金融部门’

insert into dept0413 values(20,'管理部门');
insert into dept0413 values(30,'销售部门');
insert into dept0413 values(40,'后勤部门');
insert into dept0413 values(50,'金融部门');
commit;

– 创表结束
select to_char(hiredate,‘yyyy’) from emp0413;
select count(1) from emp0413;

– (1)实例1:统计每年入职的员工个数
– 计数器可以实现,分组求和的目的;
select to_char(hiredate,‘yyyy’) 年份 ,count(1) 入职员工数 from emp0413 group by to_char(hiredate,‘yyyy’) order by 年份 ;

– pl/sql语法

declare
   cursor empCount is select to_char(hiredate,'yyyy') from emp0413;
   year varchar2(4);
    --计数器(2010-2016的入职人数统计)
    count10 number := 0;
    count11 number := 0;
    count12 number := 0;
    count13 number := 0;
    count14 number := 0;
    count15 number := 0;
    count16 number := 0;
begin
  open empCount;
       loop 
         fetch empCount into year;
         exit when empCount%notfound;
         if year = '2010'  then count10 := count10+1; 
           elsif year = '2011'  then count11 := count11+1;
           elsif year = '2012'  then count12 := count12+1;
           elsif year = '2013'  then count13 := count13+1;
           elsif year = '2014'  then count14 := count14+1;
           elsif year = '2015'  then count15 := count15+1;
           else count16 := count16+1;
         end if; 
       end loop;
  close empCount;
  dbms_output.put_line('2010~2016年入职总人数数:'||(count10+count11+count12+count13+count14+count15+count16));
  dbms_output.put_line('2010年入职人数:'||count10);
  dbms_output.put_line('2011年入职人数:'||count11);
  dbms_output.put_line('2012年入职人数:'||count12);
  dbms_output.put_line('2013年入职人数:'||count13);
  dbms_output.put_line('2014年入职人数:'||count14);
  dbms_output.put_line('2015年入职人数:'||count15);
  dbms_output.put_line('2016年入职人数:'||count16);    
end;

– (2)实例2:涨工资
为员工涨工资,从最低工资调起,每人涨10%,但工资总额不能超过5万元,
请计算涨工资的人数和涨工资后的工资总额,并输出涨工资人数和工资总额。

– pl/sql编程

declare
   cursor pc is select empno,sal from emp0413 order by sal;
   pEmpno emp0413.empno%type;--个人编号
   pCount number:=0;-- 涨工资人数
   pSal emp0413.sal%type; -- 个人薪水
   sumSal number(8);-- 总薪水 
begin
  select sum(sal) into sumSal from emp0413;
  open pc;
     loop
       exit when sumSal + pSal * 0.1 > 50000;
       fetch pc into pEmpno,pSal; 
       exit when pc%notfound;
       dbms_output.put_line('pEmpno:'||pEmpno);
       update emp0413 e set e.sal = e.sal+0.1*e.sal where e.empno = pEmpno ; 
       pCount := pCount + 1;
       sumSal := sumSal+pSal*0.1; 
     end loop;
  close pc;
  
  dbms_output.put_line('涨工资人数:'||pCount);
  dbms_output.put_line('工资总额:'||sumSal); 
end;

–验证 没提交可以回滚;
select * from emp0413 order by deptno ;
commit;

–(3)实例3:统计工资段
用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)
统计各工资段的职工人数、以及各部门的工资总额(工资总额不包括奖金),参考如下格式:

select distinct deptno from emp0413;
select * from dept0413;

declare
       cursor pc1 is select DEPTNO from dept0413;
       cursor pc2(inDeptNo dept0413.deptno%type) is select SAL from emp0413 where DEPTNO = inDeptNo; 
       count1 number;
       count2 number;
       count3 number;
       pSal  emp0413.sal%type;
       sumSal number;
       curDeptNo dept0413.DEPTNO%type;
         
begin
  dbms_output.put_line('部门 小于3000数 3000-6000 大于6000 工资总额');
  open pc1;
       loop
         fetch pc1 into curDeptNo;
         exit when pc1%notfound;
         select sum(sal) into sumSal from emp0413 where DEPTNO = curDeptNo;
         count1 :=0;
         count2 :=0;
         count3 :=0;
         open pc2(curDeptNo);
              loop
                fetch pc2 into pSal;
                exit when pc2%notfound;
                if pSal >=6000 then 
                  count1 := count1+1;  
                elsif pSal>=3000 and pSal < 6000 then
                  count2 := count2+1;
                else
                  count3 := count3+1; 
                               
                end if; 
      
              end loop;
         
         close pc2;
         dbms_output.put_line(curDeptNo||' '||count3||' '||count2||' '||count1||' '||sumSal);
         
       end loop; 
  close pc1;
end;

你可能感兴趣的:(数据库)