问题描述
我正在 Bigquery 上创建一个存储过程,它接收一个表名作为输入并检查 information_schema.COLUMNS
表以获取其列名和数据类型。
就我而言,我试图遍历每一列及其数据类型,检查类型是 DATETIME
还是 TIMESTAMP
,将该列从 COLNAME
更改为 {{1} }.
我将列的每个结果连接成一个字符串,最终看起来像从参数接收到的表上的选择查询。
为了做这个活动,我写了下面的存储过程:
CAST(COLNAME AS TIMESTAMP/DATETIME) as COLNAME
我声明了一个元组 CREATE OR REPLACE PROCEDURE `projectid`.datasetname.conversion (tablename String,stagingdb String,basedb String)
BEGIN
DECLARE columnDatatypes ARRAY<STRING,STRING>;
DECLARE resultuantColumns STRING;
DECLARE i INT64 DEFAULT 0;
EXECUTE IMMEDIATE (
"select column_name,data_type from default_dataset.informatION_SCHEMA.COLUMNS where TABLE_NAME=`"||tablename||"`"
) INTO columnDatatypes;
WHILE i < ARRAY_LENGTH(primarykey) DO
IF(i = ARRAY_LENGTH(primarykey)-1) THEN
IF columnDatatypes[OFFSET(i),1] == "TIMESTAMP" THEN
SET resultuantColumns = resultuantColumns || "CAST(" || columnDatatypes[OFFSET(i),0] || " as TIMESTAMP) as "" || columnDatatypes[OFFSET(i),1];
SET i = i + 1;
ELSEIF columnDatatypes[OFFSET(i),1] == "DATETIME" THEN
SET resultuantColumns = resultuantColumns || "CAST(" || columnDatatypes[OFFSET(i),0] || " as DATETIME) as "" || columnDatatypes[OFFSET(i),1];
SET i = i + 1;
ELSE
SET resultuantColumns = resultuantColumns || columnDatatypes[OFFSET(i),0];
SET i = i + 1;
END IF;
ELSE
IF columnDatatypes[OFFSET(i),1] || ",";
SET i = i + 1;
ELSEIF columnDatatypes[OFFSET(i),1] == "DATETIME" THEN
SET resultuantColumns = resultuantColumns || "CAST(" || columnDatatypes[OFFSET(i),";
SET i = i + 1;
ELSE
SET resultuantColumns = resultuantColumns || columnDatatypes[OFFSET(i),0] || ",";
SET i = i + 1;
END IF;
END IF;
END WHILE;
EXECUTE IMMEDIATE (
"""INSERT INTO `projectid.datasetname.tablename` VALUES ( """ || resultuantColumns || ");";
);
END;
来保存选择查询的结果,因为它返回两列:columnDatatypes ARRAY<STRING,STRING>
& column_name
。
DECLARE columnDatatypes ARRAY
当我循环遍历数组时,在基于偏移量访问数组元素时,我看到 WHILE 循环第二个 IF 条件中的另一个错误。
data_type
语法错误:在上面的 IF 条件中,预期为 ")" 但在 [11:40] 处得到了 "]"(来自上一行的错误)
我尝试了不同的语法来创建元组,如下所示:
WHILE i < ARRAY_LENGTH(primarykey) DO
IF(i = ARRAY_LENGTH(primarykey)-1) THEN
IF columnDatatypes[OFFSET(i),1] == "TIMESTAMP" THEN
他们都说语法错误。 我在这里搜索了 Google 的 GCP 文档,但没有关于元组声明和访问其中的元素的参考。 Bigquery 中是否有任何数据类型可以用作元组并按索引位置访问其元素?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)