webentwicklung-frage-antwort-db.com.de

Keine Funktion stimmt mit den angegebenen Namen und Argumenttypen überein

Meine Funktion ist:

 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;

Und ich habe das immer so genannt:

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)

Der Fehler ist:

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.

Ihre Funktion verfügt über einige smallint -Parameter.
Im Anruf verwenden Sie jedoch numerische Literale, von denen angenommen wird, dass sie vom Typ integer sind.

Ein String-Literal oder eine string-Konstante ('123') wird nicht sofort eingegeben. Der Typ bleibt "unbekannt", bis er explizit zugewiesen oder umgewandelt wird.

Ein numerisches Literal oder eine numerische Konstante wird jedoch sofort eingegeben. Pro Dokumentation:

Eine numerische Konstante, die weder einen Dezimalpunkt noch ein .__ enthält. Exponent ist anfangs als Typ integer angenommen, wenn sein Wert passt in den Typ integer (32 Bit); Andernfalls wird davon ausgegangen, dass es der Typ .__ ist. bigint wenn der Wert in den Typ bigint (64 Bit) passt; ansonsten ist es Als Typ numeric angenommen. Konstanten, die Dezimalpunkte und/oder .__ enthalten. Exponenten werden anfangs immer als Typ numeric angenommen.

Weitere Erklärungen und Links in dieser verwandten Antwort:

Lösung

Fügen Sie explizite Umwandlungen für die smallint-Parameter hinzu oder geben Sie sie an.

Demo

CREATE OR REPLACE FUNCTION f_typetest(smallint)
  RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;

Falscher Anruf:

SELECT * FROM f_typetest(1);

Richtige Anrufe:

SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);

SQL Geige.

19

Dieser Fehler bedeutet, dass ein Funktionsaufruf nur von einer vorhandenen Funktion abgeglichen wird, wenn alle Argumente vom gleichen Typ sind und in derselben Reihenfolge übergeben werden. Also wenn die nächste f() Funktion

create function f() returns integer as $$ 
    select 1;
$$ language sql;

heißt als

select f(1);

Es wird ein Fehler mit ausgegeben

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.

weil es keine f()-Funktion gibt, die eine ganze Zahl als Argument akzeptiert.

Sie müssen also sorgfältig vergleichen, was Sie an die Funktion übergeben, mit dem, was sie erwartet. Diese lange Liste von Tabellenspalten sieht nach schlechtem Design aus.

1
Clodoaldo Neto

In meinem speziellen Fall fehlte die Funktion tatsächlich. Die Fehlermeldung ist gleich. Ich verwende das Postgresql-Plugin PostGIS und musste es aus irgendeinem Grund neu installieren.

0
n1000