2014-07-18 1 views
1

У меня есть устаревшее приложение, которое все еще работает на Oracle 9i. Мы перейдем к 11 г в этом году, но на данный момент мне нужно запустить несколько тестовых скриптов в текущей среде.Компиляция хранимой процедуры с локальными функциями в Oracle 9i

В моем тесте используется хранимая процедура, но когда я пытаюсь скомпилировать процедуру, я получаю следующую ошибку.

«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; 

Edit: Вот полный выход, когда я пытаюсь скомпилировать это:

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

Эта процедура в порядке; так как вы его компилируете? Из SQL * Plus, в SQL Developer, какой-то другой клиент? Нужен ли клиенту только терминатор после него, например '/' на своей собственной линии? –

+0

Я использую клиент под названием SqlDbx. У меня не было проблем с компиляцией хранимых процедур и пакетов с ним раньше. Я отредактирую исходное сообщение с хранимой процедурой, которая компилируется. –

+0

Обе версии процедуры компилируются для меня в SqlDbx 4.3 Personal Edition. Против 11gR2, но это не должно иметь никакого значения для того, что это делает. –

ответ

2

Ошибка сообщается с линией 10, после end функции, поэтому процедура вшита не разбираемый должным образом. То, что вы делаете, все равно, и работает через других клиентов, а также с версией 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.

+0

А, я использую 3.61. Я расскажу об обновлении. –

+0

Я смог скомпилировать хранимую процедуру в SQLplus, так что она, похоже, является ошибкой в ​​версии SqlDbx, которую я использую. Я должен признать, что он должен быть на заднем плане, а не на клиенте. –