开发者社区> 橘子红了呐> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看
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: 42883function 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;
END;
$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;
END;
$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
      #jjdm : String#
      
]]></Select>
修改成下面的方式:
<Select CommandName="AddGuanZhuDu" Method="" CommandType="Text" Description="增加关注度" ResultClass="ValueType"><![CDATA[
      select * from UpdateFundAttention (#jjdm: String#)
      
]]></Select>
复制代码
但这种修改方式会造成SqlServer与PostgreSQL的SQL-MAP语句不相同,增加程序的维护量,理想的方式是SQL-MAP语句尽量相同。

 



    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2012/06/22/2559089.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云PolarDB、RDS获评信通院数据库Serverless认证最高“先进级”,AnalyticDB获“增强级”
随着云原生数据库的快速发展,Serverless能力正成为数据库产品的核心能力之一。
119 0
《阿里云企业级自治数据库 RDS 详解》电子版地址
阿里云企业级自治数据库 RDS 详解.ppt
26 0
《RDS数据库入门一本通》电子版地址
本书体系完整,理论充实,内容由浅入深,循序渐进,更配有详细的实例解说,为初学者提供一个完整、严密的思维框架,零基础的你也可轻松掌握RDS数据库的美妙节奏。
28 0
Redis的KEYS命令引起RDS数据库雪崩,RDS发生两次宕机,造成几百万的资金损失
Redis的KEYS命令引起RDS数据库雪崩,RDS发生两次宕机,造成几百万的资金损失
163 0
前沿分享|阿里云数据库高级技术专家 宋利兵:阿里云企业级自治数据库RDS详解
本篇内容为2021云栖大会-企业级云原生数据库最佳实践论坛中,阿里云数据库高级技术专家 宋利兵关于“阿里云企业级自治数据库RDS详解”的分享。
367 0
【RDS MySQL】将Excel的数据导入数据库
您可以将Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。
343 0
PolarDB-X 1.0-常见问题-分库分表问题-删除数据库时,PolarDB-X各物理分库是否会被自动删除?是否会影响RDS上的数据库?
在控制台上删除PolarDB-X的数据库时,只会删除之前由PolarDB-X所创建的数据库,不会影响原本在RDS上创建的数据库。
92 0
阿里云RDS数据库助力孔网提升运维效率
业务/技术亮点:高效运维/弹性能力/跨机房容灾/数据迁移一致性
193 0
RDS数据库架构实践及解析|阿里云产品内容精选(十二)
本文内容来源于阿里云开发者社区,助力各位开发者了解阿里云数据库相关内容。
408 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
PolarDB for PostgreSQL三节点功能介绍
立即下载
对象的生命期管理
立即下载
Oracle 至PostgreSQL案例分享
立即下载