Запустить хранимую процедуру через OraOLEDB - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующая хранимая процедура, которую я должен вызвать из 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 Ответ

0 голосов
/ 10 июля 2018

Предполагая, что ваше соединение правильное и вы хотите получить в качестве результата только выходную переменную, вам не нужна никакая переменная Recordset (и если execute возвращает набор записей, он создаст его для вас).

Я нашел некоторые вещи для исправления, после этого я смог успешно выполнить ваш код

  • Даже если p_valid_flag, вы должны установить значение.
  • Процесс вызывается без ? -заполнителя.

Просто совет (не связанный с вашей реальной проблемой): объявите переменные и используйте 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
...