Redshift存储过程内部传参调用时$1附近语法错误如何解决
问题根因
你遇到的syntax error at or near "$1"报错,本质是Redshift存储过程中动态拼接UNLOAD语句时,单引号转义规则处理不当,Redshift解析动态生成的SQL时,误将未正确转义的单引号边界识别为参数占位符$1。
具体代码里的触发点:
- 跨行拼接SELECT语句时,隐含的换行/缩进字符和单引号边界结合,导致解析异常
- 多层字符串嵌套时,单引号转义次数不足,动态生成的UNLOAD语句语法不符合要求
修复方案
把动态SQL拼接的部分改成用quote_literal函数自动处理单引号转义,避免手动拼引号出错,修改后的完整存储过程如下:
CREATE OR REPLACE PROCEDURE SchemaName.Testing_Passing_Parameter_in_SP () LANGUAGE plpgsql AS $$ DECLARE FirstDayofWeek VARCHAR(50); Unload_Query VARCHAR(65000); v_select_sql VARCHAR(1000); v_s3_path VARCHAR(1000); v_creds VARCHAR(1000); BEGIN -- 计算周首日 SELECT TO_CHAR(DATE_TRUNC('WEEK', GETDATE()), 'MMDDYYYY') INTO FirstDayofWeek; -- 单独赋值各片段,避免拼接混乱 v_select_sql := 'SELECT * FROM SchemaName.TableName'; v_s3_path := 's3://BucketName/FolderName/Sample_File_'||FirstDayofWeek||'.csv'; v_creds := 'aws_access_key_id=xxx;aws_secret_access_key=xxx'; -- 拼接UNLOAD语句,用quote_literal自动处理单引号转义 Unload_Query := 'UNLOAD (' || quote_literal(v_select_sql) || ') TO ' || quote_literal(v_s3_path) || ' CREDENTIALS ' || quote_literal(v_creds) || ' HEADER ALLOWOVERWRITE DELIMITER ' || quote_literal(',') || ' ADDQUOTES PARALLEL OFF'; -- 调试可打开下方注释,执行后在查询日志查看生成的完整UNLOAD语句,可直接复制单独执行校验语法 -- RAISE NOTICE '生成的UNLOAD语句:%', Unload_Query; EXECUTE Unload_Query; END; $$; -- 调用测试 CALL SchemaName.Testing_Passing_Parameter_in_SP ();
内容的提问来源于stack exchange,提问作者SusanD
相关产品推荐
相关产品推荐

