Мир InterBase

         

Работа с хранимыми процедурами


Хранимые процедуры делятся на две категории - селективные (процедуры- выборки) и исполняемые.

Принцип работы с селективной хранимой процедурой, возвращающей ре- з>льтат своей работы в виде набора строк, очень похож на выполнение обычного SQL-запроса "SELECT..." содержащего параметры.

Вызов селективной процедуры "SUB_TOT_BUDGET"

    ADODB

'вспомогательная функция конвертирования VARIANT в строку

'с поддержкой NULL

Function my_cstr(s As Variant) As String

If (IsNull(s)) Then

my_cstr = "NULL"

Else

my_cstr = CStr(s)

End If

End Function



Sub sproc_select()

Dim cn As New ADODB.Connection

cn.Open "file name=d:\database\employee.ibp"

cn.BeginTrans

Dim cmd As New ADODB.Command

cmd.ActiveConnection = cn

cmd.CommandText = "select * from SUB_TOT_BUDGET(?)"

cmd(0) = 100

Dim rs As ADODB.Recordset

Set rs = cmd.Execute

Dim col As Long

While Not rs.EOF

Debug.Print "----------------"

For col = 0 To rs.Fields.Count - 1

Debug.Print CStr(col) & ":" & rs.Fields(col).Name & " - " &

my_cstr(rs(col})

Next col

rs.MoveNext

Wend

cn.CommitTrans

End Sub

Вызов исполняемой ХП отличается от использования селективной ХП в том плане, что применяют SQL-запрос EXECUTE PROCEDURE... и получают результат работы через out-параметры. IBProvider различает только вызов исполняемой ХП, анализируя сигнатуру SQL-запроса. Наряду с SQL-выражением EXECUTE PROCEDURE..., непосредственно поддерживаемого InterBase, в тексте команды можно указывать EXECUTE ... и ЕХЕС ... IBProvider распознает в этих командах попытку вызова исполняемой ХП и автоматически приводит текст SQL-запроса к совместимому с InterBase. Для получения результата работы исполняемой ХП нужно либо самостоятельно описать out-параметры, либо попросить команду сформировать эти описания самостоятельно (ADODB Command Paiameters.Refresh). Основными правилами здесь являются:

  • В тексте запроса out-параметры не упоминаются

  • Описание out-параметров после in-параметров.


  • Не обязательно определять все out-параметры. При работе через ADODB. это могут быть первые out-параметры из всего списка (пропуски не допускаются). При прямой работе с OLE DB-командой можно указывать имена интересующих выходящих параметров ХП, тем самым получать out-параметры в любой комбинации.


  • Тестовая база данных employee.gdb не содержит готовых примеров исполняемых ХП, поэтому для следующего примера будет определена своя собственная простейшая хранимая процедура.

    Определение исполнимой хранимой процедуры:

        SQL

    create procedure sp_calculate_values(x integer,у integer)

    returns(valuel integer,value2 varchar(64))

    as

    begin

    valuel=x+y;

    value2=x-y;

    end

    Вызов и обработка результатов исполнимой хранимой процедуры SP_CALCULATE_VALUES:

        ADODB

    Sub sproc_exec()

    Dim en As New ADODB.Connection

    cn.Open "file name=d:\database\employee.ibp"

    cn.BeginTrans

    Dim cmd As New ADODB.Command

    cmd.ActiveConnection = cn

    'автоматическое определение параметров

    cmd.CommandText = "exec sp_calculate_values(:xl,:x2)"

    cmd('x1") =200

    cmd("x2") = 100

    cmd.Execute

    Debug.Print "outl=" & CStr(cmd("valuel"))

    Debug.Print "out2=" & CStr(cmd("value2"))

    ' явное определение параметров

    cmd.CommandText = "execute sp_calculate_values(?,?)"

    cmd.Parameters.Append cmd.CreateParameter(, adlnteger,

    adParamlnput, , 200)

    cmd.Parameters.Append cmd.CreateParameter(, adlnteger,

    adParamlnput, , 300)

    cmd.Parameters.Append cmd.CreateParameter("vl", adlnteger,

    adParamOutput)

    cmd.Parameters.Append cmd.CreateParameter("v2", adBSTR,

    adParamOutput)

    cmd.Execute

    Debug.Print "vl=" & CStr(cmd("vl"))

    Debug.Print "v2=" & CStr(cmd("v2"))

    сn.CommitTrans

    End Sub

    При явном определении параметров можно попробовать испытать мрован к'р на "прочность", задав некорректный порядок перечисления параметров. Например, сначала out-параметры, потом in-параметры.


    Содержание раздела