【发布时间】:2011-07-20 00:21:59
【问题描述】:
这必须以某种方式与提供程序相关,因为它在我的开发盒上工作正常,但在另一个开发盒上不起作用。
这是我在非工作开发盒上遇到的错误:
ORA-00604:递归 SQL 级别 1 发生错误
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小
ORA-06512:第 26 行
ORA-06550:第 1 行,第 7 列:
PLS-00306:调用“LISTAVAILSUBMISSIONS”时参数的数量或类型错误
ORA-06550:第 1 行,第 7 列:
PL/SQL:语句被忽略
这里是 Oracle 过程:
Procedure ListAvailSubmissions (avail_submission in out rc_avail_submission)
is
Begin
open avail_submission for
select submission_id from nais_submissions
where condition = 'ONLINE'
and status in ('ACTIVE','LOGGED')
order by submission_id desc;
Exception
When no_data_found then
v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id: No Data Found');
utl_file.fclose(v_output);
When others then
v_error_code := sqlcode;
v_error_message := substr (sqlerrm, 1, 300);
v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id:'|| v_error_code ||':'|| v_error_message);
utl_file.fclose(v_output);
End ListAvailSubmissions;
如您所见,唯一的参数是返回参数,即结果记录集
来自 VB 的调用非常简单。
Public Function GetTestRequests() As ADODB.Recordset
Dim rsADO As New ADODB.Recordset
Dim cmdCommand As New ADODB.Command
Set cmdCommand.ActiveConnection = cnnADO //Ive already verified the connection is good
cmdCommand.CommandText = "ListAvailSubmissions"
Set rsADO = cmdCommand.Execute(, , adCmdStoredProc)
Set GetTestRequests = rsADO
End Function
令人沮丧的部分是它在一台机器上工作,而不是在另一台机器上工作。我使用 msdaora.1 作为提供程序,并且我已经使用 MS CompChecker 工具验证了两台机器具有相同的 MDAC 版本。我确实发现的一件事是,如果我将工作机器切换到使用 OraOLEDB 而不是 msdaora.1,它将抛出相同的错误。基于此,我开始认为不工作的机器表现出正确的行为,我需要修复代码。
我做了很多研究,我认为这与 in out 参数有关,并试图将 ADODB.Recordset 设置为等于该参数。我尝试将参数更改为仅输出,但没有帮助,仍然出现相同的错误。
感谢您的帮助,这个错误让我发疯了。
【问题讨论】:
-
“我开始认为非工作机器表现出正确的行为......我认为它与 in out 参数有关并试图设置 ADODB。记录集等于参数”——我认为你的想法是正确的。
标签: sql oracle stored-procedures vb6 adodb