Plpgsql

將 SQL 查詢與變數結合起來

  • August 26, 2019

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||'''';

引用自:https://dba.stackexchange.com/questions/246257