Uso di una stored procedure con parametri di output

Scaricare il driver JDBC

Una stored procedure di SQL Server che è possibile chiamare è quella che restituisce uno o più parametri OUT, ovvero parametri usati dalla stored procedure per restituire i dati all'applicazione chiamante. Microsoft JDBC Driver per SQL Server fornisce la classe SQLServerCallableStatement che è possibile usare per chiamare questo tipo di stored procedure ed elaborare i dati restituiti.

Quando si chiama questo tipo di stored procedure usando il driver JDBC, è necessario usare la sequenza di escape SQL call insieme al metodo prepareCall della classe SQLServerConnection. La sintassi della sequenza di escape call con parametri OUT è la seguente:

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

Nota

Per altre informazioni sulle sequenze di escape SQL, vedere Uso delle sequenze di escape SQL.

Quando si costruisce la sequenza di escape call, specificare i parametri OUT usando il carattere ? (punto interrogativo), che funge da segnaposto per i valori di parametro che verranno restituiti dalla stored procedure. Per specificare il valore di un parametro OUT, è necessario specificare il tipo di dati di ogni parametro usando il metodo registerOutParameter della classe SQLServerCallableStatement prima di eseguire la stored procedure.

Il valore specificato per il parametro OUT nel metodo registerOutParameter deve essere uno dei tipi di dati JDBC presenti in java.sql.Types, che a sua volta corrisponde a uno dei tipi di dati di SQL Server nativi. Per altre informazioni sui tipi di dati JDBC e SQL Server, vedere Informazioni sui tipi di dati del driver JDBC.

Quando si passa un valore al metodo registerOutParameter per un parametro OUT, è necessario specificare non solo il tipo di dati da usare per il parametro, ma anche la posizione ordinale o il nome del parametro nella stored procedure. Ad esempio, se la stored procedure contiene un unico parametro OUT, il valore ordinale sarà 1. Se la stored procedure contiene due parametri, il primo valore ordinale sarà 1 e il secondo sarà 2.

Nota

Il driver JDBC non supporta l'uso dei tipi di dati CURSOR, SQLVARIANT, TABLE e TIMESTAMP di SQL Server come parametri OUT.

Ad esempio, creare la seguente stored procedure nel database di esempio AdventureWorks2022:

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

Questa stored procedure restituisce un unico parametro OUT (managerID), che è rappresentato da un numero intero, in base al parametro IN specificato (employeeID), anch'esso rappresentato da un numero intero. Il valore restituito nel parametro OUT è ManagerID, a sua volta basato sul valore EmployeeID contenuto nella tabella HumanResources.Employee.

Nell'esempio seguente viene passata alla funzione una connessione aperta al database di esempio AdventureWorks2022 e viene usato il metodo execute per chiamare la stored procedure 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));  
    }  
}

In questo esempio vengono utilizzate le posizioni ordinali per identificare i parametri. In alternativa, è possibile identificare un parametro utilizzando il relativo nome anziché la posizione ordinale. Nell'esempio di codice seguente viene modificato l'esempio precedente per illustrare l'utilizzo di parametri denominati in un'applicazione Java. Si noti che i nomi dei parametri corrispondono ai nomi dei parametri nella definizione della stored procedure:

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"));  
    }  
}

Per i driver versione 12.6 e successive è stata introdotta una nuova proprietà di connessione useFlexibleCallableStatements. Se impostata su true, questa proprietà mantiene il comportamento precedente del driver, consentendo agli utenti di usare una combinazione di posizioni ordinali e nomi di parametri durante l'identificazione dei parametri. Se impostata su false, l'utente deve una delle opzioni, ma non può usarle entrambe.

Inoltre, useFlexibleCallableStatements mantiene il comportamento esistente riguardo all'ordine flessibile in cui possono essere impostati i parametri delle istruzioni, quando la proprietà è impostata su true. Se impostata su false, tuttavia, l'ordine deve corrispondere alla definizione della stored procedure. Entrambe queste funzionalità per useFlexibleCallableStatements=true possono essere visualizzate nell'esempio seguente:

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

Nota

In questi esempi viene usato il metodo execute della classe SQLServerCallableStatement per eseguire la stored procedure. in quanto la stored procedure non ha restituito alcun set di risultati. In caso contrario, si userebbe il metodo executeQuery.

Le stored procedure possono restituire conteggi aggiornamenti e più set di risultati. Microsoft JDBC Driver per SQL Server è conforme alla specifica JDBC 3.0 che stabilisce che prima di recuperare i parametri OUT devono essere recuperati più set di risultati e conteggi aggiornamenti. Questo significa che l'applicazione deve recuperare tutti i conteggi di aggiornamento e gli oggetti ResultSet prima di recuperare i parametri OUT usando i metodi CallableStatement.getter. In caso contrario, gli oggetti ResultSet e i conteggi di aggiornamento non ancora recuperati andranno persi quando vengono recuperati i parametri OUT. Per altre informazioni sui conteggi di aggiornamento e l'uso di più set di risultati, vedere Uso di una stored procedure con i conteggi di aggiornamento e Uso di più set di risultati.

Vedi anche

Uso delle istruzioni con le stored procedure