【发布时间】:2011-08-06 22:35:48
【问题描述】:
我有 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 版本是相同的。我很确定这是导致此问题的配置选项。但我不知道在哪里寻找解决方案。
如果“Select ( Select ...”不是标量子查询,它就可以正常工作。当它在游标内时会失败。为什么它不能在生产服务器上工作?
【问题讨论】:
-
附带说明,您知道您正在运行的版本不再受支持.....
-
尝试将整个查询从游标粘贴到存储过程之外,看看它是否有效。疯狂的猜测 - 生产中的权限问题,例如缺少表上的授权?
-
要检查是否是配置问题,请尝试在两个数据库上运行
select * from v$parameter并比较两个查询的输出。 -
我怀疑您的测试环境已升级到不同版本的 Oracle。