use*_*463 1 postgresql dynamic-sql google-bigquery
我有一个 google cloud postgres 实例,我正在尝试将架构中的所有表复制到单独的 google bigquery 表中,并使用运行联合查询的脚本,该脚本将安排在某个时间间隔运行。我正在使用 information_schema 中的数据,因为我希望脚本也能够选择新添加的表。
假设分析模式有 4 个表。
analytics.table1
analytics.table2
analytics.table3
analytics.table4
Run Code Online (Sandbox Code Playgroud)
下面的示例代码生成分析架构中所有表的列表,并将其设置为变量名称“table_name”。
DECLARE table_name ARRAY<STRING>;
SET table_name=(
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>",
"select table_schema||'.'||table_name as table_name from information_schema.tables
where table_schema='analytics';");
);
Run Code Online (Sandbox Code Playgroud)
我对该脚本的目的是使用以下查询创建四个单独的 bigquery 表
CREATE TABLE analytics.table1 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table1");
CREATE TABLE analytics.table2 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table2");
CREATE TABLE analytics.table3 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table3");
CREATE TABLE analytics.table4 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table4");
Run Code Online (Sandbox Code Playgroud)
循环遍历表“table_name”列表以使用单独的 sql 语句创建这些表的最佳方法是什么?
您可以尝试这个解决方案:
DECLARE TABLE_LIST ARRAY<STRING>;
DECLARE DSQL STRING;
DECLARE i INT64 DEFAULT 1;
DECLARE cnt INT64 DEFAULT 0;
SET TABLE_LIST = ARRAY(SELECT * FROM EXTERNAL_QUERY("connection-id", "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'analytics';"));
SET cnt = ARRAY_LENGTH(TABLE_LIST);
WHILE i <= cnt
DO
SET DSQL = '"SELECT * FROM analytics.' || TABLE_LIST[ORDINAL(i)] || '"';
EXECUTE IMMEDIATE 'CREATE TABLE analytics.' || TABLE_LIST[ORDINAL(i)] || ' AS SELECT * FROM EXTERNAL_QUERY("connection-id",' || DSQL || ');';
SET i = i + 1;
END WHILE;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |