暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 获取ORA-29284文件读取错误

askTom 2017-05-25
787

问题描述

各位专家好,

我正在尝试从中上传数据的pl/sql功能以下。xls文件到pl/sql表,但ora-29284文件读取错误。

PL/SQL函数:

CREATE OR REPLACE FUNCTION LOAD_data ( p_table in varchar2,
 p_dir in varchar2 DEFAULT 'ORA_DIR' ,
 P_FILENAME in varchar2,
 p_ignore_headerlines IN INTEGER DEFAULT 1,
 p_delimiter in varchar2 default ',',
 p_optional_enclosed in varchar2 default '"' )
 return number
 is
 l_input utl_file.file_type;
 l_theCursor integer default dbms_sql.open_cursor;
 l_lastLine varchar2(4000);
 l_cnames varchar2(4000);
 l_bindvars varchar2(4000);
 l_status integer;
 l_cnt number default 0;
 l_rowCount number default 0;
 l_sep char(1) default NULL;
 L_ERRMSG varchar2(4000);
 V_EOF BOOLEAN := false;
 
 begin
 dbms_output.put_line ('Inside begin...');
 dbms_output.put_line ('Inside begin...');
 l_cnt := 1;
 for TAB_COLUMNS in (
 select column_name, data_type from user_tab_columns where upper(table_name) = upper(p_table) order by column_id
 ) loop
 l_cnames := l_cnames || tab_columns.column_name || ',';
 l_bindvars := l_bindvars || case when tab_columns.data_type in ('DATE', 'TIMESTAMP(6)') then 'to_date(:b' || l_cnt || ',"YYYY-MM-DD HH24:MI:SS"),' else ':b'|| l_cnt || ',' end;
 
 l_cnt := l_cnt + 1;
 end loop;
 l_cnames := rtrim(l_cnames,',');
 L_BINDVARS := RTRIM(L_BINDVARS,',');
 
 L_INPUT := UTL_FILE.FOPEN( P_DIR, P_FILENAME, 'r' );
 IF p_ignore_headerlines > 0
 THEN
 BEGIN
 FOR i IN 1 .. p_ignore_headerlines
 LOOP
 UTL_FILE.get_line(l_input, l_lastLine);
 END LOOP;
 EXCEPTION
 WHEN NO_DATA_FOUND
 THEN
 v_eof := TRUE;
 end;
 END IF;
 
 if not v_eof then
 dbms_sql.parse( l_theCursor, 'insert into ' || p_table || '(' || l_cnames || ') values (' || l_bindvars || ')', dbms_sql.native );
 
 loop
 begin
 utl_file.get_line( l_input, l_lastLine );
 exception
 when NO_DATA_FOUND then
 exit;
 end;
 
 if length(l_lastLine) > 0 then
 for i in 1 .. l_cnt-1
 LOOP
 
 dbms_sql.bind_variable( l_theCursor, ':b'||i,
 rtrim(rtrim(ltrim(ltrim(
 REGEXP_SUBSTR(l_lastline,'(^|,)("[^"]*"|[^",]*)',1,i),p_delimiter),p_optional_enclosed),p_delimiter),p_optional_enclosed));
 end loop;
 begin
 l_status := dbms_sql.execute(l_theCursor);
 l_rowCount := l_rowCount + 1;
 exception
 when OTHERS then
 L_ERRMSG := SQLERRM;
 insert into BADLOG ( TABLE_NAME, ERRM, data, ERROR_DATE )
 values ( P_TABLE,l_errmsg, l_lastLine ,systimestamp );
 end;
 end if;
 end loop;
 
 dbms_sql.close_cursor(l_theCursor);
 utl_file.fclose( l_input );
 ---commit;
 end if;
 insert into IMPORT_HIST (FILENAME,TABLE_NAME,NUM_OF_REC,IMPORT_DATE)
 values ( P_FILENAME, P_TABLE,l_rowCount,sysdate );
 
 commit;
 RETURN L_ROWCOUNT;
 end LOAD_data;

---------------------------------------Anonymous block to run above function-----------------------------------------------
DECLARE
 p_table VARCHAR2(200) := 'temp_data';
 p_dir VARCHAR2(200) := 'ORA_DIR';
 p_filename VARCHAR2(200) := 'Data1.xls';
 p_ignore_headerlines integer := 1;
 p_delimiter varchar2(2) := ',';
 p_optional_enclosed varchar2(2) := '"';
 v_return NUMBER;
BEGIN
 v_return := LOAD_CSV(p_table => p_table
 ,p_dir => p_dir
 ,p_filename => p_filename
 ,p_ignore_headerlines => p_ignore_headerlines
 ,p_delimiter => p_delimiter
 ,p_optional_enclosed => p_optional_enclosed);
 
 dbms_output.put_line('v_return = ' || v_return);
END;


请建议。

谢谢,
Ankit。


专家解答

你的方法似乎是假设输入数据为csv。

但是XLS文件不是CSV,它是二进制格式。您需要将XLS文件保存为CSV,然后加载它。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论