web-dev-qa-db-fra.com

Aucune fonction ne correspond aux types de nom et d'argument donnés

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 **********
13
Vivek S.

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 type integer (32 bits); sinon, il est présumé être du type bigint si sa valeur correspond au type bigint (64 bits); sinon c'est pris pour être de type numeric. Constantes contenant des points décimaux et/ou les exposants sont toujours supposés initialement être du type numeric.

Plus d'explications et de liens dans cette réponse:

Solution

Ajoutez des distributions explicites pour les paramètres smallint ou citez-les.

Démo

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);

Fiddle SQL.

19
Erwin Brandstetter

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.

1
Clodoaldo Neto

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.

0
n1000