stored-procedures - 从作为输入传递给存储过程 Snowflake 的表数组创建主视图
问题描述
我想创建一个主视图,将所有作为输入传递给雪花存储过程的表结合起来。请帮助了解如何为此构建代码。
创建或替换过程 TEST_PROC("SRC_DB" VARCHAR(30), "SRC_SCHEMA" VARCHAR(30), "TGT_DB" VARCHAR(30), "TGT_SCHEMA" VARCHAR(30))
RETURNS varchar
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
as
$$
var result = '';
var tab = 'TABLE1,TABLE2'
var get_tables = `
with cte as(select value from table(SPLIT_TO_TABLE
(('${tab}'),','))
) select value from cte;`
var tables_name_master=snowflake.execute ({sqlText: get_tables});
var lcols_agg = '';
while(tables_name_master.next()){
var table_value = tables_name_master.getColumnValue(1);
var column_list = `
WITH cte2 as (select COLUMN_NAME , listagg(TABLE_NAME, ', ')
within group (order by COLUMN_NAME) A
from ${SRC_DB}.information_schema.COLUMNS
where TABLE_SCHEMA= '${SRC_SCHEMA}' and TABLE_NAME in (select
value from table(SPLIT_TO_TABLE (('${tab}'),',')))
group by COLUMN_NAME order by COLUMN_NAME
),
cte3 as (select 'x' x, COLUMN_NAME,iff(contains(A,'${table_value}'),COLUMN_NAME,CONCAT('NULL AS \"',COLUMN_NAME,'\"')) valuess from cte2 order by COLUMN_NAME
)select listagg(valuess,',') final FROM cte3 GROUP BY x
`;
var rs = snowflake.execute({ sqlText: column_list });
while(rs.next()){
lcols_agg += "SELECT " + rs.getColumnValue(1) + " FROM "+ SRC_DB+"."+SRC_SCHEMA+"."+tables_name_master.getColumnValue(1) + "\n" +"UNION " +"\n"
}
}
var count1 = 0 ;
count1 = lcols_agg.length
result = lcols_agg.substring(0,(count1-7));
const create_union_view = `
create or replace view abcd AS ${result}
;`
var view_create = snowflake.execute({ sqlText: create_union_view });
view_create.next()
return result
$$
;
call SP_TEST('ABC','DEF','PQR','STU');
THis generates my final view statement as
CREATE OR REPLACE VIEW ABCD AS
COL1,COL2,COL3
UNION
NULL AS "COL2",NULL AS "COL3",COL1
Now due to mismatch of order od columns in union the view is throwing error while we do select * from abcd, any way we can have the columns of both tables in same order or any other work around?
解决方案
您需要在 cte3 表达式之后按函数 listagg 排序:
代替
select listagg(valuess,',') final FROM cte3 GROUP BY x
将其更改为:
select listagg(valuess,',') within group (order by valuess) final FROM cte3 GROUP BY x
看看这是否有助于解决订单问题。
推荐阅读
- linux - 重启后linux内核中消失的dentries
- swift - 如何为 iOS 12 及更低版本启用深色主题
- snowflake-cloud-data-platform - 在 Fargate 中运行时的雪花输出
- java - Spring Boot Model Class 仅在使用 Synonym 时访问 Oracle 表
- javascript - useCallback 函数返回的闭包内的 setState() 没有更新状态
- mysql - 搜索 json 值并在 mysql 中替换它的最优雅的方法?
- protractor - tsconfig ComplilerOptions 模块:“esnext”导致 SyntaxError:无法在模块外使用 import 语句
- java - 如何从 Maven 构建中排除一些 *.java 文件?
- html - 在角度中找不到搜索结果时如何隐藏某些内容
- .net - 英孚父母/子女关系