Utilisation du type de données cursor dans un paramètre OUTPUT

Les procédures stockées Transact-SQL ne peuvent utiliser le type de données cursor que pour les paramètres OUTPUT. Si le type de données cursor est spécifié pour un paramètre, les paramètres VARYING et OUTPUT deviennent obligatoires. Si le mot clé VARYING est spécifié pour un paramètre, le type de données doit être cursor et le mot clé OUTPUT est obligatoire.

[!REMARQUE]

Le type de données cursor ne peut pas être lié à des variables d'application par l'intermédiaire des API de base de données, telles que OLE DB, ODBC, ADO et DB-Library. Les paramètres OUTPUT devant être liés avant qu'une application puisse exécuter une procédure stockée, les procédures stockées qui contiennent des paramètres OUTPUT de type cursor ne peuvent pas être appelées à partir des API de base de données. Ces procédures peuvent être appelées à partir de traitements, procédures stockées ou déclencheurs Transact-SQL seulement lorsque la variable OUTPUT de type cursor est affectée à une variable Transact-SQL locale de type cursor.

Paramètres de sortie de type cursor

Les règles suivantes régissent les paramètres de sortie de type cursor lors de l'exécution de la procédure :

  • Dans le cas d'un curseur en avant uniquement, les lignes renvoyées dans le jeu de résultats du curseur sont seulement celles situées à la position du curseur ou au-delà de celui-ci, à la fin de l'exécution de la procédure stockée, par exemple :

    • Un curseur ne permettant pas le défilement est ouvert dans une procédure, dans un jeu de résultats de 100 lignes, appelé RS.

    • La procédure extrait les 5 premières lignes du jeu de résultats RS.

    • La procédure est renvoyée vers son appelant.

    • Le jeu de résultats RS renvoyé à l'appelant est constitué des lignes 6 à 100 de RS et le curseur dans l'appelant est placé avant la première ligne de RS.

  • Dans le cas d'un curseur en avant uniquement, si le curseur se trouve avant la première ligne après l'achèvement de la procédure stockée, la totalité du jeu de résultats est renvoyée au traitement d'instructions, à la procédure stockée ou au déclencheur appelant. Lorsqu'elle est renvoyée, la position du curseur est fixée au début de la première ligne.

  • Dans le cas d'un curseur en avant uniquement, si le curseur est placé au-delà de la fin de la dernière ligne après l'achèvement de la procédure stockée, le système renvoie un jeu de résultats vide au traitement d'instructions, à la procédure stockée ou au déclencheur appelant.

    [!REMARQUE]

    Un jeu de résultats vide est différent d'une valeur NULL.

  • Dans le cas d'un curseur permettant le défilement, toutes les lignes du jeu de résultats sont renvoyées au traitement d'instructions, à la procédure stockée ou au déclencheur appelant à la fin de l'exécution de la procédure stockée. Lors du renvoi, la position du curseur est conservée à la position de la dernière extraction exécutée dans la procédure.

  • Pour tous les types de curseur, si le curseur est fermé, une valeur NULL est repassée au traitement d'instructions, à la procédure stockée ou au déclencheur appelant. Cette situation se produit également si un curseur est affecté à un paramètre mais qu'il n'a jamais été ouvert.

    [!REMARQUE]

    L'état fermé n'a d'importance qu'au moment du retour. Par exemple, vous pouvez fermer un curseur au cours de l'exécution de la procédure, le rouvrir plus tard dans la procédure et renvoyer le jeu de résultats de ce curseur au traitement d'instructions, à la procédure stockée ou au déclencheur appelant.

Exemple

L'exemple ci-dessous crée une procédure stockée avec un paramètre de sortie @currency\_cursor utilisant le type de données cursor. La procédure stockée est ensuite appelée dans un traitement.

Commencez par créer la procédure qui déclare puis ouvre un curseur dans la table Currency.

USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor 
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO

Ensuite, exécutez un traitement d'instructions qui déclare une variable curseur locale, exécute la procédure pour affecter le curseur à la variable locale et extrait les lignes du curseur.

USE AdventureWorks;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
     FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO