Ошибка PLS-00103 для процедуры - PullRequest
1 голос
/ 16 апреля 2011

У меня есть 2 сервера (один для тестирования, один для производства), оба имеют следующие пакеты Oracle (идентичный вывод на обоих из них для SELECT * FROM V$VERSION;:

Oracle9i Enterprise Edition, выпуск 9.2.0.3.0 - Производство
PL / SQL Release 9.2.0.3.0 - Производство
CORE 9.2.0.3.0 Производство
TNS для Linux: версия 9.2.0.3.0 - производство
NLSRTL Версия 9.2.0.3.0 - Производство

Странно то, что он отлично работает на одном сервере и выдает эти ошибки на другом ... Где мне искать? Кажется, это проблема конфигурации сервера.

Я пытаюсь скомпилировать эту процедуру:

CREATE OR REPLACE PROCEDURE P_A1 AS  
  NUMAR INTEGER := 0;  
  CURSOR A1_C3 IS  
    SELECT   
(SELECT SUM(D1.A_PAY) FROM A1_A D1 WHERE D1.YR_R = D.YR_R AND D1.MON_R = D.MON_R) x_A  
      FROM APP_COMPANY_ALL CO, A1_A D  
     WHERE D.YR_R = y.APPL_admin.F$APPL_YEAR  
       AND D.MON_R = y.APPL_admin.F$APPL_MONTH  
       AND d.cif=SUBSTR(RTRIM(CO.c_fisc),3);  
  V_A1 A1_C3%ROWTYPE;  

 BEGIN  
  NULL;  
END;  

Я получаю следующие ошибки на одном из серверов:
Ошибки компиляции для PROCEDURE P_A1

Error: PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

          ( - + case mod new not null others <an identifier>
          <a double-quoted delimited-identifier> <a bind variable> avg
          count current exists max min prior sql stddev sum variance
          execute forall merge time timestamp interval date
          <a string literal with character set specification>
          <a number> <a single-quoted SQL string> pipe
Text: (SELECT SUM(D1.A_PAY) FROM A1_A D1 WHERE D1.YR_R = D.YR_R AND D1.MON_R = D.MON_R) x_A

Error: PLS-00103: Encountered the symbol ")" when expecting one of the following:

          . ( * @ % & - + ; / at for mod rem <an exponent (**)> and or
          group having intersect minus order start union where connect
          ||
Text: (SELECT SUM(D1.A_PAY) FROM A1_A D1 WHERE D1.YR_R = D.YR_R AND D1.MON_R = D.MON_R) x_A

Дело в том, что, как я уже сказал, он работает на тестовом сервере, но не на рабочем сервере. Версии Oracle идентичны. Я почти уверен, что именно эта опция конфигурации вызывает эту проблему. Но я не знаю, где искать решение.

«Выбрать (Выбрать ...» работает просто отлично, если это не скалярный подзапрос. Сбой, когда он находится внутри курсора. Почему он не работает на рабочем сервере?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2017

Может стоить проверить пару параметров инициализации с точки зрения сравнения двух серверов:

plsql_optimize_level совместимый

Различия в этих могут привести к разному поведению между серверами. Вы можете подтвердить предположение о том, что это может быть проблемой синтаксического анализатора, изменив его на динамический SQL в соответствии с:

open my_cursor for 
     'SELECT   
           (SELECT SUM(D1.A_PAY) FROM A1_A D1 WHERE D1.YR_R = D.YR_R AND D1.MON_R = D.MON_R) x_A  
      FROM APP_COMPANY_ALL CO, A1_A D  
     WHERE D.YR_R = :1 
       AND D.MON_R = :2
       AND d.cif=SUBSTR(RTRIM(CO.c_fisc),3)'  using y.APPL_admin.F$APPL_YEAR , y.APPL_admin.F$APPL_MONTH  
0 голосов
/ 18 апреля 2011

Возможно, это была проблема «вырезать и вставить», но в оригинальном сообщении курсор начинается с

SELECT (SELECT...

что я не думаю, будет работать. Я предлагаю вам попробовать следующее:

CREATE OR REPLACE PROCEDURE P_A1 AS
  NUMAR INTEGER := 0;
  CURSOR A1_C3 IS
    SELECT x_A.PAY_SUM
      FROM (SELECT SUM(D1.A_PAY) AS PAY_SUM
              FROM A1_A D1
              WHERE D1.YR_R = D.YR_R AND
                    D1.MON_R = D.MON_R) x_A
      INNER JOIN A1_A A D
        ON (D.YR_R = y.APPL_admin.F$APPL_YEAR AND
            D.MON_R = y.APPL_admin.F$APPL_MONTH)
      INNER JOIN APP_COMPANY_ALL CO
        ON (SUBSTR(RTRIM(CO.c_fisc),3) = D.CIF);
  V_A1 A1_C3%ROWTYPE;
BEGIN
  NULL;
END P_A1; 

Делись и наслаждайся.

...