1

我正在 Bigquery 上创建一个存储过程,它接收表名作为输入并检查information_schema.COLUMNS表以获取其列名和数据类型。

就我而言,我试图遍历每一列及其数据类型,检查类型是否为DATETIMEor TIMESTAMP,将该列从 更改COLNAMECAST(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 中是否有任何数据类型可以用作元组并通过索引位置访问其元素?

谁能让我知道我在这里犯了什么错误,我该如何纠正?

4

0 回答 0