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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
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和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
|
3月前
|
存储 数据库
MySQL-函数和存储过程区别
MySQL-函数和存储过程区别
46 0
|
2月前
|
存储 SQL 关系型数据库
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
35 0
|
3月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
38 0
|
2月前
|
SQL 存储 缓存
PostgreSQL函数管理接口
学习PostgreSQL服务端开发必须要对函数管理接口有比较深入的了解
143 0
|
1月前
|
存储 SQL 关系型数据库
Msql第四天,存储过程和函数
Msql第四天,存储过程和函数
43 0
Msql第四天,存储过程和函数
|
1月前
|
关系型数据库 PostgreSQL
postgresql日程排程函数的编写实例
postgresql日程排程函数的编写实例
|
2月前
|
存储 数据库
【数据库】分支与循环&函数&存储过程
【数据库】分支与循环&函数&存储过程
22 1
|
2月前
|
SQL 关系型数据库 分布式数据库
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
43 7
|
3月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
35 0