我正在 Bigquery 上创建一个存储过程,它接收表名作为输入并检查information_schema.COLUMNS
表以获取其列名和数据类型。
就我而言,我试图遍历每一列及其数据类型,检查类型是否为DATETIME
or TIMESTAMP
,将该列从 更改COLNAME
为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] == "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;
END IF;
END WHILE;
EXECUTE IMMEDIATE (
"""INSERT INTO `projectid.datasetname.tablename` VALUES ( """ || resultuantColumns || ");";
);
END;
我声明了一个元组columnDatatypes ARRAY<STRING, STRING>
来保存选择查询的结果,因为它返回两列:column_name
& data_type
。
这里的问题是我在声明两个元素的元组时遇到错误:
DECLARE columnDatatypes ARRAY<STRING, STRING>; 错误:语法错误:应为“>”,但在 [3:41] 得到“,”
当我循环遍历数组时,我在 WHILE 循环第二个 IF 条件中看到另一个错误,当基于它的偏移量访问数组的元素时。
WHILE i < ARRAY_LENGTH(primarykey) DO
IF(i = ARRAY_LENGTH(primarykey)-1) THEN
IF columnDatatypes[OFFSET(i), 1] == "TIMESTAMP" THEN
语法错误:预期为“)”,但在上面的 IF 条件中在 [11:40] 得到“]”(来自上述行的错误)
我尝试了不同的语法来创建元组,如下所示:
DECLARE columnDatatypes ARRAY<<STRING, STRING>>;
DECLARE columnDatatypes ARRAY<<STRING>, <STRING>>;
他们都说语法错误。我在这里搜索了 Google 的 GCP 文档,但没有参考元组声明和访问其中的元素。Bigquery 中是否有任何数据类型可以用作元组并通过索引位置访问其元素?
谁能让我知道我在这里犯了什么错误,我该如何纠正?