Plpgsql
將 SQL 查詢與變數結合起來
Redshift 支持通過執行此 SQL 查詢將數據導出到 CSV。
unload ('select * from bhuvi') to 's3://bhuvi-bucket/folder//user-data.csv' iam_role 'arn:aws:iam::1111111:role/myredshiftrole' delimiter '|' GZIP";
我有不同的表,需要將它們導出到不同的位置。所以我有一個如下所示的儲存過程。所以我以後可以在變數中傳遞位置。
CREATE OR REPLACE PROCEDURE test_variable() LANGUAGE plpgsql AS $$ DECLARE sql text; s3_loc text; role text; deli text; query text; BEGIN sql:='select * from bhuvi'; s3_loc:='s3://bhuvi-bucket/folder/'; role:='arn:aws:iam::1111111:role/myredshiftrole'; deli:='|'; query := "unload (sql) to 's3_loc/user-data.csv' iam_role 'role'; execute query; END $$;
但在某處語法是錯誤的。我找不到那個。當我呼叫此過程時,我收到以下錯誤。
test=# call test_variable(); ERROR: column "unload (sql) to 's3_loc/user-data.csv' iam_role 'role' " does not exist CONTEXT: SQL statement "SELECT "unload (sql) to 's3_loc/user-data.csv' iam_role 'role' "" PL/pgSQL function "test_variable" line 12 at assignment test=#
您不能對字元串文字使用雙引號。在字元串文字中包含單引號,必須通過將它們加倍來進行轉義:
query := 'unload (sql) to ''s3_loc/user-data.csv'' iam_role ''role''';
此外,不能在 SQL 字元串中使用來自 PL/pgSQL 的變數名稱。您需要在建構的查詢字元串中包含該變數的內容:
query := 'unload ('||sql||') to '''||s3_loc||'/user-data.csv'' iam_role '''||role||'''';