调用PostgreSQL存储过程时出现to_DATE语法错误的求助
PostgreSQL存储过程调用语法错误解决指南
问题重现
调用存储过程代码:
CALL qis_pk_test.qis_pk_testBill( to_DATE('03-02-2023','DD-MM-YYYY')::timestamp without time zone, to_DATE('03-02-2023','DD-MM-YYYY')::timestamp without time zone ); fetch all in qis_pk_test.qis_pk_testBill;
触发错误:
ERROR: syntax error at or near "to_DATE" LINE 2: to_DATE('03-02-2023','DD-MM-YYYY'')::timestamp without ... ^ SQL state: 42601 Character: 51
尝试将单引号转义为双单引号后问题依旧:
CALL qis_pk_test.qis_pk_testBill( to_DATE(''03-02-2023'',''DD-MM-YYYY'')::timestamp without time zone, to_DATE(''03-02-2023'',''DD-MM-YYYY'')::timestamp without time zone ); fetch all in qis_pk_test.qis_pk_testBill;
解决步骤
1. 修正单引号错误
错误提示里的'DD-MM-YYYY'')显示你多输入了一个单引号。直接在SQL客户端执行CALL语句时不需要转义单引号,用普通单引号即可,修正后的基础调用代码:
CALL qis_pk_test.qis_pk_testBill( to_date('03-02-2023', 'DD-MM-YYYY')::timestamp without time zone, to_date('03-02-2023', 'DD-MM-YYYY')::timestamp without time zone );
2. 简化日期转换逻辑
PostgreSQL支持直接将符合格式的字符串转为timestamp,无需先转date再转timestamp,可简化写法:
CALL qis_pk_test.qis_pk_testBill( '03-02-2023'::timestamp without time zone, '03-02-2023'::timestamp without time zone );
或者用to_timestamp直接生成timestamp类型:
CALL qis_pk_test.qis_pk_testBill( to_timestamp('03-02-2023', 'DD-MM-YYYY'), to_timestamp('03-02-2023', 'DD-MM-YYYY') );
3. 匹配存储过程参数类型
如果上述写法仍报错,检查存储过程qis_pk_test.qis_pk_testBill的定义:
- 如果参数是
date类型,直接传to_date('03-02-2023', 'DD-MM-YYYY')即可,无需转换为timestamp; - 如果参数是
timestamp with time zone,需调整转换逻辑。
4. 修正游标调用方式
fetch all in qis_pk_test.qis_pk_testBill仅当存储过程返回同名游标时有效。如果存储过程通过OUT参数返回游标,需先声明游标变量再调用:
-- 在PL/pgSQL块中执行 DECLARE cur refcursor; BEGIN CALL qis_pk_test.qis_pk_testBill('03-02-2023'::timestamp, '03-02-2023'::timestamp, cur); FETCH ALL IN cur; END;
如果在psql客户端执行,可使用INTO子句获取游标:
CALL qis_pk_test.qis_pk_testBill('03-02-2023'::timestamp, '03-02-2023'::timestamp) INTO cur; FETCH ALL IN cur;
内容的提问来源于stack exchange,提问作者Rooter
相关产品推荐
相关产品推荐

