Tady si dovolím oponovat - funkce má vrátit hodnotu nebo vyhodit vyjímku - vracet 1 nebo 0 nemá v jazyku, který podporuje obsluhu vyjímek smysl, a je to zrovna hezká ukázka toho, co by se dělat nemělo. V Postgresu se neobsloužená výjimka zapíše do logu - můžete mít log v CSV formátu a pak skrz FDW file se k tomu logu dostat z SQL. Technika, kterou ukazujete vede k dost nečitelnému a zbytečně nafouklému kódu,
BEGIN, END -- není to Pascal (ale ADA) potažmo ALGOL
PGAdmin má dost mizerný editor - mnohem praktičtější je psát skripty v klasickém programátorském editoru, a pak je skrz psql naiportovat do databáze. Navíc PGAdmin svádí k direktivním změnám objektů (třeba funkcí), a pak člověk nemá ani ten soubor.
Konflikty názvů proměnných z PLpgSQL a SQL jsou už pár let ošetřeny (pokud si uživatel nevypne kontrolu, tak se při konfliktu vyhodí vyjímka). Tradičnější je používání "_" pro proměnné plpgsql a aliasy pro SQL identifikátory.
Bez debuggeru se lze obejít docela dobře - díky ladícímu výstupu - příkaz RAISE NOTICE
Napsal jste skalární funkci - tj nevrací tabulku (ani kompozit) - měl byste ji volat ve skalárním kontextu
SELECT fx() nikoliv SELECT * FROM fx()
Pavle naprostý souhlas, lepší je nechat vybublat výjimku od spoda nahoru než do nekonečna psát
if fce1() = 1 then
if fce2() = 1 then
else ...
else ...
autor pochází ze starší generace a v "90. letech minulého století" se bohužel takto tvořilo. Dnes upravovat, opravovat takovou práci je peklo.
jak se setřilo místem je to samé
cursor a is ...
cursor b is ...
cursor c is ...
člověk pak musí být nadán genialitou nebo mít dobrého cvokaře.
To nemluvím o borcích co jsou shopni napsat:
when others then null;
Zde příklad konfliktu proměnných. Úplně na konci je příklad konfliktů názvů, který projde.
create table test2
(id integer primary key,
slovo text);
insert into test2 values (100,'test');
create function test2_update(slovo text)
returns void
as
$body$
begin
update test2
set slovo=slovo;
end;
$body$
LANGUAGE plpgsql;
select test2_update('jde se na to');
Výsledek:
ERROR: nejednoznačný odkaz na sloupec "slovo"
LINE 2: set slovo=slovo
^
DETAIL: Identifikátor může odkazovat na proměnnou PL/pgSQL nebo na sloupec v tabulce.
QUERY: update test2
set slovo=slovo
CONTEXT: PL/pgSQL funkce test2_update(text) řádek 3 na SQL příkaz
********** Chyba **********
ERROR: nejednoznačný odkaz na sloupec "slovo"
Stav SQL: 42702
Podrobnosti:Identifikátor může odkazovat na proměnnou PL/pgSQL nebo na sloupec v tabulce.
Kontext:PL/pgSQL funkce test2_update(text) řádek 3 na SQL příkaz
ALE !!!
create function test2_update2(slovo1 text)
returns void
as
$body$
declare
slovo1 text default 'ahoj';
begin
update test2
set slovo=slovo1;
end;
$body$
LANGUAGE plpgsql;
select test2_update2('jde se na to'); -- PROJDE
vysledek :
select * from test2;
100;"ahoj" -- Coz je zmatecne
SQL Developer
Přečteno 32 085×
Přečteno 19 598×
Přečteno 19 542×
Přečteno 17 386×
Přečteno 16 279×