[PostgreSQL] Alter sequence problem

0

Witam serdecznie napisałem sobie taką procedurę:

CREATE OR REPLACE FUNCTION "dev"."addkam_sciezka" (
  in "asciezka" VARCHAR,   in "aidx_autora" INTEGER
)
RETURNS BOOLEAN AS
$body$
DECLARE
  l_result BOOLEAN = FALSE;
  ilosc INTEGER = 8;
  max_val INTEGER = 8;
BEGIN
	max_val = (SELECT last_value FROM "dev"."kamery_sciezka_idx_sciezki_seq");
    ilosc = (SELECT max(idx_sciezki) FROM "dev".kamery_sciezka);
    IF max_val < ilosc THEN 
    	ALTER SEQUENCE "dev"."kamery_sciezka_idx_sciezki_seq"
  		INCREMENT 1 MINVALUE 1
  		MAXVALUE 9223372036854775807 START 1
  		RESTART max_val CACHE 1
  		NO CYCLE;
        SELECT addkam_sciezka(asciezka, aidx_autora);
    ELSE
        IF NOT EXISTS (SELECT 1 FROM dev.kamery_sciezka WHERE (sciezka = asciezka)) THEN
        	INSERT INTO dev.kamery_sciezka 
            (
            	sciezka,
                idx_autora,
                data_zmiany
            )
            VALUES
            (
            	asciezka,
                aidx_autora,
                now()
            );
        	l_result = TRUE;
        END IF;
    END IF;
    
	RETURN l_result;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER;

Potrzebuję sprawdzić jaki jest maksymalny rekord w tabeli i jaka jest ostatnia wartość sekwencji tej tabeli jesli oczywiscie sekwencja jest mniejsza od maksymalnego rekordu po przy dodawaniu nowego rekordu wystepuje duplicate key value error. Do tego wlasnie sluzy ta procedura jednak jest problem gdyz nie moge do alter sequence w miejscu restart przekazac zmiennej tylko liczbe na sztyfno a nie o to mi chodzi. Moze ktos pomoc?

0

Dobra zrobilem w ten sposob:

CREATE OR REPLACE FUNCTION "dev"."addkam_sciezka" (
  "asciezka" varchar,
  "aidx_autora" integer
)
RETURNS boolean AS
$body$
DECLARE
  l_result BOOLEAN = FALSE;
  ilosc INTEGER = 8;
  max_val INTEGER = 8;
BEGIN
	max_val = (SELECT last_value FROM "dev"."kamery_sciezka_idx_sciezki_seq");
    ilosc = (SELECT max(idx_sciezki) FROM "dev".kamery_sciezka);
    IF max_val < ilosc THEN
    	ilosc = ilosc + 1; 
    	EXECUTE
        	'ALTER SEQUENCE "dev"."kamery_sciezka_idx_sciezki_seq"' 
            || 'INCREMENT 1 MINVALUE 1 ' 
            || 'MAXVALUE 9223372036854775807 ' 
            || 'START 1 '
            || 'RESTART ' || ilosc || ' CACHE 1 NO CYCLE; ';
        IF NOT EXISTS (SELECT 1 FROM dev.kamery_sciezka WHERE (sciezka = asciezka)) THEN
        	INSERT INTO dev.kamery_sciezka 
            (
            	sciezka,
                idx_autora,
                data_zmiany
            )
            VALUES
            (
            	asciezka,
                aidx_autora,
                now()
            );
        	l_result = TRUE;
        END IF;
    END IF;
    
	RETURN l_result;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100;

1 użytkowników online, w tym zalogowanych: 0, gości: 1