2015-10-09 3 views
0
CREATE OR REPLACE PROCEDURE read_file IS 
    f_line  VARCHAR2(2000); 
    f   utl_file.file_type; 
    comma1  VARCHAR(10); 
    comma2  VARCHAR(10); 
    comma3  VARCHAR(10); 
    comma4  VARCHAR(10); 
    comma5  VARCHAR(10); 
    f_empno emp.empno%TYPE; 
    f_ename emp.ename%TYPE; 
    f_job  emp.job%TYPE; 
    f_mgr  emp.mgr%TYPE; 
    f_hiredate emp.doj%TYPE; 
    f_sal  emp.sal%TYPE; 
    BEGIN 
    f := utl_file.fopen('LOG_FILES', 'ab1.txt', 'r'); 

    LOOP 
     BEGIN 
     utl_file.get_line(f, f_line); 
     EXCEPTION WHEN no_data_found THEN EXIT; 
     END; 
     comma1 := INSTR(f_line, ',', 1, 1); 
     comma2 := INSTR(f_line, ',', 1, 2); 
     comma3 := INSTR(f_line, ',', 1, 3); 
     comma4 := INSTR(f_line, ',', 1, 4); 
     comma5 := INSTR(f_line, ',', 1, 5); 

     f_empno := to_number(SUBSTR(f_line, 1, comma1 - 1)); 
     f_ename := SUBSTR(f_line, comma1 + 1, comma2 - comma1 - 1); 
     f_job := SUBSTR(f_line, comma2 + 1, comma3 - comma2 - 1); 
     f_mgr := to_number(SUBSTR(f_line, comma3 + 1, comma4 - comma3 - 1)); 
     f_hiredate := to_date(SUBSTR(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon-yyyy'); 
     f_sal := to_number(SUBSTR(f_line, comma5 + 1), '99999'); 

     dbms_output.put_line(f_empno || ' ' || f_ename || ' ' || f_job || ' ' || f_mgr || ' ' || f_hiredate || ' ' || f_sal); 

     INSERT INTO emp12 VALUES (f_empno, f_ename, f_job, f_mgr, f_hiredate, f_sal); 
    END LOOP; 

    utl_file.fclose(f); 

    COMMIT; 
    END read_file; 
/

Если я выполнить программу в SQL командной строки, как exec read_file;Получение ошибки преобразования во время выполнения процедуры - Oracle SQL

Я получил сообщение об ошибке, как:

BEGIN read_file; END; 

* 

ERROR at line 1: 

ORA-06502: PL/SQL: numeric or value error 

ORA-06512: at "SYSTEM.READ_FILE", line 34 

ORA-06512: at line 1 
+0

демонтировать все преобразования типов данных (to_number и т.д.), например, 'f_empno: = SUBSTR (f_line, 1, Comma1-1) 'И напишите, что вы видите в окне dbms_output – Tatiana

+0

@Tatiana все еще дает ту же ошибку – Abhinav

+0

Если я удалю f_sal из этой процедуры, я получаю пустые строки в таблице emp12. Пожалуйста, решите эту проблему – Abhinav

ответ

0

Ваш вопрос немного неясно ,

Если вы хотите, чтобы выполнить его в командной строке SQL (sqlplus.exe), вы можете использовать

exec read_file; 

Если вы хотите, чтобы выполнить его в какой-либо другой программы, то вам нужно указать, какой язык программирования вы с помощью. Ответ будет зависеть от этого.

+0

Я хочу выполнить ее в командной строке sql, но просто написать exec read_file дать ошибку – Abhinav

+1

@Abhinav Какая ошибка? Как вы его запускаете? Пожалуйста, предоставьте эту информацию в своем вопросе (используйте кнопку * Редактировать *). –

+0

BEGIN read_file; КОНЕЦ; * ОШИБКА в строке 1: ORA-29280: недопустимый путь к каталогу ORA-06512: на "SYS.UTL_FILE", строка 33 ORA-06512: на "SYS.UTL_FILE", строка 436 ORA-06512: на странице «SYSTEM.READ_FILE», строка 15 ORA-06512: в строке 1 – Abhinav

0

В SQL * Plus:

EXEC[UTE] procedure_name; 

назвать его в PL/SQL:

BEGIN 
    procedure_name; 
END; 
/
1
f := utl_file.fopen('UTL_FILE_DIR',fname,'r'); 

UTL_FILE_DIR должен быть каталог, который вы создали ранее. Например

CREATE DIRECTORY UTL_FILE_DIR AS 'C:\LOG_FILES'; 

После этого вы можете использовать этот каталог в utl_file.fopen. Он будет читать файл из каталога UTL_FILE_DIR, который теперь является C: \ LOG_FILES.

Вы должны создать только один раз, прежде чем выполнить процедуру

И я думаю, что вам не нужно f_dir в этом случае

+0

спасибо за ваш ответ, но я все еще получаю проблему – Abhinav

+0

f_sal: = to_number (SUBSTR (f_line, comma5 + 1), '99999'); - «получить числовое значение или значение» в этом случае, когда я запустил процедуру – Abhinav

+0

, проверьте, что у вас есть в переменной f_line. Например. используйте DBMS_OUTPUT.PUT_LINE (f_line || '' || SUBSTR (f_line, comma5 + 1)), чтобы увидеть, что хранится в переменной и что это такое после substr. Похоже, вы получаете характер, который вы не можете преобразовать в номер – Tatiana

Смежные вопросы