没有函数匹配给定的名称和参数类型

Posted

技术标签:

【中文标题】没有函数匹配给定的名称和参数类型【英文标题】:No function matches the given name and argument types 【发布时间】:2014-09-05 05:53:25 【问题描述】:

我的功能是:

 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 并且近距离投票“不清楚你在问什么” - 你已经足够了解了)。 这个问题起初表现不佳,但 OP 努力改进它。它提出了一个非常有趣的问题。所以,我想说,最初的反对票是没有根据的。 【参考方案1】:

您的函数有几个 smallint 参数。 但是在调用中,您使用的数字文字被假定为integer 类型。

不会立即键入字符串文字或 string constant ('123')。在明确分配或强制转换之前,它保持“未知”类型。

但是,会立即输入数字文字或 numeric constant。 The manual:

一个既不包含小数点也不包含 如果指数的值最初假定为类型integer 适合integer 类型(32 位);否则假定为 type bigint 如果它的值适合bigint 类型(64 位);否则它是 被认为是类型numeric。包含小数点和/或的常量 指数最初总是被假定为类型numeric

另见:

PostgreSQL ERROR: function to_tsvector(character varying, unknown) does not exist

解决方案

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小提琴here旧sqlfiddle.

【讨论】:

为什么SELECT * FROM f_typetest('1'); 会起作用? '1' 是一个字符串。能否请您进一步详细说明? @Jian:请再读一遍,重点是“字符串常量”与“数值常量”【参考方案2】:

我通过 Google 搜索找到了这个问题 - 我遇到了同样的错误

没有与给定名称和参数类型匹配的函数

但与 OP 不同,在我的情况下,这是因为 该函数存在,但它位于不同的架构中

要验证这种情况,需要运行查询:

SELECT
n.nspname AS function_schema,
p.proname AS function_name
FROM
pg_proc p
LEFT JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE
n.nspname NOT IN ('pg_catalog', 'information_schema')
AND p.proname ILIKE '%your_function_name%'
ORDER BY
function_schema,
function_name;

以防万一有人遇到同样的问题。

【讨论】:

【参考方案3】:

在我的特殊情况下,该功能实际上是缺失的。错误信息是一样的。我正在使用 Postgresql 插件 PostGIS,无论出于何种原因,我都必须重新安装它。

【讨论】:

您的回答可能无关紧要。显然,他/她的职能已被明确定义。【参考方案4】:

这个错误意味着一个函数调用只有在一个现有函数的所有参数都是相同类型并且以相同顺序传递时才匹配。所以如果下一个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() 函数。

因此,您需要仔细比较传递给函数的内容与预期的内容。这么长的表格列列表看起来很糟糕。

【讨论】:

以上是关于没有函数匹配给定的名称和参数类型的主要内容,如果未能解决你的问题,请参考以下文章

PL/PgSQL:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

在数据迁移时,出现错误:运算符不存在:布尔 = 整数提示:没有运算符与给定的名称和参数类型匹配

如何强制函数参数为相同类型并且不允许使用类型构造函数匹配给定类型?

没有函数模板“max”的实例与参数列表参数类型匹配是 (int, int)

共读Primer58.[6.5]参数匹配 Page217