Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
Voilà je cherche a basculer la procédure stocké SQL Server ci-dessous vers PostgreSQL :
CREATE PROCEDURE [dbo].[PS_COMPTEUR]
@TABLE_NAME NVARCHAR(128),
@NEW_ID INT OUTPUT
AS
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DECLARE @error INT = 0;
DECLARE @trsName CHAR(6) = 'Indice';
BEGIN TRANSACTION @trsName;
IF NOT EXISTS(SELECT Code FROM Indice WHERE Reference = @TABLE_NAME)
BEGIN
INSERT INTO Indice( Reference )
SELECT @TABLE_NAME WHERE NOT EXISTS(SELECT Code FROM Indice WHERE Reference = @TABLE_NAME);
SET @error = @error + @@error;
END;
UPDATE Indice SET Compteur = Compteur + 1, @NEW_ID = Compteur + 1
FROM Indice AS TC WHERE Reference = @TABLE_NAME;
SET @error = @error + @@error;
IF @error = 0
COMMIT TRANSACTION @trsName;
ELSE
ROLLBACK TRANSACTION @trsName;
Après plusieurs recherche et avoir lu une partie de la documentation de PostgreSQL, je suis arrivé à faire cela :
CREATE OR REPLACE FUNCTION public.ps_indice(
tablename character varying)
RETURNS integer
LANGUAGE 'plpgsql'
COST 10
VOLATILE
AS $BODY$
DECLARE
result INTEGER;
BEGIN
BEGIN
IF NOT EXISTS(SELECT code FROM indice WHERE reference = tableName) THEN
INSERT INTO Indice( reference )
SELECT tableName WHERE NOT EXISTS(SELECT code FROM indice WHERE reference = tableName);
END IF;
result = ( SELECT nextval( seqName ) );
UPDATE indice SET compteur = result WHERE reference = tableName;
EXCEPTION
WHEN OTHERS THEN result = 100;
END;
RETURN result;
END;
$BODY$;
Mon problème est que la transaction n'est pas de type ISOLATION LEVEL SERIALIZABLE et quelle n'est pas nommé du coup j'ai des doublons de code.
Merci d'avance pour votre aide à tous.
Bien cordialement
Hors ligne
Bonjour à tous,
Alors j'ai fini par trouvé une solutions, que voici, par contre en terme de performance, j'ai un rapport de 1 a 4 entre SQL Server et PostGreSql, mon postgreSql est 4 fois plus lent !
CREATE OR REPLACE FUNCTION public.ps_compteur(
tablename character varying)
RETURNS integer
LANGUAGE 'sql'
COST 100
VOLATILE PARALLEL RESTRICTED
AS $BODY$
INSERT INTO Indice( reference )
SELECT tableName WHERE NOT EXISTS( SELECT code FROM indice WHERE reference = tableName );
UPDATE indice SET compteur = compteur + 1
WHERE reference = tableName
RETURNING compteur;
$BODY$;
Dernière modification par jvm (02/03/2018 12:07:32)
Hors ligne
Pages : 1