Никакая функция не соответствует указанному имени и типам аргументов

Моя функция:

 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;

И я называл это следующим:

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)

Ошибка:

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 **********

Ответ 1

У вашей функции есть пара smallint параметров.
Но в вызове вы используете числовые литералы, которые предположительно имеют тип integer.

Строковый литерал или строковая константа ('123') набираются не сразу. Тип остается неизвестным до тех пор, пока не будет назначен или приведен явно.

Однако числовой литерал или числовая константа вводятся немедленно. По документации:

Числовая константа, которая не содержит ни десятичной точки, ни показатель степени изначально считается типом integer, если его значение подходит для типа integer (32 бита); в противном случае предполагается, что это тип bigint, если его значение соответствует типу bigint (64 бита); в противном случае это принимается за тип numeric. Константы, содержащие десятичные точки и/или показатели всегда изначально предполагаются как тип numeric.

Дополнительные пояснения и ссылки в этом связанном ответе:

Решение

Добавьте явные приведения к параметрам smallint или заключите их в кавычки.

Демо

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

Неверный вызов:

SELECT * FROM f_typetest(1);

Правильные звонки:

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

db & lt;> скрипка здесь
Старый sqlfiddle.

Ответ 2

Эта ошибка означает, что вызов функции соответствует только существующей функции, если все ее аргументы одного типа и переданы в том же порядке. Поэтому, если следующая функция f()

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

называется

select f(1);

Он выдает ошибку с помощью

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.

потому что нет функции f(), которая принимает целое число как аргумент.

Итак, вам нужно тщательно сравнить то, что вы передаете функции, в ожидаемое. Этот длинный список столбцов таблицы выглядит плохой дизайн.

Ответ 3

В моем конкретном случае функция фактически отсутствовала. Сообщение об ошибке одно и то же. Я использую плагин Postgresql PostGIS, и мне пришлось переустановить его по любой причине.