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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
501次阅读
2025-04-21 16:58:09
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
357次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
337次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
309次阅读
2025-04-07 12:14:29
postgresql+patroni+etcd高可用安装
necessary
172次阅读
2025-03-28 10:11:23
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
152次阅读
2025-04-14 15:58:34
墨天轮PostgreSQL认证证书快递已发(2025年3月批)
墨天轮小教习
130次阅读
2025-04-03 11:43:25
SQL 优化之 OR 子句改写
xiongcc
95次阅读
2025-04-21 00:08:06
融合Redis缓存的PostgreSQL高可用架构
梧桐
90次阅读
2025-04-08 06:35:40
PostgreSQL拓展PGQ实现解析
chirpyli
87次阅读
2025-04-07 11:23:17
TA的专栏
热门文章
PostgreSQL 12.8 详解命令pg_rewind
2021-10-29 7105浏览
[译] Postgresql 清理更新频繁的表
2022-04-12 6380浏览
patroni 报错问题处理:CRITICAL: system ID mismatch, node pgsql_node1 belongs to a different cluster: 7052280560147471869 != 7052284163
2022-01-12 5223浏览
patroni 服务启报错:patroni.exceptions.PatroniFatalException
2022-01-10 4969浏览
数据库短连接风暴触发oracle bug 32164034
2021-11-18 4703浏览
目录