Поделиться через


Использование хранимых процедур с выходными параметрами

Скачать драйвер JDBC

Вызываемая хранимая процедура SQL Server возвращает один или несколько параметров OUT, то есть параметров, используемых хранимой процедурой для возврата данных вызывающему приложению. Microsoft JDBC Driver для SQL Server предоставляет класс SQLServerCallableStatement, который можно использовать для вызова хранимой процедуры такого типа и обработки возвращаемых ею данных.

При вызове хранимой процедуры этого типа с помощью драйвера JDBC следует использовать escape-последовательность SQL call совместно с методом prepareCall класса SQLServerConnection. call Для escape-последовательности с параметрами OUT синтаксис выглядит следующим образом:

{call procedure-name[([parameter][,[parameter]]...)]}

Примечание.

Дополнительные сведения об использовании escape-последовательностей в SQL см. в этой статье.

При создании call escape-последовательности укажите параметры OUT с помощью символа вопроса (?). Этот символ выступает в качестве заполнителя для значений параметров, возвращаемых из хранимой процедуры. Чтобы указать значение параметра OUT, необходимо указать тип данных всех параметров с помощью метода registerOutParameter класса SQLServerCallableStatement до выполнения хранимой процедуры.

Значение, указываемое для параметра OUT в методе registerOutParameter, должно обозначать один из типов данных JDBC, перечисленных в java.sql.Types, который сопоставлен с одним из собственных типов данных SQL Server. Дополнительные сведения о типах данных JDBC и SQL Server см. в статье Основные сведения о типах данных JDBC Driver.

При передаче значения методу registerOutParameter для параметра OUT необходимо указать не только тип данных, который будет использоваться для параметра, но также порядковое размещение или имя параметра в хранимой процедуре. Например, если хранимая процедура содержит один параметр OUT, его порядковое значение равно 1. Если хранимая процедура содержит два параметра, первое порядковое значение равно 1, а второй порядковый номер равен 2.

Примечание.

Драйвер JDBC не поддерживает использование типов данных SQL Server CURSOR, SQLVARIANT, TABLE и TIMESTAMP в качестве параметров OUT.

Например, создайте следующую хранимую процедуру в примере базы данных AdventureWorks2022:

CREATE PROCEDURE GetImmediateManager  
   @employeeID INT,  
   @managerID INT OUTPUT  
AS  
BEGIN  
   SELECT @managerID = ManagerID
   FROM HumanResources.Employee
   WHERE EmployeeID = @employeeID  
END

Эта хранимая процедура возвращает один параметр OUT (managerID), являющийся целым числом, на основе указанного параметра IN (employeeID), которое также является целым числом. Значение, возвращаемое в параметре OUT, — это ManagerID на основе EmployeeID, содержащегося в HumanResources.Employee таблице.

В следующем примере открытое подключение к образцу базы данных AdventureWorks2022 передается в функцию, а метод выполнения используется для вызова хранимой процедуры GetImmediateManager:

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");) {  
        cstmt.setInt(1, 5);  
        cstmt.registerOutParameter(2, java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt(2));  
    }  
}

В примере для определения параметров используются порядковые местоположения. Или можно определить параметр при использовании имени вместо порядкового местоположения. В следующем примере кода изменяется предыдущий пример для иллюстрации использования именованных параметров в приложении Java. Имена параметров соответствуют именам параметров в определении хранимой процедуры:

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {  
        cstmt.setInt("employeeID", 5);  
        cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
    }  
}

Примечание.

В этих примерах метод класса SQLServerCallableStatement используется для запуска хранимой процедуры. Он используется, поскольку хранимая процедура не возвратила результирующий набор. Если она возвратила результирующий набор, будет использован метод executeQuery.

Хранимые процедуры могут возвращать счетчики обновлений и несколько результирующих наборов. Microsoft JDBC Driver для SQL Server соответствует спецификации JDBC 3.0, которая обязывает извлекать несколько результирующих наборов и счетчиков обновления до извлечения параметров OUT. Таким образом, приложение должно извлечь все объекты ResultSet и счетчики обновлений, прежде чем извлекать параметры OUT при использовании методов CallableStatement.getter. В противном случае объекты ResultSet и количество обновлений, которые драйвер не извлекает, теряются при извлечении параметров OUT. Дополнительные сведения о счетчиках обновлений и нескольких результирующих наборах см. в статьях Использование хранимых процедур со счетчиком обновлений и Использование нескольких результирующих наборов.

См. также

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