如何在 Redshift 中的 select 语句中使用存储过程

Posted

技术标签:

【中文标题】如何在 Redshift 中的 select 语句中使用存储过程【英文标题】:How to use a stored procedure inside of a select statement in Redshift 【发布时间】:2021-06-16 16:58:04 【问题描述】:

我为 mysql 和其他数据库提供程序找到了一些其他解决方法,但我无法找到在 redshift 中的 select 语句中使用存储过程 (get_data) 的解决方案。我有一个存储过程传递一些 id 并从另一个表创建一个临时表 (tmp_tbl)。然后我想使用该表并通过一些操作从临时表中返回一些数据。

SELECT
    tl.code,
    tl.name,
    SUM(tl.imps) as sales,
    SUM(tl.clicks) as clicks
FROM (

    CALL get_data('id1,id2');

    SELECT * FROM tmp_tbl tl

)
WHERE filter='1990'
GROUP BY 1,2;

作为一种解决方案,我可以在其他地方单独执行存储过程,然后合并结果,但这意味着我必须从我的数据库发出两个单独的请求,我想避免它。或者我想出了其他解决方案,我仍然在不使用 select 语句中的存储过程的情况下进行一个数据库调用,但是我有一些其他代码依赖于这种结构,所以我想实现一个内部语句。有没有办法做到这一点?

程序;

CREATE OR REPLACE PROCEDURE get_data(f1 varchar(max))
AS $$
BEGIN
  DROP TABLE IF EXISTS id_list;

  CREATE TEMPORARY TABLE id_list (
            Id varchar(40)
    );

  DROP TABLE IF EXISTS tmp_tbl;
  FOR loop_var IN 1..(REGEXP_COUNT(f1,',') + 1) LOOP
            INSERT INTO id_list VALUES (SPLIT_PART(f1,',',loop_var));
  END LOOP;
  CREATE TEMP TABLE tmp_tbl as 

    SELECT code, name,sales,clicks
    FROM mview_a
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_b
    WHERE id IN (SELECT id FROM id_list)


UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_c
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM view_d (combination of multiple mviews)
    WHERE id IN (SELECT id FROM id_list)

UNION ALL

    SELECT code, name,sales,clicks
    FROM mview_e
    WHERE id IN (SELECT id FROM id_list)

【问题讨论】:

get_data 的代码是什么样的? 我会编辑我的帖子并把它放在这里! 【参考方案1】:

难道你不能先运行CALL 来制作临时表,然后在后续的连接中使用它吗?

CALL get_data('id1,id2');

SELECT
    tl.code,
    tl.name,
    SUM(tl.imps) as sales,
    SUM(tl.clicks) as clicks
FROM tmp_tbl tl
WHERE filter='1990'
GROUP BY 1,2;

【讨论】:

嗯,我也想过,但我必须使用联合并使用外部选择语句聚合所有数据,如果我可以应用到我当前的结构,我会考虑这个。我还编辑了原始问题并添加了存储过程 嘿,伙计,我可以根据我的结构调整它并且它有效 - 非常感谢!赞成 @curiosityrock 很高兴听到这个消息。请更新您的帖子以显示您如何对其进行调整以使其正常工作,以便其他人在遇到此帖子时可以找到答案。

以上是关于如何在 Redshift 中的 select 语句中使用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 使用 \\ 卸载 SELECT 语句

如何知道 Redshift 查询返回的值的类型?

如何授予 Redshift 中所有模式的使用权限?

如何在 Redshift(亚马逊)中更新 UDF?

如何在 python udf 中使用 select 查询进行 redshift?

Redshift 是不是支持 SELECT 中的用户定义变量?