程序写值和加注

时间:2014-10-30 11:52:22

标签: plsql

我必须编写生成文件的程序,这些行是下一个内容: 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;
/

1 个答案:

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

分享并享受。