从另一个表中获取表名,并在Redshift中对其进行查询



我想从一个表名中选择所有数据,其中表名每次都需要从另一个表中提取。

select * from (select max(table_name) from tableA)

我正在尝试为它编写存储过程。以下是语法。

CREATE OR REPLACE PROCEDURE db.stproced() AS $$
declare tablename VARCHAR(200);
BEGIN
select max(table_name) into tableA from easybuy.current_portfolio_table_name;
EXECUTE 'select * from ' || tablename || ' ;'
RETURN;
END;
$$ LANGUAGE plpgsql;

CALL easybuy.stproced();   

上面的代码执行良好,但没有打印应该来自EXECUTE语句的记录。

这不能像您的示例那样在普通SQL中完成。这是因为查询是编译的,表目标需要知道编译。

这导致需要2个SQL语句来执行此操作。正如您所提到的,存储过程可以运行许多SQL语句,因此这是一个好主意。在许多情况下,这将起作用,除非存储过程无法从JDBC/ODBC连接(AFAIK(中产生数据。存储过程可以用结果填充表,也可以填充光标,但在这两种情况下,您都需要选择或提取才能在工作台中看到这些结果。再次,您需要2条语句——执行存储过程和获取结果(select或fetch(。

你可以在Redshift周围设置一个包装器;特别的";命令,并将其映射到2 SQL语句,否则只传递SQL。这是可行的,而且有可用的工具可以这样工作。

有些工作台能够配置宏,您可以映射这些宏来执行有问题的2条语句。这可能是一条需要调查的路线。

如果你解释了你试图解决的首要问题,那么可能还有其他途径可以实现这一目标。

==============================================

添加将执行所需操作的存储过程示例。

首先让我们设置一些伪表:

create table test1 (tname varchar(16));
insert into test1 values
('test2'),
('b123'),
('c123');
create table test2 (UUID varchar(16), Key varchar(16), Value varchar(16));
insert into test2 values
('a123', 'Key1', 'Val1'),
('b123', 'Key2', 'Val2'),
('c123', 'Key3', 'Val3');

接下来我们创建存储过程:

CREATE OR REPLACE procedure indirect_table(curs1 INOUT refcursor)
AS
$$
DECLARE 
row record;
BEGIN
select into row max(tname) as tname from test1;
OPEN curs1 for EXECUTE 'select * from ' || row.tname || ';';
END;
$$ LANGUAGE plpgsql;

一个快速解释程序-此过程首先将游标的名称作为参数,并定义用于存储查询结果的记录。表test1中的最大表名存储在该记录中。该记录用于构造一个查询,该查询在FROM子句中使用该记录的值。这个构造的查询运行到一个游标中,结果在该游标中等待获取请求。

因此,最后一步是调用过程并获取结果。这些是保存(提交(过程后脚本中所需的唯一步骤。

call indirect_table('mycursor');
fetch all mycursor;

这将在用户工作台上产生所需的输出。(注意,在单个节点集群上不支持"提取全部",在这种情况下需要"提取1000"。(

最新更新