1

私は2つのサーバー(テスト用と本番用)を持っており、どちらにも次のOracleパッケージがあります(両方のサーバーで同じ出力SELECT * FROM V$VERSION;

Oracle9i Enterprise Edition リリース 9.2.0.3.0 - 本番
PL/SQL リリース 9.2.0.3.0 - 本番
CORE 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;  

サーバーの 1 つで次のエラーが発生します。
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 のバージョンは同じです。この問題を引き起こしているのは構成オプションであると確信しています。しかし、解決策を探す場所がわかりません。

"Select ( Select ..." は、スカラー サブクエリでない場合は正常に機能します。カーソル内にあると失敗します。運用サーバーで機能しないのはなぜですか?

4

2 に答える 2

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; 

共有してお楽しみください。

于 2011-04-18T14:41:00.290 に答える
0

2 つのサーバーを比較するという観点から、いくつかの初期化パラメーターをチェックする価値があるかもしれません。

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  
于 2017-04-18T05:28:02.530 に答える