暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MTK 迁移:o2p报错信息汇总(持续更新)

原创 贾勇智 2022-06-08
852
1.存储过程中数据类型转换报错

报错现象:

CREATE OR REPLACE PROCEDURE hr.secure_dml() LANGUAGE PLPGSQL AS $body$
DECLARE


BEGIN
  IF CURRENT_TIMESTAMP::timestamp(0::varchar without time zone, 'HH24:MI') NOT BETWEEN '08:00' AND '18:00'
        OR CURRENT_TIMESTAMP::timestamp(0::varchar without time zone, 'DY') IN ('SAT', 'SUN') THEN
        RAISE EXCEPTION '%', 'You may only make changes during normal office hours' USING ERRCODE = '45205';
  END IF;
END;
$body$

复制

postgres时间格式:

时间单位:
year :年
week :该天在所在的年份里是第几周
timezone_minute:时区偏移量的分钟部分
timezone_hour:时区偏移量的小时部分
timezone:与UTC的时区偏移量,以秒记。正数对应 UTC 东边的时区,负数对应 UTC 西边的时区
second :秒
quarter:日期中年所在季度(1-4)
month:月(0-11)
minute:分钟(0-59)
milliseconds:
isodow:周中的第几天 [1-7] 星期一:1) 星期天:(7)
dow:周中天的索引(0-6 ;星期天是 0)
doy:一年的第几天(1-365/366)
hour:小时(0-23)
day: 天(1-31)
 
 
模式描述
HH 一天的小时数(01-12)
HH12 一天的小时数(01-12)
HH24 一天的小时数(00-23)
MI 分钟(00-59)
SS 秒(00-59)
MS 毫秒(000-999)
US 微秒(000000-999999)
AM 正午标识(大写)
Y,YYY 带逗号的年(4和更多位)
YYYY 年(4和更多位)
YYY 年的后三位
YY 年的后两位
Y 年的最后一位
MONTH 全长大写月份名(空白填充为9字符)
Month 全长混合大小写月份名(空白填充为9字符)
month 全长小写月份名(空白填充为9字符)
MON 大写缩写月份名(3字符)
Mon 缩写混合大小写月份名(3字符)
mon 小写缩写月份名(3字符)
MM 月份号(01-12)
DAY 全长大写日期名(空白填充为9字符)
Day 全长混合大小写日期名(空白填充为9字符)
day 全长小写日期名(空白填充为9字符)
DY 缩写大写日期名(3字符)
Dy 缩写混合大小写日期名(3字符)
dy 缩写小写日期名(3字符)
DDD 一年里的日子(001-366)
DD 一个月里的日子(01-31)
D 一周里的日子(1-7;周日是1)
W 一个月里的周数(1-5)(第一周从该月第一天开始)
WW 一年里的周数(1-53)(第一周从该年的第一天开始)

复制

问题分析解决:

test@[local]:1931=>8720 select CURRENT_TIMESTAMP::timestamp(0::varchar without time zone, 'HH24:MI');
ERROR:  syntax error at or near "::"
LINE 1: select CURRENT_TIMESTAMP::timestamp(0::varchar without time ...

格式输写错误:
select to_char(CURRENT_TIMESTAMP::timestamp(0),'HH24:MI');
 to_char 
---------
 18:17
(1 row)

改正后:
test@[local]:1931=>8720 CREATE OR REPLACE PROCEDURE hr.secure_dml() LANGUAGE PLPGSQL AS $body$
test$> DECLARE
test$> BEGIN
test$>   IF to_char(CURRENT_TIMESTAMP::timestamp(0),'HH24:MI') NOT BETWEEN '08:00' AND '18:00'
test$>         OR to_char(CURRENT_TIMESTAMP::timestamp(0),'DY') IN ('SAT', 'SUN') THEN
test$>         RAISE EXCEPTION '%', 'You may only make changes during normal office hours' USING ERRCODE = '45205';
test$>   END IF; 
test$> END;
test$> $body$;
CREATE PROCEDURE
复制
2.当索引列类型为字符,但内容为数字,创建索引需求转为number类型报错

报错原因:
PostgreSQL中to_number函数需要两位参数第一个是列,第二个指定输出格式,但MTK转换时只有一个参数。这里即使有两个参数也有问题,因为列长度不固定。此时,可以使用函数cast()将字符类型列转换为integer类型。
问题解决:

test@[local]:1931=>17776 create table coll2d(a varchar);
CREATE TABLE
test@[local]:1931=>17776 insert into coll2d (a)values('1');
INSERT 0 1
复制

#使用to_number()时报错。

test@[local]:1931=>17776 create index idx_coll2d_a on coll2d(to_number(a));
ERROR:  function to_number(character varying) does not exist
LINE 1: create index idx_coll2d_a on coll2d(to_number(a));
                                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
复制

#使用类型转换col::ingeger报错

test@[local]:1931=>17776  create index idx_coll2d_a on coll2d(a::integer);
ERROR:  syntax error at or near "::"
LINE 1: create index idx_coll2d_a on coll2d(a::integer);
复制

#使用cast()时正常

test@[local]:1931=>17776  create index idx_coll2d_a on coll2d(cast(a as integer));
CREATE INDEX
复制

#此时再向索引列插入非数字字符,会报错。

test@[local]:1931=>17776 insert into coll2d (a)values('d');
ERROR:  invalid input syntax for type integer: "d"

复制
最后修改时间:2022-06-10 18:03:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论