我有一个仍在Oracle 9i上运行的遗留应用程序。我们今年晚些时候将迁移到11g,但目前我需要在当前环境中运行一些测试脚本。
我的测试使用存储过程,但是当我尝试编译该过程时,我收到以下错误。
" PLS-00103:遇到符号"文件结束"当期待其中一个 以下内容:"
这很奇怪,就像大约两年前在同一台服务器上编译的存储过程一样。唯一的区别是数据库已被生产数据库的副本覆盖(因为此过程仅用于测试,因此在生产数据库中不存在)。
问题似乎源于程序中的本地功能。这是一个非常简单的程序,说明了我得到的错误:
create or replace procedure test
as
l_dt date;
function dt
return date
is
begin
return sysdate;
end;
begin
l_dt := dt;
dbms_output.put_line(to_char(l_dt, 'dd-mm-yyyy'));
end;
编辑:这是我尝试编译时的完整输出:
1 ORA-24344: success with compilation error
10 PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
10
10 begin function package pragma procedure form
13 ORA-06550: line 2, column 3:
13 PLS-00201: identifier 'L_DT' must be declared
13 ORA-06550: line 2, column 3:
13 PL/SQL: Statement ignored
14 ORA-06550: line 3, column 32:
14 PLS-00201: identifier 'L_DT' must be declared
14 ORA-06550: line 3, column 3:
14 PL/SQL: Statement ignored
14 SQL parse error location
它似乎肯定是导致它的本地功能,就像我把它拿出来一样,它编译得很好。这是上面的过程,删除了本地函数,并且正常工作:
create or replace procedure test
as
l_dt date;
begin
l_dt := sysdate;
dbms_output.put_line(to_char(l_dt, 'dd-mm-yyyy'));
end;
我想知道是否有其他人遇到过这个问题,或者知道本地功能是否有任何原因无法在Oracle 9i下编译?
谢谢,
詹姆斯
答案 0 :(得分:2)
在函数的end
之后,正在针对第10行报告错误,因此未正确解析封闭过程。你正在做的事情很好,并通过其他客户端工作,并尝试使用SqlDbx的版本。看起来这个过程被视为两个语句,并以两个块的形式发送到数据库,这两个块本身都不是有效的。
the SqlDbx Oracle forum报告了此问题,其中提到版本3.64和4.0中存在错误。它似乎并不特定于Oracle版本。在2014-04-14,回复是:
这是一个错误,它将在大约两周内在最新版本的后续版本中修复。
release notes for version 4.1包括:
修正:
1. Unicode版本中返回的损坏文本
2.解析嵌套函数(Oracle)时出错 ...
所以你需要升级到4.1或更高版本;当前版本是4.3,我没有看到该版本针对9i或11g数据库的这个问题。