运行过程时出现转换错误 - Oracle SQL
Posted
技术标签:
【中文标题】运行过程时出现转换错误 - Oracle SQL【英文标题】:Getting conversion error while running a procedure - Oracle SQL 【发布时间】:2015-10-09 09:12:21 【问题描述】: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;
执行程序
我收到错误消息:
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
【问题讨论】:
删除所有数据类型转换(to_number 等),例如f_empno := SUBSTR(f_line, 1, Comma1-1)
并写下您在 dbms_output 窗口中看到的内容
@Tatiana 仍然给出同样的错误
如果我从此过程中删除 f_sal,我会在表 emp12 中得到空白行。请解决这个问题
【参考方案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
【讨论】:
感谢您的回答,但我仍然遇到问题 f_sal := to_number(SUBSTR(f_line, comma5+1),'99999'); - 当我运行程序时出现“获取数字或值”错误 检查,你在 f_line 变量中有什么。例如。使用 DBMS_OUTPUT.PUT_LINE(f_line ||' '||SUBSTR(f_line, comma5+1)) 查看变量中存储的内容以及 substr 之后的内容。看起来你得到了字符,你不能转换成数字 听不懂你想说什么 您希望在 f_line 变量中看到什么?【参考方案2】:你的问题有点不清楚。
如果你想在 SQL 命令提示符(sqlplus.exe)中执行它,你可以使用
exec read_file;
如果您想在其他程序中执行它,那么您需要指定您使用的编程语言。答案会有所不同。
【讨论】:
我想在 sql 命令提示符下执行,但是只写 exec read_file 会报错 @Abhinav 什么样的错误?你如何运行它?请在您的问题中提供此信息(使用编辑按钮)。 开始读取文件;结尾; * 第 1 行的错误:ORA-29280:无效的目录路径 ORA-06512:在“SYS.UTL_FILE”,第 33 行 ORA-06512:在“SYS.UTL_FILE”,第 436 行 ORA-06512:在“SYSTEM.READ_FILE”,第 15 行 ORA-06512:在第 1 行 这意味着目录 UTL_FILE_DIR 没有定义。使用 CREATE DIRECTORY 语法来定义它。然后,看起来您的程序正在读取和解析一些文本,以便将其内容加载到文件中。通过在该文件上定义一个外部表并使用简单的 INSERT ... SELECT 加载其内容,这可能会更好。 我应该在哪里定义 UTL_FILE_DIR【参考方案3】:在 SQL*Plus 中:
EXEC[UTE] procedure_name;
在 PL/SQL 中调用它:
BEGIN
procedure_name;
END;
/
【讨论】:
以上是关于运行过程时出现转换错误 - Oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章
创建过程oracle sql developer时出现异常错误
运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程