从存储过程内的 S3 进行 Redshift 复制

dat*_*ack 6 stored-procedures amazon-web-services amazon-redshift

我想使用Lambda准备一个清单文件,然后执行提供输入参数manifest_location的存储过程。

存储过程签名:

CREATE OR REPLACE PROCEDURE stage.sp_stage_user_activity_page_events(manifest_location varchar(256))
Run Code Online (Sandbox Code Playgroud)

我想按如下方式使用此参数:

COPY stage.user_activity_event 
FROM manifest_location
IAM_ROLE 'arn:aws:iam::XXX:role/redshift-s3-read-only-role'
IGNOREHEADER 1
REMOVEQUOTES
DELIMITER ','
LZOP
MANIFEST;
Run Code Online (Sandbox Code Playgroud)

但 Redshift 给了我错误:

“$1”处或附近存在语法错误 其中:第 21 行附近 PL/PgSQL 函数“sp_stage_user_activity_page_events”中的 SQL 语句

我怎样才能实现这个目标?

小智 3

你能尝试一下下面的命令吗?

EXECUTE 'COPY '|| parameter_for_table ||' FROM '||CHR(39)|| parameter_for_s3_path ||CHR(39)||' IAM_ROLE '||CHR(39)|| parameter_for_iam_role ||CHR(39)||' FORMAT AS PARQUET;';
Run Code Online (Sandbox Code Playgroud)

如果您还有其他问题,请告诉我,因为我今天创建了一个存储过程,如下所示:

CREATE TABLE table_for_error_log (message varchar);
CREATE OR REPLACE procedure sp_proc_name(parameter_for_table in VARCHAR, parameter_for_s3_path in VARCHAR, parameter_for_iam_role in VARCHAR)
AS
$$
BEGIN
    EXECUTE 'COPY '|| parameter_for_table ||' FROM '||CHR(39)|| parameter_for_s3_path ||CHR(39)||' IAM_ROLE '||CHR(39)|| parameter_for_iam_role ||CHR(39)||' FORMAT AS PARQUET;';
EXCEPTION WHEN OTHERS THEN
    RAISE INFO 'An exception occurred.';
    INSERT INTO table_for_error_log VALUES ('Error message: ' || SQLERRM);
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

它已经经过测试并且有效。

只需将其替换为您自己的命令即可。