【发布时间】:2021-03-08 10:18:18
【问题描述】:
我已经编写了以下函数,它可以在 Postgres 12.5 中运行:
CREATE OR REPLACE FUNCTION export_to_s3()
RETURNS TRIGGER
AS $export_to_s3$
BEGIN
PERFORM aws_s3.query_export_to_s3(
'select * from test.allowed_object_status',
aws_commons.create_s3_uri(
'test-db-dumps',
'allowed_object_status.csv',
'eu-west-2'),
options :='format csv, delimiter $$,$$'
);
RETURN NEW;
END;
$export_to_s3$ LANGUAGE plpgsql;
现在我想将test.allowed_object_status 和allowed_object_status.csv 参数传递给export_to_s3()。
我尝试了一些方法,但都失败了,所以任何帮助都会很棒。
我的问题的第二部分,不太重要的是函数可能不返回任何内容/无效。我将此函数设为触发器,但这只是因为我不知道如何声明一个执行后不返回任何内容的函数
解决方案
感谢下面@404 的 cmets,这是我提出的解决方案。
CREATE OR REPLACE FUNCTION export_to_s3(query_cmd text, bucket_prefix text)
RETURNS VOID
AS $export_to_s3$
BEGIN
PERFORM
aws_s3.query_export_to_s3(
query_cmd,
aws_commons.create_s3_uri(
'test-db-dumps',
bucket_prefix,
'eu-west-2'),
options :='format csv, delimiter $$,$$'
);
END;
$export_to_s3$ LANGUAGE plpgsql;
我确信有更好的方法来做这件事,但对 plpgsql 来说很新
【问题讨论】:
-
要明确一点,您实际上是在寻找触发功能还是只是常规功能?如果它需要是触发器,那么也许您可以通过在触发器函数读取的某处设置环境变量来获取这些值......如果它不需要是触发器函数,那么它更容易,只是一个标准函数参数。 “函数是否可以不返回任何内容”-“函数”,当然可以,将其定义为
RETURNS VOID;但不清楚是否需要触发函数。 -
嘿@404,为糟糕的写作和混乱道歉。是的,它应该是一个什么都不返回的函数,所以我会使用你建议的
RETURNS VOID。我将如何将参数传递给它? -
好吧,如果它只是一个常规函数,那么请参阅postgresql.org/docs/current/sql-createfunction.html了解如何使用参数等。触发函数有点不同,常规函数不能用作触发器。跨度>
-
@404 这足以让我想出一个解决方案......如果你愿意提供它作为答案,我很乐意接受它。谢谢
标签: sql postgresql plpgsql