无法在DB2 for i上调用带有CHAR参数的用户定义函数

无法在DB2 for i上调用带有CHAR参数的用户定义函数,db2,ibm-midrange,params,create-function,Db2,Ibm Midrange,Params,Create Function,我在DB2版本6.01中创建了一个函数,如下所示: CREATE FUNCTION myschema.test_c_c(param CHAR(1)) RETURNS CHAR(1) RETURN param; SELECT myschema.test_c_c('X') FROM SYSIBM.SYSDUMMY1; 并获得一条成功消息,System i Navigator将在myschema下向我展示该功能。但当我尝试以这种方式调用此函数时: CREATE FUNCTION myschema.

我在DB2版本6.01中创建了一个函数,如下所示:

CREATE FUNCTION myschema.test_c_c(param CHAR(1)) RETURNS CHAR(1) RETURN param;
SELECT myschema.test_c_c('X') FROM SYSIBM.SYSDUMMY1;
并获得一条成功消息,System i Navigator将在myschema下向我展示该功能。但当我尝试以这种方式调用此函数时:

CREATE FUNCTION myschema.test_c_c(param CHAR(1)) RETURNS CHAR(1) RETURN param;
SELECT myschema.test_c_c('X') FROM SYSIBM.SYSDUMMY1;
我得到以下信息:

[SQL0204] TEST_C_C der Art *N in myschema nicht gefunden. 
[SQL State=42704, DB Errorcode=-204] 
nicht gefunden等于未找到

错误代码解释-204部分

DB2®子系统中未定义由名称标识的对象

最后,使用INT参数,所有工作正常:

CREATE FUNCTION myschema.test_i_ri(param INT) RETURNS INT RETURN param;
SELECT myschema.test_i_ri(4711) FROM SYSIBM.SYSDUMMY1;
CREATE FUNCTION myschema.test_ii_ri(param1 INT, param2 INT) RETURNS INT RETURN param1 +param2;
SELECT myschema.test_ii_ri(800, 15) FROM SYSIBM.SYSDUMMY1;
我哪里没抓住要点


我执行了所有我觉得非常有用的步骤,经过几个小时的尝试和研究,我提出了这个问题,30分钟后我自己找到了答案

问题是DB2中重载函数的解决方案。打电话的时候

SELECT myschema.test_c_c('X') FROM SYSIBM.SYSDUMMY1;
这样,DB2将“X”解释为VARCHAR,但我没有带有VARCHAR参数的test_c_c版本。什么是工作

SELECT CESDTA.TEST_C_C(CAST('X' AS CHAR(1))) FROM SYSIBM.SYSDUMMY1;
或声明一个VARCHAR函数:

CREATE FUNCTION cesdta.test_v_v(param VARCHAR(1)) RETURNS VARCHAR(1000) RETURN param;
SELECT cesdta.test_v_v('X') FROM SYSIBM.SYSDUMMY1;

经过几个小时的尝试和研究,我问了这个问题,30分钟后,我发现答案是我自己的

问题是DB2中重载函数的解决方案。打电话的时候

SELECT myschema.test_c_c('X') FROM SYSIBM.SYSDUMMY1;
这样,DB2将“X”解释为VARCHAR,但我没有带有VARCHAR参数的test_c_c版本。什么是工作

SELECT CESDTA.TEST_C_C(CAST('X' AS CHAR(1))) FROM SYSIBM.SYSDUMMY1;
或声明一个VARCHAR函数:

CREATE FUNCTION cesdta.test_v_v(param VARCHAR(1)) RETURNS VARCHAR(1000) RETURN param;
SELECT cesdta.test_v_v('X') FROM SYSIBM.SYSDUMMY1;

就我个人而言,如果我已经声明了一个“规范”版本,即接受字符的版本,那么我只需要将其他版本进行强制转换/转换,并将其导入到原始版本中。不过,很好,你已经找到了它-继续,并接受你自己的答案时,你可以。就个人而言,如果我已经声明了一个'规范'版本,即字符接受一个,我只会有其他版本的演员/转换,漏斗到原来的。然而,你发现了这一点,这是件好事——当你有能力的时候,去接受你自己的答案吧。