information_schema.COLUMNS
テーブル名を入力として受け取り、テーブルをチェックして列名とデータ型を取得するストアド プロシージャを Bigquery で作成しています。
私の場合、各列とそのデータ型をループして、型が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>
という 2 つの列を返すため、select クエリの結果を保持するタプルを宣言しました。column_name
data_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 のデータ型はありますか?
私がここでやっている間違いは何ですか、どうすれば修正できますか?