我必须编写生成文件的程序,这些行是下一个内容: EMPLOYEE_ID,OLD_SALARY,NEW_SALARY 为此我写了一个程序,提高给定部门的工资,以及生成该文件的程序。现在,我的程序工作正常,当我编译程序时,它没有任何错误。但问题在于它的工作是错误的。当我执行它时,我得到了这个
108 12008 12008
109 9000 9000
110 8200 8200
111 7700 7700
112 7800 7800
113 6900 6900
OLD_SALARY列和NEW_SALARY列是相同的,它根本没有引发它们。第二次执行后,列仍然相同,但工资首次执行后的时间是4次。 我认为问题出在我的光标中,但我不知道如何解决它。这是整个代码:
CREATE OR REPLACE DIRECTORY dir_vezba AS '/home/oracle/vezba';
CREATE OR REPLACE PROCEDURE raise_salary
IS
v_deptno NUMBER:=100;
v_per NUMBER:=0.2;
BEGIN
UPDATE employees
SET salary=salary*(1+v_per)
WHERE department_id=v_deptno;
UPDATE employees
SET salary=salary*1.05
WHERE department_id=v_deptno AND employee_id IN (SELECT e.employee_id
FROM employees e JOIN employees m
ON (e.manager_id=m.employee_id));
END raise_salary;
/
SET VERIFY OFF
DECLARE
v_deptno NUMBER;
v_oldsalary employees.salary%TYPE;
v_newsalary employees.salary%TYPE;
v_filehandle UTL_FILE.FILE_TYPE;
v_body VARCHAR2(200);
v_line VARCHAR2(200);
v_head VARCHAR2(200);
v_report VARCHAR2(150);
CURSOR emp_cursor IS
SELECT employee_id, salary
FROM employees
WHERE department_id=v_deptno;
BEGIN
v_deptno:=extract_dep('POVECANJE_DEP.txt');
v_report:='IZVESTAJ'||TO_CHAR(SYSDATE, 'YY')||TO_CHAR(v_deptno)||'.log';
v_filehandle:=UTL_FILE.FOPEN('DIR_VEZBA', v_report, 'w');
UTL_FILE.PUTF(v_filehandle, 'Report generated on: '||SYSDATE||' for department: '||v_deptno);
UTL_FILE.NEW_LINE(v_filehandle);
UTL_FILE.NEW_LINE(v_filehandle);
v_head:='EMPNO OLD_SALARY NEW_SALARY';
UTL_FILE.PUTF(v_filehandle, v_head);
UTL_FILE.NEW_LINE(v_filehandle);
v_line:='=================================';
UTL_FILE.PUTF(v_filehandle, v_line);
UTL_FILE.NEW_LINE(v_filehandle);
FOR emp_rec IN emp_cursor
LOOP
v_oldsalary:=emp_rec.salary;
raise_salary;
v_newsalary:=emp_rec.salary;
v_body:=RPAD(emp_rec.employee_id,9,' ')||RPAD(v_oldsalary,14,' ')||RPAD(v_newsalary,10,' ');
UTL_FILE.PUTF(v_filehandle, v_body);
UTL_FILE.NEW_LINE(v_filehandle);
END LOOP;
UTL_FILE.FCLOSE(v_filehandle);
END;
/
答案 0 :(得分:0)
emp_rec
中的值会在您致电raise_salary
之前提取,并且不会受raise_salary
中的更新影响。要获得薪水的新值,您需要再次从数据库中获取它。尝试按如下方式更改主循环:
FOR emp_rec IN emp_cursor
LOOP
v_oldsalary:=emp_rec.salary;
raise_salary;
SELECT SALARY
INTO v_newsalary
FROM EMPLOYEES
WHERE EMPLOYEE_ID = emprec.EMPLOYEE_ID;
v_body:=RPAD(emp_rec.employee_id,9,' ')||RPAD(v_oldsalary,14,' ')||RPAD(v_newsalary,10,' ');
UTL_FILE.PUTF(v_filehandle, v_body);
UTL_FILE.NEW_LINE(v_filehandle);
END LOOP;
分享并享受。