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 **********
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 Typinteger
(32 Bit); Andernfalls wird davon ausgegangen, dass es der Typ .__ ist.bigint
wenn der Wert in den Typbigint
(64 Bit) passt; ansonsten ist es Als Typnumeric
angenommen. Konstanten, die Dezimalpunkte und/oder .__ enthalten. Exponenten werden anfangs immer als Typnumeric
angenommen.
Weitere Erklärungen und Links in dieser verwandten Antwort:
Fügen Sie explizite Umwandlungen für die smallint
-Parameter hinzu oder geben Sie sie an.
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);
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.
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.