0

我有一个执行一些动态 sql 的存储过程,如下所示。我试图尽可能地减少它,所以忽略任何小错误。

在办公室它工作,每次,在11.2,,。在客户处,它失败并显示一条消息:10.210.1

Unexpected Error

Error Message = "Msg:
MyProc
ORA-06550: line 1, column 1:
PLS-00103: Encountered the symbol "" when expecting one of the following:

   begin case declare exit for function goto if loop mod null

如果我捕获客户正在生成的动态 sql 并将其放在如下变量中,在工作机器上运行,它就可以工作,所以并不是生成了狡猾的 sql。通常 sql 来自客户端,所以在这里我将 to_date 引号加倍。

mySQL := '
declare 
                pADMINDATE DATE := :1; 
                pEMPLOYEEIDLIKE VARCHAR2(40) := :2; 
                pINCLUDEEMPLOYEE number := :3; 

begin 
BEGIN OTHERPROC.OTHERPROC (1,TO_DATE(''2012-10-03'', ''YYYY-MM-DD''),TO_DATE(''2012-10-03'', ''YYYY-MM-DD''),0); 
END; 
INSERT INTO TP_EMPLOYEES ( 
        ID, 
            EMPLOYEECODE
) 


SELECT ROWNUM, 
       EMPLOYEECODE
FROM ( 

SELECT EMPLOYEECODE
   FROM (SELECT DISTINCT EMPLOYEECODE FROM TP_EEF_TEMP) DISTINCTEMPCODES) A; 
end; ';

EXECUTE IMMEDIATE
    mySQL
    using 
    pADMINDATE,
    pEMPLOYEEIDLIKE,
    pINCLUDEEMPLOYEE;

这不是导致问题的数据库版本,可能是权限吗?它在自身内部调用另一个存储过程,我们经常在非动态 sql 中执行,可能是这样吗?

在这里不知所措

谢谢

4

2 回答 2

0

我以前发现过“在这台服务器上工作但在该服务器上不起作用”类型的问题。

通常它与隐式日期 <-> varchar 转换有关:由于不同的数据库服务器可以具有不同的默认格式,因此具有隐式转换的语句可能在一个地方工作而在另一个地方失败。

我建议您尝试运行删除pADMINDATE日期变量的示例。

于 2012-10-04T08:33:48.083 回答
0

是回车!添加此行解决了问题

pQUERY2 := REPLACE(pQUERY, chr(13));

这里强调了一个类似的问题

https://forums.oracle.com/forums/thread.jspa?threadID=1117462

无论如何,感谢您的回答,如果有人知道我有兴趣知道什么设置/补丁/什么使 Oracle 对此敏感,即我在 3 个不同版本的 oracle 上尝试过这个,包括客户使用的那个,-但是-我没有不要修补我的 10.2.1 版本。它是在补丁中修复的吗?是设定吗?

于 2012-10-04T13:49:36.290 回答