相关文章推荐
傻傻的大海  ·  哥布林杀手第一季_日本动漫__动漫详情 - ...·  1 月前    · 
腼腆的滑板  ·  iCloud怎么恢复微信聊天记录?2种方法教 ...·  3 月前    · 
爱吹牛的瀑布  ·  开始使用 Espressif ...·  4 月前    · 
痛苦的充电器  ·  龍華科大遊戲系Coser總動員 ...·  4 月前    · 
谈吐大方的盒饭  ·  厉害了!南阳90后女教师收到联合国儿童基金会 ...·  5 月前    · 
Code  ›  调用PostgreSQL存储过程,找不到函数名的问题开发者社区
函数调用 存储过程 postgresql postgresql存储过程
https://cloud.tencent.com/developer/article/1044922
谦和的柳树
2 年前
作者头像
用户1177503
0 篇文章

调用PostgreSQL存储过程,找不到函数名的问题

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 程序员的SOD蜜 > 调用PostgreSQL存储过程,找不到函数名的问题

调用PostgreSQL存储过程,找不到函数名的问题

作者头像
用户1177503
发布 于 2018-02-26 16:26:47
1.2K 0
发布 于 2018-02-26 16:26:47
举报

PostgreSQL 的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题。

问题描述:

下面的示例测试代码:

PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");
            IDataParameter para = db.GetParameter();
            para.ParameterName = "@jjdm";
            para.DbType = DbType.AnsiString  ; 
            para.Value = "KF0355";
            int count= db.ExecuteNonQuery("updatefundattention",
                System.Data.CommandType.StoredProcedure,
                new System.Data.IDataParameter[] { para });

运行该存储过程,出现下面的错误:

DataBase ErrorMessage:ERROR: 42883: function updatefundattention(text) does not exist SQL:updatefundattention CommandType:StoredProcedure Parameters: Parameter["@jjdm"] = "KF0355"              //DbType=String

实际上,PostgreSQL的函数updatefundattention 参数类型不是 text,而是自定义的类型 citex ,下面是函数定义:

CREATE OR REPLACE FUNCTION updatefundattention(jjdm citext)
  RETURNS void AS
$BODY$
DECLARE
BEGIN
  update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;
  --return 1;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION updatefundattention(citext) OWNER TO postgres;

昨天分析可能PostgreSQL的字符型参数不能使用AnsiString参数类型,需要使用String类型,但今天测试发现

para.DbType = DbType.String  ;

问题依然没有解决。

重新建立一个测试函数updatefundattention,只是参数类型为 varchar:

CREATE OR REPLACE FUNCTION updatefundattention2(jjdm character varying)
  RETURNS void AS
$BODY$
DECLARE
BEGIN
  update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;
  --return 1;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION updatefundattention2(character varying) OWNER TO postgres;

运行测试程序,不论

para.DbType = DbType.AnsiString  ;

还是

para.DbType = DbType.String  ;

调用函数updatefundattention2 均能通过,故此得到结论:

目前自定义的 citext 类型.NET程序无法设置正确的DbType,从而会出现找不到函数的错误!

问题影响:

在WFT中,所有使用.NET程序调用PostgreSQL存储过程的代码,如果存储过程的参数使用了自定义的类型(例如citex),均会受影响。

解决方案:

a,建议 不要在PostgreSQL函数的参数中使用自定义的类型 ,如果要想对参数进行大小写转换,建议在函数体中使用另外一个Pgsql变量,函数中执行查询的SQL语句使用这个新变量,而不是直接使用这个函数参数;

b,修改Sql-Map中的SQL语句,例如

<Select CommandName="AddGuanZhuDu" Method="" CommandType="StoredProcedure" Description="增加关注度" ResultClass="ValueType"><![CDATA[
      UpdateFundAttention
 
推荐文章
傻傻的大海  ·  哥布林杀手第一季_日本动漫__动漫详情 - 樱花动漫6-专注动漫的门户网站
1 月前
腼腆的滑板  ·  iCloud怎么恢复微信聊天记录?2种方法教你微信恢复! - 腾讯云开发者社区-腾讯云
3 月前
爱吹牛的瀑布  ·  开始使用 Espressif ESP32-C 和 DevKit ESP-WROVER-KIT - FreeRTOS
4 月前
痛苦的充电器  ·  龍華科大遊戲系Coser總動員 經典動漫角色展現學子創意熱情 - 龍華科技大學
4 月前
谈吐大方的盒饭  ·  厉害了!南阳90后女教师收到联合国儿童基金会发来的感谢信……_地市_资讯_河南商报网
5 月前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号