Автоматическое разбиение таблицы -PostgreSQL- ОШИБКА: слишком мало аргументов для формата () - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь автоматически разбить мою таблицу oltpsales, используя функцию ниже и триггер ниже, но затем я пытаюсь выполнить вставку в таблицу, я получаю код ошибки ниже. Я ссылался на несколько потоков ниже, и предложения приветствуются.

INSERT с динамическим именем таблицы в функции триггера

Строка формата Postgres с использованием массива

ОШИБКА: слишком мало аргументов для формата () КОНТЕКСТ: функция PL / pgSQL testoltpsales_insert_function () строка 17 в EXECUTE

 CREATE TRIGGER testoltpsales_insert_trg
    BEFORE INSERT ON myschema."testoltpsales"
    FOR EACH ROW EXECUTE PROCEDURE testoltpsales_insert_function();
CREATE OR REPLACE FUNCTION testoltpsales_insert_function()
RETURNS TRIGGER AS $$
DECLARE
    partition_date TEXT;
    partition_name TEXT;
    start_of_month TEXT;
    end_of_next_month TEXT;
BEGIN
    partition_date := to_char(NEW."CreateDateTime",'YYYY_MM');
    partition_name := 'testoltpsaless_' || partition_date;
    start_of_month := to_char((NEW."CreateDateTime"),'YYYY-MM') || '-01';
    end_of_next_month := to_char((NEW."CreateDateTime" + interval '1 month'),'YYYY-MM') || '-01';
IF NOT EXISTS
    (SELECT 1
     FROM   information_schema.tables 
     WHERE  table_name = partition_name) 
THEN
    EXECUTE format(E'CREATE TABLE %I (CHECK ( date_trunc(\'day\', %I.CreateDateTime) >= ''%s'' AND date_trunc(\'day\', %I.CreateDateTime) < ''%s'')) INHERITS (myschema."Testoltpsaless")', 
    VARIADIC ARRAY [partition_name, start_of_month,end_of_next_month]);

    RAISE NOTICE 'A partition has been created %', partition_name;

    -- EXECUTE format('GRANT SELECT ON TABLE %I TO readonly', partition_name); -- use this if you use role based permission
END IF;
    EXECUTE format('INSERT INTO %I ("OwnerId","DaddyTable","SaleId","RunId","CreateDateTime","SalesetId","Result","Score","NumberOfMatches" ) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9)', partition_name) 
    USING NEW."OwnerId",NEW."DaddyTable",NEW."SaleId",NEW."RunId",NEW."CreateDateTime",NEW."SalesetId",NEW."Result",NEW."Score",NEW."NumberOfMatches";

RETURN NULL;
END
$$
LANGUAGE plpgsql;

1 Ответ

1 голос
/ 03 октября 2019
    EXECUTE format(E'CREATE TABLE %I (CHECK ( date_trunc(\'day\', %I.CreateDateTime) >= ''%s'' AND date_trunc(\'day\',
%I.CreateDateTime) < ''%s'')) INHERITS (myschema."Testoltpsaless")', 
    VARIADIC ARRAY [partition_name, start_of_month,end_of_next_month]); ```

В строке формата есть пять спецификаторов формата, но вы передаете ей только три аргумента. Если вы не используете позиционное форматирование, например, %1$I, вы должны указать такое же количество аргументов, как они используются последовательно.

https://www.postgresql.org/docs/current/functions-string.html#FUNCTIONS-STRING-FORMAT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...