练习答案

--1、编写一个程序块,打印所有部门编号与名称,以及其所拥有的员工人数。
DECLARE
  CURSOR C_JOB IS
  SELECT D.DEPTNO, D.DNAME, NVL(T.CNT,0) AS CNT
    FROM DEPT D
    LEFT JOIN (SELECT DEPTNO, COUNT(*) CNT FROM EMP E GROUP BY DEPTNO) T
      ON D.DEPTNO = T.DEPTNO;
BEGIN
  FOR X IN C_JOB LOOP
    DBMS_OUTPUT.PUT_LINE(X.DEPTNO || ' ' || X.DNAME || ' ' || X.CNT);
  END LOOP;
END;



--2、编写一个程序块,输入一个部门号,显示该部门的所有雇员的姓名,工作和工资。
DECLARE
  CURSOR C_EMP IS
    SELECT ENAME,JOB,SAL FROM EMP WHERE DEPTNO=&部门编号;
BEGIN
  FOR V_EMP IN C_EMP LOOP
    DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME || '  ' || V_EMP.JOB || ' ' || V_EMP.SAL);
  END LOOP;
END;



--3、编写一个程序块,将EMP表中前5人的名字,及其工资等级(SALGRADE)显示出来。
DECLARE 
	CURSOR c_emp IS
	SELECT e.ename,
		   s.grade
	  FROM (SELECT * FROM emp WHERE rownum<=5) e
	  JOIN salgrade s
		ON e.sal BETWEEN s.losal AND s.hisal;
BEGIN 
  FOR V_EMP IN C_EMP
    LOOP 
     DBMS_OUTPUT.PUT_LINE('员工姓名:'||V_EMP.ENAME||' 工资等级:'||V_EMP.GRADE);   
    END LOOP; 
END;



--4、用带参数的游标,打印输入的某两个部门的员工姓名和工资。
DECLARE
CURSOR C_EMP(V_DEPTNO DEPT.DEPTNO%TYPE, V_DEPTNO_1 DEPT.DEPTNO%TYPE) IS 
SELECT * FROM EMP WHERE DEPTNO=V_DEPTNO OR DEPTNO=V_DEPTNO_1;
BEGIN
  DBMS_OUTPUT.PUT('10号或者30号部门员工列表为:');
  FOR V_EMP IN C_EMP(10, 30) LOOP
    DBMS_OUTPUT.PUT(V_EMP.ENAME||' ');
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('');
END;




--5、按照SALGRADE表中的标准,给员工加薪,1:5%,2:4%,3:3%,4:2%,5:1%,并打印输出每个人加薪前后的工资。
DECLARE 
  CURSOR C_EMP IS
  SELECT E.EMPNO
        ,E.ENAME
        ,E.SAL
        ,CASE WHEN S.GRADE=1 THEN E.SAL*1.05
              WHEN S.GRADE=2 THEN E.SAL*1.04
			  WHEN S.GRADE=3 THEN E.SAL*1.03
			  WHEN S.GRADE=4 THEN E.SAL*1.02
			  WHEN S.GRADE=5 THEN E.SAL*1.01
		END AS SAL_ADD
  FROM EMP E, SALGRADE S
 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
BEGIN 
  FOR V_EMP IN C_EMP
    LOOP 
     DBMS_OUTPUT.PUT_LINE('员工编号:'||V_EMP.EMPNO||','||
                          '员工姓名:'||V_EMP.ENAME||','||
                          '原基本薪水:'||V_EMP.SAL||','||
                          '加薪后基本薪水:'||V_EMP.SAL_ADD);   
    END LOOP; 
END;




--6、给员工涨工资,从最低工资涨起每人涨10%,但是所有员工的工资总额不能超过36800元,请计算涨工资的人数和涨工资后的所有员工的工资总额。
   DECLARE
     v_sum NUMBER(10):=0;  -- 统计涨工资后的总额
     v_cnt NUMBER(4):=0;   -- 统计涨工资的人数
     CURSOR c_emp IS
     SELECT empno,sal_add
       FROM emp
      ORDER BY sal_add ASC;
   BEGIN
     FOR v IN c_emp LOOP
       SELECT sum(sal_add) INTO v_sum FROM emp;
       IF v_sum+v.sal_add*0.1<=36800 THEN
         UPDATE emp SET sal_add=sal_add*1.1 WHERE empno=v.empno;
         v_cnt :=v_cnt+1;
       ELSE
         EXIT;
       END IF;
     END LOOP;
     DBMS_OUTPUT.PUT_LINE('涨工资的人数为:'||v_cnt||
                          ' 涨工资后的总额:'||v_sum);
   END;






