我正在研究Oracle SQL开发人员。
我正在做的是从文件夹中逐行读取文本文件。 然后将数据插入SQL表。
我可以编译我的PROCEDURE,但是,它似乎没有将数据插入文件。
Create or Replace PROCEDURE Rfile is
f UTL_FILE.FILE_TYPE;
s VARCHAR2(200);
BEGIN
f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');
IF UTL_FILE.IS_OPEN(f) THEN
LOOP
BEGIN
UTL_FILE.GET_LINE(f,s);
IF s IS NULL THEN
EXIT;
END IF;
INSERT INTO DATAINSERT
(COLUMN1, COLUMN2)
VALUES
(s, 'testdatabinary');
END;
END LOOP;
COMMIT;
END IF;
END;
我有一个DATAINSERT表,有两个varchar(200)类型的cols
我不确定PROCEDURE没有将数据插入表
的原因我刚刚查看了错误消息
Error starting at line 1 in command:
EXEC Rfile
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "SYSTEM.RFILE", line 5
答案 0 :(得分:8)
不确定导致问题的原因。对我来说,这里的工作正常是我的示例代码
- 参考站点 - https://community.oracle.com/thread/3633577?start=0&tstart=0
set serveroutput on;
CREATE or replace DIRECTORY USER_DIR AS '/home/oracle';
GRANT READ ON DIRECTORY USER_DIR TO PUBLIC;
DECLARE
V1 VARCHAR2(200); --32767
F1 UTL_FILE.FILE_TYPE;
BEGIN
F1 := UTL_FILE.FOPEN('USER_DIR','temp.txt','R');
Loop
BEGIN
UTL_FILE.GET_LINE(F1,V1);
dbms_output.put_line(V1);
EXCEPTION WHEN No_Data_Found THEN EXIT; END;
end loop;
IF UTL_FILE.IS_OPEN(F1) THEN
dbms_output.put_line('File is Open');
end if;
UTL_FILE.FCLOSE(F1);
END;
/
set serveroutput off;
答案 1 :(得分:7)
您无法直接输入文件打开命令的路径,如此
f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');
您必须使用以下sql查询
创建目录,而不是直接输入路径创建或替换DIRECTORY USER_DIR AS' C:\ PROJECTS \';
然后输入文件打开命令的目录名称。它会像这样
f := UTL_FILE.FOPEN('USER_DIR ','testdatabinary.txt','R');
答案 2 :(得分:1)
尝试将文件从PC加载到服务器的第一个过程,而第二个过程文件是从服务器到服务器。 UTL_FILE.FOPEN
适用于服务器端PL / SQL。所以第一个程序不能正确执行......如果你想将文件从PC加载到服务器,那么你需要使用任何前端,如D @ K或VB。
答案 3 :(得分:0)
您在这里犯的错误是使用工作站路径,实际上您需要使用目录路径。
解决此问题的最快方法是使用 WINSCP 命令。
使用 WINSCP 告诉您目录路径是什么,然后只需将此新信息替换为您的代码中的旧路径,一切都应该正常。
答案 4 :(得分:-1)
这是非常概念性和棘手的。您可以在下面找到更多概念和详细信息: https://ora-data.blogspot.in/2016/11/read-and-writ-text-file-using-UTLFILE.html
肯定会有所帮助:
create or replace procedure read_file is
f_line varchar2(2000);
f utl_file.file_type;
f_dir varchar2(250);
fname varchar2(50);
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.hiredate%type;
f_sal emp.sal%type;
begin
f_dir := ‘E:\PLSQL’;
fname := ‘input.txt’;
f := utl_file.fopen(‘UTL_FILE_DIR’,fname,’r’); –opening the file using fopen function
loop
begin
utl_file.get_line(f,f_line);
–using a loop continuously get the file’s content using get_line function 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);
–Each field in the input record is delimited by commas.
–We need to find the location of two commas in the line.
–and use the locations to get the field from the line.
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;
/
答案 5 :(得分:-2)
首次登录
用户名:sys as sysdba
密码应与用户' system'
相同现在输入
SQL>将UTL_FILE上的执行授予PUBLIC;
现在使用您要创建过程的任何用户登录