我有一个存储过程,它执行一些动态sql,如下所示。我试图尽可能地减少它,所以忽略任何小错误。
在办公室中,每次都可以11.2
,10.2
,10.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中执行,可能是吗?
在这里亏本
由于
答案 0 :(得分:0)
我发现"可以在这台服务器上运行但不能在该服务器上运行"之前的问题类型。
通常它与隐含日期< - >相关。 varchar转换:由于不同的数据库服务器可以具有不同的默认格式,因此对于具有隐式转换的语句可以在一个位置工作而在另一个位置失败是可能的。
我建议您尝试删除pADMINDATE
日期变量。
答案 1 :(得分:0)
这是回车!添加此行可修复问题
pQUERY2 := REPLACE(pQUERY, chr(13));
此处突出显示了类似的问题
https://forums.oracle.com/forums/thread.jspa?threadID=1117462
感谢您的回答,如果有人知道我会有兴趣知道什么设置/补丁/任何使Oracle对此敏感,即我在3个不同版本的oracle上尝试了这个,包括客户所在的那个,但是 - 我没有修补我的10.2.1版本。 它是修补补丁中的东西吗?这是一个设置吗?