1

information_schema.COLUMNSテーブル名を入力として受け取り、テーブルをチェックして列名とデータ型を取得するストアド プロシージャを Bigquery で作成しています。

私の場合、各列とそのデータ型をループして、型が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>という 2 つの列を返すため、select クエリの結果を保持するタプルを宣言しました。column_namedata_type

ここでの問題は、2 つの要素のタプルを宣言する行でエラーに直面していることです。

DECLARE columnDatatypes ARRAY<STRING, STRING>; エラー: 構文エラー: ">" が予期されていましたが、[3:41] に "," がありました

また、配列をループしているときに、オフセットに基づいて配列の要素にアクセスすると、WHILE ループの 2 番目の 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