我在Oracle 11g中开发了存储过程,需要通过Crystal Reports 14.0.2.364访问它们。当我开发报告时,我使用了直接的Oracle服务器连接(服务器地址,用户名/密码,SID,端口等),报告工作得很好。作为我们LMS的限制,我们被告知必须使用ODBC连接而不是直接的Oracle Server连接,但是,当我以这种方式将Crystal Report连接到存储过程时,我得到一个持久的Error 42000:[Oracle][ODBC] Syntax Error or Access Violation
错误。
我们已经仔细检查了司机,我们是最新的。我们已经验证代码中没有实际的语法错误。我们已经验证了我们登录的用户名,因为它具有运行Oracle存储过程的正确权限。我们已经验证,当提供正确的参数时,存储过程会运行。
我看到的是我无法解释的是这个。报告有4个输入参数,记录集中有36个返回的列从存储过程返回。在Crystal Reports内部,当我到达Database > Show SQL Query
时,我得到以下内容:
{CALL "SABA_REPORT"."HDT_CORE_GETDATA_DDS_V110"(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'STR0115', '4260', NULL,
'course')}
其中36个返回列作为INPUT参数(不应该)作为NULL
值,然后显示正确列出的4个输入参数:'STR0115', '4260', NULL, 'course'
。
因此,我认为传递给存储过程的参数与存储过程所期望的参数之间存在不匹配,从而产生错误。
作为参考,这是存储过程的标题:
create or replace PROCEDURE HDT_CORE_GETDATA_DDS_V110
(
DataReturn IN OUT HDT_CORE_MAIN_V110.CORE_REC_CURSOR
, ParamOrgCode IN VARCHAR2 DEFAULT NULL
, ParamCourseNumber IN VARCHAR2 DEFAULT NULL
, ParamNameKeyword IN VARCHAR2 DEFAULT NULL
, ParamReportType IN VARCHAR2 DEFAULT 'course'
)
DataReturn
SysRefCursor包含36个返回的列。
如何清除此错误?
提前感谢任何见解。
答案 0 :(得分:0)
我的研究表明,RPT文件在存储过程的SQL调用语句中添加了许多额外的列。当直接从连接菜单中的可用存储过程列表中选择存储过程时,就会发生这种情况。因此,我使用仅使用正确参数的手动输入的SQL拉取代了call语句,并且它有效。不确定为什么额外的列被添加到参数列表中,但是管理了这种解决方法。