Utilizzo di una stored procedure con parametri di output

Una stored procedure SQL Server che è possibile chiamare è una procedura che restituisce uno o più parametri OUT, ovvero parametri utilizzati dalla stored procedure per restituire i dati all'applicazione di chiamata. Il driver JDBC Microsoft SQL Server 2005 fornisce la classe SQLServerCallableStatement che è possibile utilizzare per chiamare questo tipo di stored procedure ed elaborare i dati restituiti.

Quando si chiama questo tipo di stored procedure utilizzando il driver JDBC, è necessario utilizzare 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 ulteriori informazioni sulle sequenze di escape SQL, vedere Utilizzo delle sequenze di escape SQL.

Quando si costruisce la sequenza escape call, specificare i parametri OUT utilizzando 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 ciascun parametro utilizzando 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 contenuti in java.sql.Types, che a sua volta corrisponde a uno dei tipi nativi di dati SQL Server. Per ulteriori 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 utilizzare 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 SQL Server CURSOR, SQLVARIANT, TABLE e TIMESTAMP come parametri OUT.

Come esempio, viene creata la seguente stored procedure nel database di esempio AdventureWorks di SQL Server 2005:

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 AdventureWorks e il metodo execute viene utilizzato per la chiamata alla stored procedure GetImmediateManager:

public static void executeStoredProcedure(Connection con) {
   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));
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}

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) {
   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"));
      cstmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }

}

Nota

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

Le stored procedure possono restituire conteggi aggiornamenti e set di risultati multipli. Il driver JDBC per Microsoft Server 2005 segue la specifica JDBC 3.0, in cui viene stabilito che prima di recuperare i parametri OUT devono essere recuperati i conteggi aggiornamenti e i set di risultati multipli. Questo significa che l'applicazione deve recuperare tutti i conteggi aggiornamenti e gli oggetti ResultSet prima di recuperare i parametri OUT utilizzando i metodi CallableStatement.getter. In caso contrario, i conteggi aggiornamenti e gli oggetti ResultSet che non sono già stati recuperati verranno persi quando vengono recuperati i parametri OUT. Per ulteriori informazioni sui conteggi aggiornamenti e i set di risultati multipli, vedere Utilizzo di una stored procedure con i conteggi di aggiornamento e Utilizzo di più set di risultati.

Vedere anche

Altre risorse

Utilizzo delle istruzioni con le stored procedure