Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Renvoyer un jeu de résultats à partir d'une procédure stockée
Cette rubrique décrit comment les procédures stockées renvoient des données.
Vous pouvez retourner un ensemble de résultats à l’aide d’un curseur ou d’une table temporaire.
Retour d’un curseur
Pour renvoyer un curseur, créez une procédure avec un INOUT argument défini par un type de refcursor
données. Lorsque vous appelez la procédure, donnez un nom au curseur. Vous pouvez ensuite extraire les résultats du curseur par leur nom.
L'exemple suivant crée une procédure nommée get_result_set
avec un INOUT argument nommé à rs_out
l'aide du type de refcursor
données. La procédure ouvre le curseur à l'aide d'une SELECT instruction.
CREATE OR REPLACE PROCEDURE get_result_set (param IN integer, rs_out INOUT refcursor) AS $$ BEGIN OPEN rs_out FOR SELECT * FROM fact_tbl where id >= param; END; $$ LANGUAGE plpgsql;
La CALL commande suivante ouvre le curseur portant le nommycursor
. N’utlisez les curseurs qu’au sein des transactions.
BEGIN; CALL get_result_set(1, 'mycursor');
Une fois que le curseur est ouvert, vous pouvez procéder à l’extraction depuis ce curseur, comme l’illustre l’exemple suivant.
FETCH ALL FROM mycursor; id | secondary_id | name -------+--------------+--------- 1 | 1 | Joe 1 | 2 | Ed 2 | 1 | Mary 1 | 3 | Mike (4 rows)
À la fin, la transaction est validée ou annulée.
COMMIT;
Un curseur renvoyé par une procédure stockée est soumis aux mêmes contraintes et considérations de performances que celles décrites dans DECLARECURSOR. Pour de plus amples informations, veuillez consulter Contraintes de curseur.
L'exemple suivant montre l'appel de la procédure get_result_set
stockée à l'aide d'un type de refcursor
données provenant deJDBC. Le littéral 'mycursor'
(nom du curseur) est transmis à prepareStatement
. Puis, les résultats sont extraits de ResultSet
.
static void refcursor_example(Connection conn) throws SQLException { conn.setAutoCommit(false); PreparedStatement proc = conn.prepareStatement("CALL get_result_set(1, 'mycursor')"); proc.execute(); ResultSet rs = statement.executeQuery("fetch all from mycursor"); while (rs.next()) { int n = rs.getInt(1); System.out.println("n " + n); }
Utilisation d’une table temporaire
Pour retourner les résultats, vous pouvez retourner un descripteur vers une table temporaire contenant les lignes de résultats. Le client peut fournir un nom comma paramètre à la procédure stockée. Dans la procédure stockée, la dynamique SQL peut être utilisée pour agir sur la table des températures. Vous en trouverez un exemple ci-dessous.
CREATE PROCEDURE get_result_set(param IN integer, tmp_name INOUT varchar(256)) as $$ DECLARE row record; BEGIN EXECUTE 'drop table if exists ' || tmp_name; EXECUTE 'create temp table ' || tmp_name || ' as select * from fact_tbl where id <= ' || param; END; $$ LANGUAGE plpgsql; CALL get_result_set(2, 'myresult'); tmp_name ----------- myresult (1 row) SELECT * from myresult; id | secondary_id | name ----+--------------+------ 1 | 1 | Joe 2 | 1 | Mary 1 | 2 | Ed 1 | 3 | Mike (4 rows)