2014-10-31 61 views
0

需要關於代碼和錯誤的幫助。執行此代碼後:PL/SQL錯誤 - 無效文件ID

CREATE OR REPLACE DIRECTORY dir_vezba AS '/home/oracle/vezba'; 

CREATE OR REPLACE PROCEDURE raise_salary 
    (p_deptno IN NUMBER, p_per IN NUMBER) 
... 
END raise_salary; 
/

SET VERIFY OFF 
DECLARE 
    v_deptno  NUMBER; 
    v_per   NUMBER; 
    v_oldsalary employees.salary%TYPE; 
    v_newsalary employees.salary%TYPE; 
    file_handle UTL_FILE.FILE_TYPE; 
    f_handle  UTL_FILE.FILE_TYPE; 
    file_line  VARCHAR2(200); 
    f_body  VARCHAR2(200); 
    f_line  VARCHAR2(200); 
    f_head  VARCHAR2(200); 
    file_report VARCHAR2(150); 
    CURSOR emp_cursor IS 
     SELECT employee_id, salary 
     FROM employees 
     WHERE department_id=v_deptno; 
BEGIN 
    f_handle:=UTL_FILE.FOPEN('DIR_VEZBA','POVECANJE_DEP.txt','r'); 
    LOOP 
     BEGIN 
     UTL_FILE.GET_LINE(f_handle, file_line); 
     EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      EXIT; 
     END;  
     v_deptno:=TO_NUMBER(SUBSTR(file_line,1,3)); 
     v_per:=TO_NUMBER(SUBSTR(file_line,4,3))/1000; 
     file_report:='IZVESTAJ'||TO_CHAR(SYSDATE, 'YY')||TO_CHAR(v_deptno)||'.log'; 
     file_handle:=UTL_FILE.FOPEN('DIR_VEZBA', file_report, 'w'); 
     UTL_FILE.PUTF(file_handle, 'Report generated on: '||SYSDATE||' for department: '||v_deptno); 
     UTL_FILE.NEW_LINE(file_handle); 
     UTL_FILE.NEW_LINE(file_handle); 
     f_head:='EMPNO OLD_SALARY NEW_SALARY'; 
     UTL_FILE.PUTF(file_handle, f_head); 
     UTL_FILE.NEW_LINE(file_handle); 
     f_line:='================================='; 
     UTL_FILE.PUTF(file_handle, f_line); 
     UTL_FILE.NEW_LINE(file_handle); 
     FOR emp_rec IN emp_cursor 
     LOOP 
     v_oldsalary:=emp_rec.salary; 
     raise_salary(v_deptno, v_per); 
     SELECT salary 
      INTO v_newsalary   
      FROM employees 
      WHERE employee_id=emp_rec.employee_id; 
     f_body:=RPAD(emp_rec.employee_id,9,' ')||RPAD(v_oldsalary,14,' ')||RPAD(v_newsalary,10,' '); 
     UTL_FILE.PUTF(file_handle, f_body); 
     UTL_FILE.FCLOSE(file_handle); 
     END LOOP; 
    END LOOP; 
    UTL_FILE.FCLOSE(f_handle); 
EXCEPTION 
    WHEN UTL_FILE.INVALID_OPERATION THEN 
     file_report:='IZVESTAJ'||TO_CHAR(SYSDATE, 'YY')||'.bad'; 
     file_handle:=UTL_FILE.FOPEN('DIR_VEZBA', file_report, 'w'); 
     UTL_FILE.PUTF(file_handle, 'NO FILE FOUND'); 
     UTL_FILE.FCLOSE(file_handle); 
END; 
/

我得到這個錯誤:

ORA-29282: invalid file ID 
ORA-06512: at "SYS.UTL_FILE", line 1071 
ORA-06512: at line 48 

不知道什麼這個問題,這是什麼意思。除此之外,在輸出中我只能得到一行txt文件而沒有其他的東西。它應該給我3個不同數量的文本文本,取決於表中的數據。

+0

而48行是? – 2014-10-31 10:15:13

+2

你有一個'UTL_FILE.FCLOSE(file_handle);'在你的循環中。不知道這是你問題的根源,但看起來很奇怪。 – DirkNM 2014-10-31 10:20:48

+0

過程有13行,但問題不在此處。它工作得很好。我也認爲問題出在光標上,但不知道是什麼。 – 2014-10-31 10:24:12

回答

1

這是你的問題:

FOR emp_rec IN emp_cursor 
    LOOP 
    v_oldsalary:=emp_rec.salary; 
    raise_salary(v_deptno, v_per); 
    SELECT salary 
     INTO v_newsalary   
     FROM employees 
     WHERE employee_id=emp_rec.employee_id; 
    f_body:=RPAD(emp_rec.employee_id,9,' ')||RPAD(v_oldsalary,14,' ')||RPAD(v_newsalary,10,' '); 
    UTL_FILE.PUTF(file_handle, f_body); 
    ----------> UTL_FILE.FCLOSE(file_handle); <----------- 
    END LOOP; 

您在環路關閉文件時,所以下一輪迭代的PUTF將失敗。

+0

我改變了仍然不起作用 – 2014-10-31 10:37:10

+0

至少錯誤中的行號必須改變? – 2014-10-31 12:51:57

+0

不知道爲什麼,但如果答案沒有解決問題,爲什麼你已經接受了這個答案 – Arun 2015-09-23 10:53:45