Запустить хранимую процедуру через OraOLEDB
У меня есть следующая хранимая процедура, которую я должен вызвать из VBA.
declare
p_segment1 varchar(25);
p_segment2 varchar(25);
p_segment3 varchar(25);
p_segment4 varchar(25);
p_segment5 varchar(25);
p_valid_flag varchar(1);
begin
p_segment1 := 'code segment here';
p_segment2 := 'code segment here';
p_segment3 := 'code segment here';
p_segment4 := 'code segment here';
p_segment5 := 'code segment here';
apps.key_validate_gl_code_comb(p_segment1, p_segment2, p_segment3, p_segment4, p_segment5, p_valid_flag);
dbms_output.put_line('Flag: ' || p_valid_flag);
end;
Мне нужно вызвать эту процедуру в VBA из Excel, но я получаю сообщение об ошибке, выполнив следующий код:
Set pCommand = New Command
Set pProcedureRecordset = New Recordset
With pCommand
Set .ActiveConnection = pConnection
.CommandType = adCmdStoredProc
Set p_Segment1 = .CreateParameter("p_segment1", adVarChar, adParamInput, 25, 'code segment here')
Set p_Segment2 = .CreateParameter("p_segment2", adVarChar, adParamInput, 25, 'code segment here')
Set p_Segment3 = .CreateParameter("p_segment3", adVarChar, adParamInput, 25, 'code segment here')
Set p_Segment4 = .CreateParameter("p_segment4", adVarChar, adParamInput, 25, 'code segment here')
Set p_Segment5 = .CreateParameter("p_segment5", adVarChar, adParamInput, 25, 'code segment here')
Set p_Valid_Flag = .CreateParameter("p_valid_flag", adVarChar, adParamInputOutput, 1)
.Parameters.Append p_Segment1
.Parameters.Append p_Segment2
.Parameters.Append p_Segment3
.Parameters.Append p_Segment4
.Parameters.Append p_Segment5
.Parameters.Append p_Valid_Flag
.CommandText = "apps.key_validate_gl_code_comb(?,?,?,?,?,?)"
Set pProcedureRecordset = .Execute
End With
Когда я запускаю это в SQL Developer, я получаю желаемый результат, но когда я запускаю его из VBA, я получаю Unspecified Error
сообщение.
Как я могу вызвать хранимую процедуру из VBA, чтобы получить вывод?
1 ответ
Предполагая, что ваше соединение правильное, и вы хотите получить в качестве результата только выходную переменную, вам не нужна переменная Recordset (и если execute возвращает набор записей, он создаст его для вас).
Я нашел некоторые вещи, чтобы исправить, после этого я мог успешно выполнить ваш код
- Даже если
p_valid_flag
Вы должны установить значение. - Процесс вызывается без
?
-placeholder.
Просто совет (не связанный с вашей реальной проблемой): объявите переменные и используйте Option Explicit
Set pCommand = New ADODB.Command
With pCommand
Set .ActiveConnection = pConnection
.CommandType = adCmdStoredProc
Set p_Segment1 = .CreateParameter("p_segment1", adVarChar, adParamInput, 25, "code segment here")
...
Set p_Valid_Flag = .CreateParameter("p_valid_flag", adVarChar, adParamInputOutput, 1, "")
.Parameters.Append p_Segment1
...
.Parameters.Append p_Valid_Flag
.CommandText = "apps.key_validate_gl_code_comb"
.Execute
Debug.Print "-->" & p_Valid_Flag.Value
End With