システム関数内での文字列長のあつかい(文字列操作の結果を日付型に変換する)
テキストをタイムスタンプに直すために
db2 VALUES TIMESTAMP(CONCAT(REPLACE('2005/6/30','/','-') , ' 00:00:00'))
と書くと
SQL0440N 互換引き数を持つタイプ "FUNCTION" の名前 "TIMESTAMP" の許可ルーチンが見つかりませんでした。 SQLSTATE=42884
と怒られますが、これはなぜかというと、ヒントはREPLACE関数にありました。SQLリファレンスをよく読むと
最初、2 番目、および 3 番目の引き数が VARCHAR または CHAR の場合は VARCHAR(4000) になります。
と書いてあります。つまりTIMESTAMPの引数の文字列長が大きすぎて怒られるというひどい話なのです。ここは
db2 VALUES TIMESTAMP(CHAR(CONCAT(REPLACE('2005/6/30','/','-') , ' 00:00:00'),20))
のようにいったんCHAR型で文字列長を減らす処理が必要なのでした。