程序的PLS-00103错误

时间:2011-04-16 15:08:27

标签: oracle plsql pls-00103

我有2台服务器(一台用于测试,一台用于生产),两台服务器都有以下Oracle软件包(两者都有相同的输出SELECT * FROM V$VERSION;

Oracle9i企业版9.2.0.3.0版 - 生产
PL / SQL版本9.2.0.3.0 - 生产
核心9.2.0.3.0生产
适用于Linux的TNS:版本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 :(得分:0)

这可能只是一个剪切粘贴问题,但在原始帖子中,光标以

开头
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; 

分享并享受。

答案 1 :(得分:0)

在比较两个服务器方面,可能值得检查几个初始化参数:

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