Üritan käivitada PostgreSQLis kasutaja-defineeritud funktsiooni, kuid saan vastuse, et sellist funktsiooni pole loodud. Mis võib olla põhjus?

Postitas Erki Eessaar 17.12.2023 11:18 (muudeti 17.12.2023 11:25)
Funktsiooni identifikaator e signatuur moodustub selle identifikaatorist ja sisendparameetritest. PostgreSQLis võib ühes ja samas skeemis olla mitu samanimelist funktsiooni, millel on erinev arv parameetreid või erinevat tüüpi parameetrid. Seega samast funktsioonist saab olla justkui mitu realisatsiooni ning konkreetne kasutatav realisatsioon valitakse vastavalt antud sisenditele (argumentidele). See on ülelaadimise omadus.

Oletame, et andmebaasis on loodud funktsioon f_lopeta_teenus, mille esimene parameeter on p_teenus_kood, mille tüüp on SMALLINT ja teine parameeter on p_selgitus, mis on tüüpi TEXT.

1. Süsteem eeldab argumendi (sisendväärtuse) alusel vale parameetri andmetüüpi.

Vale: SELECT f_lopeta_teenus(p_teenus_kood:=30, p_selgitus:='Osutus ebapopulaarseks');
Süsteem eeldab, et parameeter p_teenus_kood on tüüpi INTEGER.

Õige: SELECT f_lopeta_teenus(p_teenus_kood:=30::SMALLINT, p_selgitus:='Osutus ebapopulaarseks');
::SMALLINT - tüübiteisendus tüüpi SMALLINT.

2. Parameetri nimi on väljakutses valesti kirjutatud.

Vale: SELECT f_lopeta_teenus(p_teenuse_kood:=30::SMALLINT, p_teenus_selgitus:='Osutus ebapopulaarseks');
Õige: SELECT f_lopeta_teenus(p_teenus_kood:=30::SMALLINT, p_selgitus:='Osutus ebapopulaarseks');

3. Osadele parameetritele ei anta väljakutses väärtust (argumenti) (parameetritele saab funktsiooni loomisel anda vaikimisi väärtuse ja siis ei pea nendele väljakutses väärtust andma).

Vale: SELECT f_lopeta_teenus(p_teenus_kood:=30::SMALLINT);
Õige: SELECT f_lopeta_teenus(p_teenus_kood:=30::SMALLINT, p_selgitus:='Osutus ebapopulaarseks');

4. Funktsiooni parameetritele viitamiseks ei kasutata nime ning argumentide järjekord on väljakutses vale.

Vale
: SELECT f_lopeta_teenus('Osutus ebapopulaarseks', 30::SMALLINT);
Õige: SELECT f_lopeta_teenus(30::SMALLINT, 'Osutus ebapopulaarseks');

5. Funktsiooni otsitaks valest skeemist. Vaikimisi skeem on public. Oletame, et funktsioon on hoopis skeemis funktsioonid.

Vale: SELECT f_lopeta_teenus(p_teenus_kood:=30, p_selgitus:='Osutus ebapopulaarseks');
Õige: SELECT funktsioonid.f_lopeta_teenus(p_teenus_kood:=30::SMALLINT, p_selgitus:='Osutus ebapopulaarseks');

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!