Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLS-00103程序错误_Oracle_Plsql_Pls 00103 - Fatal编程技术网

Oracle PLS-00103程序错误

Oracle PLS-00103程序错误,oracle,plsql,pls-00103,Oracle,Plsql,Pls 00103,我有两台服务器,一台用于测试,一台用于生产,对于SELECT*FROM V$VERSION;,两台服务器上都有以下Oracle软件包相同的输出: Oracle9i企业版9.2.0.3.0版-生产 PL/SQL 9.2.0.3.0版-生产 核心9.2.0.3.0生产 TNS for Linux:9.2.0.3.0版-生产 NLSRTL版本9.2.0.3.0-生产 奇怪的是,它在一台服务器上工作正常,而在另一台服务器上却出现了这些错误。。。我应该去哪里看?这似乎是一个服务器配置问题 我正在尝试编译此

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

Oracle9i企业版9.2.0.3.0版-生产 PL/SQL 9.2.0.3.0版-生产 核心9.2.0.3.0生产 TNS for 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;  
我在其中一台服务器上发现以下错误: 程序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...
我认为这是行不通的。我建议您尝试以下方法:

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; 

共享和享受。

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

plsql_优化_级别 兼容的

这些方面的差异可能会在服务器之间产生不同的行为。您可以通过以下方式将其更改为动态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  

在Oracle SQL中,以SELECT开头的查询。。。没关系。然而,在Oracle9中,SQL和PL/SQL在DML语句的实现之间存在着严重的差异。这是我能理解为什么选择的唯一原因。。。应该有用。从Oracle10开始,它在SQL和PL/SQL中都应该是正常的。@Codo:我被纠正了。我仍然很想知道上面的响应中的查询版本是否纠正了这个问题。在Oracle 10、Oracle 11中尝试了PL/SQL和SQL,使用SELECT时总是出错。。。建设甲骨文可以处理这一问题,这是没有记录的。可能是真的,您的测试服务器以某种方式取消了补丁以允许此工作?顺便说一句,为什么你需要这个奇怪的选择。。构造?这只是select子句中的一个子查询,没有什么异常。说明在大多数调用表达式expr的语法中可以使用标量子查询表达式。其中包括select语句的select_列表。作为旁注,您知道您正在运行一个不再受支持的版本……请尝试从存储过程外部的光标粘贴整个查询,并查看它是否有效。胡乱猜测-生产中的权限问题,如表上缺少授权?若要检查是否存在配置问题,请尝试在两个数据库上运行select*from v$参数,并比较两个查询的输出。我怀疑您的测试环境已升级到Oracle的其他版本。