Ma fonction est:
CREATE OR REPLACE FUNCTION FnUpdateSalegtab09
(
iacyrid Integer,iRepId Integer,iDrId Integer,ivrid Integer,imode smallint,itrno
varchar,itrdate timestamp,iacid Integer,ivrno varchar,iSuppId Integer,icustname
varchar,inetamt money,idisrate real,idisamt money,iRoundOff real,ijrmid integer,iuserid
integer,iuserdtm timestamp,iVSNo integer,iRecdAmt money,icstrate real,icstsaleamt
money,icstamt money,itdrate real,itdamt money,icdrate real,icdamt money,iCessRate
real,iCessAmt money,iodesc1 varchar,ioamt1 money,iCashCredit boolean,iOrderNo
varchar,iOrderDate timestamp,iCustAdd2 varchar,iRemarks varchar,iWhoRetSl boolean,iPatName
varchar,iDrName varchar,iFormId integer,iSalesMan varchar,iCFMode smallint,iPatId
integer,iStkPtId integer,iDisType smallint,iBranchID integer
)
RETURNS void AS
'BEGIN
INSERT INTO gtab09
(
acyrid, RepId, DrId, vrid, mode, trno, trdate, acid, vrno, SuppId, custname, netamt,
disrate, disamt, RoundOff, jrmid, userid, userdtm, VSNo, RecdAmt, cstrate, cstsaleamt,
cstamt, tdrate, tdamt, cdrate, cdamt, CessRate, CessAmt, odesc1, oamt1, CashCredit,
OrderNo, OrderDate, CustAdd2, Remarks, WhoRetSl, PatName, DrName, FormId, SalesMan,
CFMode,PatId,StkPtId,DisType,BranchID
)
values
( iacyrid,iRepId,iDrId,ivrid,imode,itrno,itrdate,iacid,ivrno,iSuppId,icustname,inetamt,idisra
te,idisamt,iRoundOff,ijrmid,iuserid,iuserdtm,iVSNo,iRecdAmt,icstrate,icstsaleamt,icstamt,it
drate,itdamt,icdrate,icdamt,iCessRate,iCessAmt,iodesc1,ioamt1,iCashCredit,iOrderNo,iOrderDa
te,iCustAdd2,iRemarks,iWhoRetSl,iPatName,iDrName,iFormId,iSalesMan,iCFMode,iPatId,iStkPtId,
iDisType,iBranchID);
END;'
LANGUAGE plpgsql VOLATILE
COST 100;
Et j’appelais cela comme:
select FnUpdateSalegtab09 (4, 1, 0, 12, 1, '9'::varchar,'2014-07-15'::timestamp, 4048, '9'::varchar, 4048, 'MYCUSTOMER'::varchar, 12::money, 0, 0::money, 0.32, 185, 0, '2014-07-15 11:24:12 AM'::timestamp, 0, 0::money, 0, 0::money, 0::money, 0, 0::money, 0, 0::money, 0, 0::money, ''::varchar, 0::money, False, ''::varchar, '2014-07-15'::timestamp, ''::varchar, ''::varchar, False, ''::varchar, ''::varchar, 1, ''::varchar, 1,0,1,0,42)
L'erreur est:
ERROR: function fnupdatesalegtab09(integer, integer, integer, integer, integer, unknown, unknown, integer, unknown, integer, unknown, integer, integer, integer, numeric, integer, integer, unknown, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, unknown, integer, boolean, unknown, unknown, unknown, unknown, boolean, unknown, unknown, integer, unknown, integer, integer, integer, integer, integer) does not exist LINE 1: select FnUpdateSalegtab09 (4, 1, 0, 12, 1, '9','2014-07-15',... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** Error **********
Votre fonction a quelques paramètres smallint
.
Mais dans l'appel, vous utilisez des littéraux numériques supposés être de type integer
.
Un littéral de chaîne ou constante de chaîne } _ ('123'
) n'est pas saisi immédiatement. Il reste du type "inconnu" jusqu'à ce qu'il soit affecté ou explicitement converti.
Toutefois, un littéral numérique ou CONSTANTE NUMÉRIQUE est saisi immédiatement. Par documentation:
Une constante numérique qui ne contient ni point décimal ni un l'exposant est initialement supposé être de type
integer
si sa valeur correspond au typeinteger
(32 bits); sinon, il est présumé être du typebigint
si sa valeur correspond au typebigint
(64 bits); sinon c'est pris pour être de typenumeric
. Constantes contenant des points décimaux et/ou les exposants sont toujours supposés initialement être du typenumeric
.
Plus d'explications et de liens dans cette réponse:
Ajoutez des distributions explicites pour les paramètres smallint
ou citez-les.
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Appel incorrect:
SELECT * FROM f_typetest(1);
Appels corrects:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
Cette erreur signifie qu'un appel de fonction ne correspond à une fonction existante que si tous ses arguments sont du même type et sont transmis dans le même ordre. Donc, si la fonction f()
suivante
create function f() returns integer as $$
select 1;
$$ language sql;
est appelé comme
select f(1);
Il y aura erreur avec
ERROR: function f(integer) does not exist
LINE 1: select f(1);
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
car il n’existe pas de fonction f()
prenant un entier comme argument.
Vous devez donc comparer soigneusement ce que vous transmettez à la fonction et ce qu’elle attend. Cette longue liste de colonnes de tableau ressemble à une mauvaise conception.
Dans mon cas particulier, la fonction manquait réellement. Le message d'erreur est le même. J'utilise le plugin Postgresql PostGIS et je devais le réinstaller pour une raison quelconque.