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