Kuidas kutsuda PostgreSQLis välja funktsiooni või protseduuri, mille mõni parameeter on SMALLINT tüüpi?

Postitas Erki Eessaar, 01.06.2022 00:00 (muudeti 03.12.2024 20:01)
Oletame, et andmebaasis on loodud funktsioon f_lopeta_teenus, mille parameeter p_teenuse_kood on SMALLINT tüüpi.

Üritades seda funktsiooni välja kutsuda lausega: SELECT f_lopeta_teenus(p_teenuse_kood:=436);

on tulemuseks veateade: ERROR: function f_lopeta_teenus(p_teenuse_kood => integer) does not exist LINE 1: select f_lopeta_teenus(p_teenuse_kood:=436);

Käivitatav funktsioon valitakse argumentide tüüpide alusel. Vaikimisi eeldus on, et literaali 436 poolt esitatav väärtus kuulub tüüpi INTEGER. Kuid funktsiooni parameeter on hoopis tüüpi SMALLINT.  Seega käivitades

SELECT f_lopeta_teenus(p_teenuse_kood:=436);

, otsib tarkvara funktsiooni, mille signatuur (tunnus) on f_lopeta_teenus (INTEGER).  Kuid andmebaasis pole sellise tunnusega funktsiooni, vaid on hoopis funktsioon tunnusega f_lopeta_teenus (SMALLINT). Sellest tuleneb veateade, et funktsiooni ei leitud.

Seega korrektseks väljakutseks on vajalik lause:

SELECT f_lopeta_teenus(p_teenuse_kood:=436::SMALLINT);

::SMALLINT teeb tüübiteisenduse tüüpi SMALLINT.

Alternatiivina võib kasutada tüübiteisenduseks CAST funktsiooni:

SELECT f_lopeta_teenus(p_teenuse_kood:=CAST(436 AS SMALLINT);


Kas postitus oli kasulik? Hinda seda!

Keskmine hinne: Pole veel hinnanguid!


← Eelmine postitus Käivitan PostgreSQLis funktsiooni, kuid seda ei täideta, sest ei leita funktsioonis viidatud tabelit. Mis on viga ja kuidas seda lahendada? <p>Näide: Lõin andmebaasis funktsiooni <i>f_on_juhataja</i> <p>SELECT f_on_juhataja(p_kasutajanimi:='joy.hawkins@geekosis.name', p_parool:='Boss'); <p>ERROR: relation "isik" does not exist <p>LINE 2: FROM isik INNER JOIN tootaja ON isik.isik_id = tootaja.isik_... Järgmine postitus → Kas oleks otstarbekas siduda domeeniga mingi veeru omadus ja lisada sellele täiendav tabelipõhine piirang? Näiteks andmetüüp, NOT NULL ja tühikutest koosnemise piirang tulev domeeni poolt ja tabelis lisan täiendava piirangu pikkusele.