2016-11-26 53 views
0

我的表是:甲骨文給PL/SQL:數字或值錯誤:字符數錯誤

​​

我試圖從CSV文件導入上面的表格到預先定義的表在Oracle數據庫。以下是導入上表的代碼(pl sql代碼)。

代碼:

Drop table emp_tbl 
create table emp_tbl 
(EmpNo Number, 
EName varchar2(15), 
Job Varchar2(15), 
MGR Varchar2(30), 
HireDate Date, 
Sal Number 
); 


create or replace procedure read_file_proc 
Is 
    f_line varchar2(2000); 
    f utl_file.file_type ; 
    f_dir varchar2(250); 
    fname varchar2(50); 
    comma1 Number; 
    comma2 Number; 
    comma3 Number; 
    comma4 Number; 
    comma5 Number; 
    f_empno emp_tbl.empno%type; 
    f_ename emp_tbl.ename%type; 
    f_job emp_tbl.job%type; 
    f_mgr emp_tbl.MGR%type; 
    f_hiredate emp_tbl.hiredate%type; 
    f_sal emp_tbl.sal%type; 
Begin 
    dbms_output.put_line('At Begin'); 
    fname := 'Emp_tbl.csv'; 
    f := utl_file.fopen('UTL_FILE_DIR', fname, 'R'); 
    dbms_output.put_line('Before loop'); 
    loop 
    Begin 
     Utl_file.get_line(f, f_line); 
     --dbms_output.put_line(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 := 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)); 
    insert into emp_tbl values(f_empno, f_ename, f_job, f_mgr, f_hiredate, f_sal); 

    end loop; 
    utl_file.fclose(f); 
    --commit; 
end read_file_proc; 

但是當在SQL顯影劑運行我收到如下錯誤:

ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "SYSTEM.READ_FILE_PROC", line 36 ORA-06512: at line 2

但是,當我爲f_empno直接輸入值(通過使用插入查詢),f_hiredate, f_salary ...它工作正常。

任何人都可以請告訴我爲什麼我得到上面提到的錯誤。

在此先感謝。

編輯:由於問的第一個行CSV文件顯示爲:

1,Akon,TSP,Navi,01-10-2002,2000 
+0

請使用良好的佈局,讓您的代碼更具可讀性。它將在調試時幫助你。例如,查看我的代碼中的更改。 – wieseman

+0

f_empno的結果是一個varchar2(f_empno是唯一的數字變量)。嘗試相同,但通過創建表使用empno作爲varchar2。然後你會看到在插入過程中使用的值。在你使它成爲一個存儲過程之前,不要使用存儲過程運行該過程,並在使用插入語句前檢查這些值(使用dbms_output.put_line) – wieseman

+0

請分享csv文件 –

回答

1

看來日期格式是錯誤的。

f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy'); 

正確的格式是dd-mm-yyyy

附:
有很多更好的方法來做到這一點。
如果你有權訪問服務器的外部表格會很好。
從客戶端,SQL * Loader。
如果你堅持程序 - 正則表達式將很好地爲你服務。

+0

以下的答案吧..但仍然無法正常工作。 – Dave

+0

@戴夫,我需要看到一些數據,以確定正確的格式。 –

-1

謝謝大家的回覆。

我已經改變

f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy'); 

f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mm-yyyy'); 

而實際上我csv文件是:

EmpNo,Ename,Job,MGR,HireDate,Sal 
1,Akon,TSP,Navi,01-10-2002,2000 
2,Anu,SSP,Man,03-11-2005,2300 

的問題是第一行包含列名稱而不是數據。

+0

pl。證明否定的迴應。 – Dave