--11、求1..100之间的所有素数(质数:只能被1和本身整除,1除外)
一个数a判断是否为质数:
  用a分别去除以1到a之间的整数,如果a被整除的个数为2,则a为质数
DECLARE
  V_CNT NUMBER;
BEGIN
  FOR V_1 IN 2..100 LOOP
    V_CNT :=0;    -- 每一个值判断前,被整除的计数器初始化为0
    FOR V_2 IN 1..V_1 LOOP
      IF MOD(V_1,V_2)=0 THEN 
        V_CNT := V_CNT + 1;
      END IF;
    END LOOP;
  IF V_CNT=2 THEN
     DBMS_OUTPUT.PUT_LINE(V_1);
  END IF;
  END LOOP;
END;



一个数a判断是否为质数:
  用a分别去除以2到a-1之间的整数,如果a被整除的个数为0,则a为质数
DECLARE
  V_CNT NUMBER;
BEGIN
  FOR V_1 IN 2..100 LOOP
    V_CNT :=0;    -- 每一个值判断前,被整除的计数器初始化为0
    FOR V_2 IN 2..V_1-1 LOOP
      IF MOD(V_1,V_2)=0 THEN 
        V_CNT := V_CNT + 1;
      END IF;
    END LOOP;
  IF V_CNT=0 THEN
     DBMS_OUTPUT.PUT_LINE(V_1);
  END IF;
  END LOOP;
END;



--12、求100..999之间的所有水仙花数(个位数的3次方 + 十位数的3次方 + 百位数的三次方 = 这个数值本身)
DECLARE
  Y NUMBER := 0;
BEGIN
  FOR X IN 100..999 LOOP
    IF POWER(MOD(X,10),3) + POWER(TRUNC(MOD(X,100)/10),3) + POWER(TRUNC(X/100),3) = X THEN
        DBMS_OUTPUT.PUT_LINE(X);
    END IF;
  END LOOP;
END;

SELECT  SUBSTR(163,-1,1),SUBSTR(163,-2,1),SUBSTR(163,-3,1) FROM dual;

--13、100-1000之间的所有奇数之和
DECLARE
  Y NUMBER := 0;
BEGIN
  FOR X IN 100..1000 LOOP
    IF MOD(X,2) =1 THEN
      Y := Y + X;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(Y);
END;


--14、输出9*9 乘法口诀,如下格式:
1*1=1  
1*2=2  2*2=4  
1*3=3  2*3=6  3*3=9  
1*4=4  2*4=8  3*4=12  4*4=16  
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

  
BEGIN
  FOR X IN 1 .. 9 LOOP
    FOR Y IN 1 .. X LOOP
      DBMS_OUTPUT.PUT(Y || '*' || X || '=' || X * Y || '  ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('');
  END LOOP;
END;
  
15./*创建一张表,往表中插入100行数据,格式如下:
stu
sno   sname   gender    phone_no
1
2
3
4
5
6
7
8
9
...
100
要求:sno能被3整除,gender为男,其余为女
      sno 被3整除余1,姓张;被3整除余2,姓王;能被3整除,姓李*/

-- CREATE TABLE STU_1(SNO NUMBER,SNAME VARCHAR2(10),GENDER VARCHAR2(2),PHONE_NO NUMBER)
SELECT * FROM STU_1;

DECLARE
  G VARCHAR2(10);
  M VARCHAR2(10);
BEGIN
  FOR I IN 1 .. 100 LOOP
    IF MOD(I, 3) = 0
      G := '男';
      M := '李';
    ELSIF MOD(I, 3) = 1
      M := '张';
      G := '女';
    ELSE
      M := '王';
      G := '女';
    END IF;
    INSERT INTO STU_1(SNO, SNAME, GENDER) VALUES (I, M, G);
    COMMIT;
  END LOOP;
  COMMIT;
END;

--
BEGIN 
   FOR X IN 1..100 LOOP
   INSERT INTO STU(SNO, SNAME, GENDER)
         VALUES (X , 
         CASE WHEN MOD(X,3) = 0 THEN '李'||X 
              WHEN MOD(X,3) = 1 THEN '张'||X
               ELSE '王'||X END  , 
         DECODE(MOD(X,3) ,0,'男','女'));
   END LOOP;
   COMMIT;
END ;


























 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值