DB2自定义函数报-440

本人小白,刚刚接触DB2,按照网上的例子写了一个自定义函数,入口为两个参数,为什么在使用的时候报-440,自己百度的好像说是参数不对。函数如下CREATE FUNCTION "DB2INST1"."DATE_FORMAT"(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select
substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case fmt
when 'yyyymmdd'
then yyyy || mm || dd
when 'mm/dd/yyyy'
then mm || '/' || dd || '/' || yyyy
when 'yyyy/dd/mm hh:mi:ss'
then yyyy || '/' || mm || '/' || dd || ' ' ||
hh || ':' || mi || ':' || ss
when 'yyyyMMddHH24miss'
then yyyy || mm || dd || hh || mi || ss
when 'yyyyMMdd'
then yyyy || mm || dd
when 'HH24miss'
then hh || mi || ss
when 'nnnnnn'
then nnnnnn
else
'date format ' || coalesce(fmt,' ') ||
' not recognized.'
end
from tmp
参与11

8同行回答

alleachinealleachine技术经理胜科金仕达数据系统(中国)有限公司
调用的时候加上模式名,我用你的脚本测试了:VALUES(DB2INST1.DATE_FORMAT(CURRENT TIMESTAMP, 'yyyymmdd'))1       --------20150113Rows affected (1)显示全部
调用的时候加上模式名,我用你的脚本测试了:
VALUES(DB2INST1.DATE_FORMAT(CURRENT TIMESTAMP, 'yyyymmdd'))
1      
--------
20150113

Rows affected (1)收起
证券 · 2015-01-13
浏览2627
zsj2002zsj2002数据库管理员澳門大豐銀行
回复 7# 一诺万世    values (DB2INST1.DATE_FORMAT(current date ,'yyyyMMdd'))这句是有问题的,要用values (DB2INST1.DATE_FORMAT(current  timestamp,'yyyyMMdd'))因为你定义的时候是CREATE FUNCTION "DB2INST1"."DATE_FORMAT"(TS timestamp, fmt ...显示全部
回复 7# 一诺万世


   values (DB2INST1.DATE_FORMAT(current date ,'yyyyMMdd'))

这句是有问题的,
要用
values (DB2INST1.DATE_FORMAT(current  timestamp,'yyyyMMdd'))


因为你定义的时候是
CREATE FUNCTION "DB2INST1"."DATE_FORMAT"(TS timestamp, fmt varchar(20))
你不能给个date进去,所以报错。
不过9.7以后应该可以隐式自己转换,所以就算乱给也不会报错。

能不能运行db2level看看

下回提问可以把执行过程以及完整的报错信息都贴上来,这样就很容易解决了。要不然这么一步一步猜比较废时间呵呵。:lol收起
银行 · 2015-01-13
浏览2627
一诺万世一诺万世软件开发工程师北京中信科技
问题解决了,谢谢zsj2002和alleachine两位朋友。都怪我一开始没有把问题描述清楚。显示全部
问题解决了,谢谢zsj2002和alleachine两位朋友。都怪我一开始没有把问题描述清楚。收起
软件开发 · 2015-01-15
浏览2745
一诺万世一诺万世软件开发工程师北京中信科技
我按照三楼说的方法测试过了,还是报-440的错误。(另外这个函数是在mybatis中使用的,加上模式名之后对mybatis调用有没有影响啊?)执行语句为:values (DB2INST1.DATE_FORMAT(current date ,'yyyyMMdd'))错误信息如下:>[错误] 脚本行:1-1 --------------------------------------- DB2...显示全部
我按照三楼说的方法测试过了,还是报-440的错误。(另外这个函数是在mybatis中使用的,加上模式名之后对mybatis调用有没有影响啊?)
执行语句为:values (DB2INST1.DATE_FORMAT(current date ,'yyyyMMdd'))
错误信息如下:
>[错误] 脚本行:1-1 ---------------------------------------
DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=DATE_FORMAT;FUNCTION, DRIVER=3.50.152
消息: No authorized routine named "DATE_FORMAT" of type "FUNCTION" having compatible arguments was found.. SQLCODE=-440, SQLSTATE=42884, DRIVER=3.50.152 

更多例外 ... DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-440;42884;DATE_FORMAT|FUNCTION, DRIVER=3.50.152

[执行:15-1-15 上午10时38分30秒][执行:0/ms]收起
软件开发 · 2015-01-15
浏览2766
zsj2002zsj2002数据库管理员澳門大豐銀行
回复 5# 一诺万世    不好意思,我当时没看到-440是个什么错误,后来我查了一下-440是SQL0440N  No authorized routine named "" of type "" having compatible arguments was found.所以应该是三楼回复的那个解决方案,你加上schema调用就应该可以了。...显示全部
回复 5# 一诺万世


   不好意思,我当时没看到-440是个什么错误,后来我查了一下-440是SQL0440N  No authorized routine named "" of type "" having compatible arguments was found.

所以应该是三楼回复的那个解决方案,你加上schema调用就应该可以了。收起
银行 · 2015-01-15
浏览2578
一诺万世一诺万世软件开发工程师北京中信科技
你好,关于DB2的版本问题能解释的清楚点么?因为这个自定义函数是我上个月写的,当时写的时候还是可以使用的,这两天再试的时候就不能使用了。再次十分感谢你的回复。显示全部
你好,关于DB2的版本问题能解释的清楚点么?因为这个自定义函数是我上个月写的,当时写的时候还是可以使用的,这两天再试的时候就不能使用了。
再次十分感谢你的回复。收起
软件开发 · 2015-01-15
浏览2646
一诺万世一诺万世软件开发工程师北京中信科技
谢谢大家。显示全部
谢谢大家。收起
软件开发 · 2015-01-15
浏览2703
zsj2002zsj2002数据库管理员澳門大豐銀行
回复 1# 一诺万世     我测试了一下完全可以啊。应该是DB2版本的问题吧-rw-r--r-- 1 db2inst1 db2iadm1       832 Jan 14 04:46 test.sql-rw-r--r-- 1 db2inst1 db2iadm1      8118 Jan  7 05:01 tmp.sqld...显示全部
回复 1# 一诺万世


    我测试了一下完全可以啊。应该是DB2版本的问题吧


-rw-r--r-- 1 db2inst1 db2iadm1       832 Jan 14 04:46 test.sql
-rw-r--r-- 1 db2inst1 db2iadm1      8118 Jan  7 05:01 tmp.sql
db2inst1@testing1:~> db2 -td@ -vf test.sql
CREATE FUNCTION "DB2INST1"."DATE_FORMAT"(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select
substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case fmt
when 'yyyymmdd'
then yyyy || mm || dd
when 'mm/dd/yyyy'
then mm || '/' || dd || '/' || yyyy
when 'yyyy/dd/mm hh:mi:ss'
then yyyy || '/' || mm || '/' || dd || ' ' ||
hh || ':' || mi || ':' || ss
when 'yyyyMMddHH24miss'
then yyyy || mm || dd || hh || mi || ss
when 'yyyyMMdd'
then yyyy || mm || dd
when 'HH24miss'
then hh || mi || ss
when 'nnnnnn'
then nnnnnn
else
'date format ' || coalesce(fmt,' ') ||
' not recognized.'
end
from tmp
DB20000I  The SQL command completed successfully.

db2inst1@testing1:~> db2 "values date_format(current timestamp,'ttttmmdd')"

1                                                
--------------------------------------------------
date format ttttmmdd not recognized.              

  1 record(s) selected.

db2inst1@testing1:~> db2 "values date_format(current timestamp,'yyyymmdd')"

1                                                
--------------------------------------------------
20150114                                          

  1 record(s) selected.

db2inst1@testing1:~>收起
银行 · 2015-01-13
浏览2727

提问者

一诺万世
软件开发工程师北京中信科技

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2015-01-13
  • 关注会员:1 人
  • 问题浏览:9246
  • 最近回答:2015-01-15
  • X社区推广