2014-10-30 164 views
0

我必須編寫程序生成文件,線條是下一個內容: EMPLOYEE_ID,OLD_SALARY,NEW_SALARY 爲此,我寫了一個過程,提高薪水的給定dapartment,程序,產生該文件。現在,我的程序工作得很好,當我編譯一個程序時,它沒有任何錯誤。但問題是它的工作原理錯誤。當我執行它,我得到這個需要解決方案我的程序

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

請編輯您的問題標題,以便它包含有關問題的信息。 「對我的計劃需要解決方案」對於正在尋找解決方案的未來讀者來說絕對沒有任何意義。我們知道你需要一個解決方案,否則你不會在這裏發佈求助。你的頭銜應該解釋一些你想要解決的問題或你所問的問題。謝謝。 – 2014-10-30 19:23:01

回答

0

在調用raise_salary之前獲取emp_rec中的值,並且不會受到raise_salary中UPDATE的影響。要獲得薪水的新值,您需要再次從數據庫中獲取它。嘗試更改主循環如下:

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; 

分享和享受。