Передача массивов в хранимую процедуру Redshift - PullRequest
0 голосов
/ 19 июня 2019

Я перевожу SQL (в настоящее время выполняется на Python) в хранимую процедуру Redshift, и по соображениям производительности я хотел бы, чтобы этот процесс запускался для списка кодов языков (например, EN, ES, DE)

Похоже, что хранящиеся в Redshift проки не поддерживают массивы / списки. Кто-нибудь из вас, милые люди, знает, как это сделать? Я заставил его работать, разделив строку и вставив ее во временную таблицу, но это выглядит немного грязно

Это не работает:

CREATE OR REPLACE PROCEDURE sp_del_me(batchid char(36), list_languages char(2)[])
AS $$
BEGIN

  TRUNCATE TABLE control.del_me;

  INSERT INTO control.del_me
  SELECT  sentimentbatchid
  FROM    control.sentiment_batch sb
  WHERE   batchuuid = batchid
  AND     ISOLanguageCode = ANY(list_languages);

END;
$$ LANGUAGE plpgsql;

Я получаю ошибку

Недопустимая операция: pg_catalog.bpchar [] не является поддерживаемым типом параметра для функций или процедур;

Это работает:

CREATE OR REPLACE PROCEDURE sp_del_me(batchid char(36), list_languages varchar(max))
AS $$
DECLARE
  num_langs INTEGER;
BEGIN

  CREATE TEMP TABLE IF NOT EXISTS tmp_languages(isolanguagecode char(2));
      -- GET THE NUMBER OF LANGUAGES WHICH IS EN OR EN,ES OR EN,ES,DE ETC
      -- SO WE ARE ASSUMING THERE ARE NO GAPS IN THE STRING AND ITS COMMA SEPARATED
      -- I.E. LENGTH OF STRING = 2 + 3 * (1-#LANGUAGES) WHICH, WITH BASIC ALGEBRA EVALUATES TO...
  num_langs := 1 + (len(list_languages) - 2)/3;

  TRUNCATE TABLE tmp_languages;

  FOR counter in 1..num_langs LOOP
    INSERT INTO tmp_languages
    SELECT split_part(list_languages, ',', counter);
  END LOOP;

  TRUNCATE TABLE control.del_me;

  INSERT INTO control.del_me
  SELECT  sentimentbatchid
  FROM    control.sentiment_batch sb
  INNER JOIN tmp_languages tl
    ON sb.isolanguagecode = tl.isolanguagecode
  WHERE   batchuuid = batchid;

END;
$$ LANGUAGE plpgsql;
...