Я перевожу 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;