postgresql 错误:函数...不存在并且提示:没有函数匹配给定的名称和参数类型

wz8daaqr  于 6个月前  发布在  PostgreSQL
关注(0)|答案(6)|浏览(201)

我的职能是:

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

w80xi6nr

w80xi6nr1#

您的函数有两个**smallint参数。
但在调用中,您使用的是假定为integer类型的数字文本。
字符串文字或字符串常量('123')没有立即类型化。在显式赋值或强制转换之前,它将保持“unknown”类型。
但是,会立即键入数字文字或
数字常量**。手册:
如果既不包含小数点也不包含指数的数值常量的值符合integer类型(32位),则**最初假定该常量为integer**类型;否则,如果该常量的值符合bigint类型(64位),则假定该常量为bigint类型;包含小数点和/或指数的常数最初总是被假定为numeric类型。
另请参阅:

  • PostgreSQL错误:函数to_tsvector(字符可变,未知)不存在

溶液

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);

  • 小提琴 *

老家伙。

w9apscun

w9apscun2#

这个错误意味着一个函数调用只有在所有参数都是相同类型并且以相同顺序传递的情况下才能被现有函数匹配。

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()函数以整数作为参数。
所以你需要仔细地比较你传递给函数的内容和它期望的内容,那么长的表列列表看起来像是糟糕的设计。

fcy6dtqo

fcy6dtqo3#

在我的特殊情况下,函数实际上是失踪。错误消息是相同的。我使用的是Postgresql插件PostGIS,我不得不重新安装,无论出于何种原因。

ruarlubt

ruarlubt4#

我通过谷歌搜索达到这个问题-我遇到了同样的错误
没有函数与给定的名称和参数类型匹配
但与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;

字符串
以防有人有同样的问题。

j9per5c4

j9per5c45#

您还可以在假定的整数类型不正确的情况下使用类型转换运算符::smallint。

create or replace procedure FnUpdateSalegtab09(
    iDisType smallint
)

call FnUpdateSalegtab09(1::smallint);

字符串

gajydyqb

gajydyqb6#

我用OUT参数创建了一个PL/pgSQL function,如下所示:

CREATE FUNCTION my_func(OUT value INTEGER) AS $$
BEGIN                -- ↑ ↑ ↑ Here ↑ ↑ ↑
END;
$$ LANGUAGE plpgsql;

字符串
然后,调用my_func(3)得到了如下所示的相同错误,因为OUT参数无法从调用者获取值,而它可以向调用者返回值:

postgres=# SELECT my_func(3);
ERROR:  function my_func(integer) does not exist
LINE 1: SELECT my_func(3);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.


所以,我设置了INOUT参数,它可以从调用者那里获取一个值并返回一个值给调用者,如下所示,然后错误就解决了:

CREATE FUNCTION my_func(INOUT value INTEGER) AS $$
BEGIN                -- ↑ ↑ ↑ Here ↑ ↑ ↑
END;
$$ LANGUAGE plpgsql;


或者,我设置了IN参数,它可以从调用者那里获取值,但不能向调用者和RETURNS VOID返回值,如下图所示,然后错误就解决了:

CREATE FUNCTION my_func(IN value INTEGER) RETURNS VOID AS $$
BEGIN                -- ↑ ↑ ↑ Here ↑ ↑ ↑
END;
$$ LANGUAGE plpgsql;


或者,我设置了没有IN关键字的参数,它也被识别为IN参数和RETURNS VOID,如下图所示,然后错误就解决了:

CREATE FUNCTION my_func(value INTEGER) RETURNS VOID AS $$
BEGIN                -- ↑ ↑ Here ↑ ↑   ↑ ↑ Here ↑ ↑
END;
$$ LANGUAGE plpgsql;

相关问题