-
PL/SQL的程序结构查看全部
-
PL/SQL查看全部
-
1.2PL/SQL的作用 ResultSet rs="select empno,job from emp"; while(rs.next()){ int eno=rs.getInt("empno"); String job=rs.getString("job"); if("PRESIDENT".equals(job)){ update emp set sal=sal+1000 where empno=eno; }else if("MANAGER".equals(job)){ update emp set sal=sal+800 where empno=eno; }else { update emp set sal=sal+400 where empno=eno; } } PLSQL作用:操作数据库的效率更高,便于存储; declare --说明部分 begin --程序体 dbms_output.put_line("Hello World"); end; / --打开输出开关 set serveroutput on / --查看程序包的结构 desc dbms_output查看全部
-
-- 打印提示 dbms_output.put_line('执行成功.'); -- 提交 COMMIT; END; / -- 查询执行结果 SELECT *FROM depgrade order by cno,dno; -- 题目要求的答案 SELECT b.cname AS "课程名称", c.dname AS "系名", num60 AS "小于60", num60_85 AS "60~85分", num85 AS "85分及以上", avggrade AS "平均分" FROM depgrade a, course b, dep c WHERE a.cno = b.cno AND a.dno = c.dno AND b.cname = '大学物理';查看全部
-
-- 初始化 pcount60 := 0;pcount60_85 := 0;pcount85 := 0; pavggrade := 0; -- 平均成绩 SELECT NVL(AVG(a.grade),0) INTO pavggrade FROM sc a, course b, student c WHERE a.cno = b.cno AND a.sno = c.sno AND c.dno = pdno -- pdno系别 AND a.cno = pcno -- pcno课程编号 ORDER BY a.cno, c.dno; -- 遍历 LOOP FETCH cgrade INTO pgrade; EXIT WHEN cgrade%NOTFOUND; -- 根据条件计数 IF pgrade < 60 THEN pcount60 := pcount60 + 1; ELSIF pgrade >=60 AND pgrade < 85 THEN pcount60_85 := pcount60_85 + 1; ELSE pcount85 := pcount85 + 1; END IF; END LOOP; -- 关闭游标(成绩) CLOSE cgrade; -- 存储结果 INSERT INTO depgrade VALUES(pcno,pdno,pcount60,pcount60_85,pcount85,pavggrade); END LOOP; -- 关闭游标(系别) CLOSE cdep; END LOOP; CLOSE ccourse; -- 关闭游标(课程)查看全部
-
--PL/SQL块 DECLARE -- 课程编号 pcno course.cno%TYPE; -- 学号 psno student.sno%TYPE; -- 系别 pdno dep.dno%TYPE; -- 学生成绩 pgrade sc.grade%TYPE; -- 系平均成绩 pavggrade sc.grade%TYPE; -- 小于60分人数 pcount60 NUMBER; -- 60~85分人数 pcount60_85 NUMBER; --85分以上人数 pcount85 NUMBER; -- 游标 -- 课程 CURSOR ccourse IS SELECT cno FROM course ORDER BY cno; -- 系别 CURSOR cdep IS SELECT dno FROM dep ORDER BY dno; -- 成绩 CURSOR cgrade(dcno course.cno%TYPE,ddno dep.dno%TYPE) IS SELECT a.grade FROM sc a, course b, student c WHERE a.cno = b.cno AND a.sno = c.sno AND c.dno = ddno AND a.cno = dcno ORDER BY a.cno, c.dno; BEGIN -- 删除结果表 DELETE FROM depgrade; -- 打开游标(课程) OPEN ccourse; -- 遍历 LOOP FETCH ccourse INTO pcno; EXIT WHEN ccourse%NOTFOUND; -- 打开游标(系别) OPEN cdep; -- 遍历 LOOP FETCH cdep INTO pdno; EXIT WHEN cdep%NOTFOUND; -- 打开游标(成绩) OPEN cgrade(pcno,pdno);查看全部
-
/* 用PLSQL语言编写一个程序。按系(系名)分段统计(成绩小于60分,60-85分,85分以上)"大学物理" 课程各分数段的学生人数,及各系学生的平均成绩。 */ DROP TABLE depgrade; CREATE TABLE depgrade(cno VARCHAR2(8),dno NUMBER(2),num60 NUMBER,num60_85 NUMBER, num85 NUMBER,avggrade NUMBER(3)); ALTER TABLE depgrade ADD(CONSTRAINT pk_cdno PRIMARY KEY(cno,dno)); COMMENT ON TABLE depgrade IS '各系课程统计表'; COMMENT ON COLUMN depgrade.cno IS '课程编号'; COMMENT ON COLUMN depgrade.dno IS '系别'; COMMENT ON COLUMN depgrade.num60 IS '小于60分'; COMMENT ON COLUMN depgrade.num60_85 IS '60-85分'; COMMENT ON COLUMN depgrade.num85 IS '85分以上';查看全部
-
-- 插入表 INSERT INTO emp_sal(deptno,num1,num2,num3,sal) VALUES(pdeptno,pnum1,pnum2,pnum3,pdeptsal); -- 计数器置0 pnum1 := 0; pnum2 := 0; pnum3 := 0; --部门工资置0 pdeptsal := 0; -- 关闭游标 CLOSE csal; END LOOP; -- 关闭游标 CLOSE cdeptno; -- 提交 COMMIT; END; /查看全部
-
-- PL/SQL块 DECLARE --部门 pdeptno emp.deptno%TYPE; --员工工资 psal emp.sal%TYPE := 0; -- 部门工资 pdeptsal emp.sal%TYPE := 0; --6000以上的人数 pnum1 NUMBER :=0 ; --3000以上6000以下的人数 pnum2 NUMBER :=0 ; --3000以下的人数 pnum3 NUMBER :=0 ; --游标(部门) CURSOR cdeptno IS SELECT deptno FROM dept ORDER BY deptno; --游标(员工工资) CURSOR csal(pno emp.deptno%TYPE) IS SELECT NVL(sal,0) FROM emp WHERE deptno = pno; BEGIN -- 处理数据前,清空结果表 DELETE FROM emp_sal; -- 打开游标 OPEN cdeptno; LOOP FETCH cdeptno INTO pdeptno; EXIT WHEN cdeptno%NOTFOUND; -- 打开游标 OPEN csal(pdeptno); LOOP FETCH csal INTO psal; EXIT WHEN csal%NOTFOUND; -- 计数 IF psal > 6000 THEN pnum1 := pnum1 + 1; ELSIF psal >=3000 AND psal < 6000 THEN pnum2 := pnum2 + 1; ELSE pnum3 := pnum3 + 1; END IF; -- 统计部门工资 pdeptsal := pdeptsal + psal; END LOOP;查看全部
-
/* 用PL/SQL语言编写一个程序,实现按部门分段(6000以上、3000~6000,3000元以下)统计各工资段的职工人数 以及各部门的工资总额 (工资总额中不包括奖金) */ -- 创建表emp_sal DROP TABLE emp_sal; CREATE TABLE emp_sal(deptno NUMBER(2) PRIMARY KEY,num1 NUMBER,num2 NUMBER,num3 NUMBER,sal NUMBER(7,2)); -- 备注 COMMENT ON TABLE emp_sal IS '统计各工资段的人数及各部门的工资总额'; COMMENT ON COLUMN emp_sal.num1 IS '6000以上'; COMMENT ON COLUMN emp_sal.num2 IS '3000~6000'; COMMENT ON COLUMN emp_sal.num3 IS '3000元以下';查看全部
-
SET serveroutput ON; DECLARE -- 涨工资的人数 pnum NUMBER := 0; -- 工资总额 ptotalsal NUMBER := 0; -- 员工编号 pempno emp.empno%TYPE; -- 员工工资 psal emp.sal%TYPE; -- 定义游标:从最低工资开始 CURSOR cemp IS SELECT empno,sal FROM emp ORDER BY sal; BEGIN SELECT NVL(SUM(sal),0) INTO ptotalsal FROM emp; -- 打开游标 OPEN cemp; -- 遍历 LOOP --工资总额超过50000 EXIT WHEN ptotalsal > 50000; FETCH cemp INTO pempno,psal; EXIT WHEN cemp%NOTFOUND; --工资总额 ptotalsal := ptotalsal + psal * 0.1; -- 工资总额不能超过5万元 IF ptotalsal > 50000 THEN ptotalsal := ptotalsal - psal * 0.1; EXIT; END IF; -- 工资涨10% UPDATE emp SET sal = psal*1.1 WHERE empno = pempno; -- 涨工资的员工人数加1 pnum := pnum + 1; END LOOP; -- 打印结果 dbms_output.put_line('涨工资的人数:' || pnum); dbms_output.put_line('工资总额:' || ptotalsal); -- 关闭游标 CLOSE cemp; --提交事务 COMMIT; END; /查看全部
-
SET serveroutput ON; DECLARE -- 涨工资的人数 pnum NUMBER := 0; -- 工资总额 ptotal_sal NUMBER := 0; -- 员工编号 pempno emp.empno%TYPE; -- 员工工资 psal emp.sal%TYPE; -- 定义游标:从最低工资开始 CURSOR cemp IS SELECT empno,sal FROM emp ORDER BY sal; BEGIN -- 打开游标 OPEN cemp; -- 遍历 LOOP FETCH cemp INTO pempno,psal; EXIT WHEN cemp%NOTFOUND; -- 工资涨10% psal := psal * (1 + 0.1); -- 统计其他员工的工资总额(不含员工pempno) SELECT NVL(SUM(sal),0) INTO ptotal_sal FROM emp WHERE empno <> pempno; -- 工资总额不能超过5万元 IF ( ptotal_sal + psal ) > 50000 THEN -- 结束遍历 EXIT; ELSE -- 员工pempno涨工资 UPDATE emp SET sal = psal WHERE empno = pempno; END IF; -- 涨工资的员工人数加1 pnum := pnum + 1; END LOOP; -- 工资总额 SELECT NVL(SUM(sal),0) INTO ptotal_sal FROM emp; -- 打印结果 dbms_output.put_line('涨工资的人数:' || pnum); dbms_output.put_line('工资总额:' || ptotal_sal); -- 关闭游标 CLOSE cemp; --提交事务 COMMIT WORK; END; /查看全部
-
-- 统计每年员工的入职人数 DECLARE -- 每年员工入职人数 pcount NUMBER := 0; -- 年份 pyear VARCHAR2(4); -- 员工总人数 pnum NUMBER := 0; -- 定义游标 CURSOR cemp IS SELECT to_char(hiredate,'YYYY') AS hireyear,COUNT(*) FROM emp GROUP BY to_char(hiredate,'YYYY'); BEGIN -- 打开游标 OPEN cemp; --遍历 LOOP FETCH cemp INTO pyear,pcount; -- 循环开始立即检测数据 EXIT WHEN cemp%NOTFOUND; -- 打印每年员工入职人数 dbms_output.put_line(pyear || ' -> ' || pcount); -- 统计总人数 pnum := pnum + pcount; END LOOP; dbms_output.put_line('员工总人数:' || pnum); -- 关闭游标 CLOSE cemp; END; /查看全部
-
记录型变量查看全部
-
fetch查看全部
举报
0/150
提交
取消