我以这种方式在DB2(版本6.01)中创建一个函数:
CREATE FUNCTION myschema.test_c_c(param CHAR(1)) RETURNS CHAR(1) RETURN param;
并获取一条succses消息,“System i Navigator”在myschema下显示该功能。但是,当我尝试以这种方式调用此函数时:
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的说明(部分内容,full error code Description here)
“通过名称标识的对象未在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;
我在哪里错过了这一点?
我用SQL Workbench/J执行所有状态(我觉得非常有用)
答案 0 :(得分:4)
经过几个小时的尝试错误和研究后,我问了问题,然后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;