在Oracle 9i上使用本地函数编译存储过程

时间:2014-07-18 15:06:25

标签: oracle stored-procedures plsql oracle9i

我有一个仍在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下编译?

谢谢,

詹姆斯

1 个答案:

答案 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数据库的这个问题。