Никакая функция не соответствует указанному имени и типам аргументов
Моя функция:
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, и мне пришлось переустановить его по любой причине.