Использовать подготовленный оператор или динамическую команду в хранимой процедуре Postgresql? - PullRequest
0 голосов
/ 10 мая 2019

Я изучаю Postgreslq, и у меня есть вопрос об этом примере кода:

CREATE OR REPLACE PROCEDURE CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT)
LANGUAGE plpgsql
AS $$
BEGIN
--     PREPARE addProject (VARCHAR(45),SMALLINT) AS
--     INSERT INTO projects (projectName, year) VALUES ($1, $2);
--     EXECUTE addProject(projectName, projectYear );

    EXECUTE 'INSERT INTO projects (projectName, year) VALUES ($1, $2)'
    USING projectName,projectYear;
END $$;

Я пытаюсь написать хранимую процедуру, которая была бы безопасна от внедрения SQL. Исходя из Mysql, я знаю, что мне придется использовать подготовленное заявление с параметрами. Здесь, в Postgresql, он не позволяет (закомментированный код), с другой стороны, если я использую динамическую команду, это работает. Может ли кто-нибудь объяснить, почему в такой ситуации нельзя использовать подготовленное утверждение?

1 Ответ

2 голосов
/ 10 мая 2019

Планы выполнения готовятся и кэшируются для PL / PgSQL, это происходит автоматически.Таким образом, нет необходимости использовать PREPARE внутри PL / PGSQL (как вы видели, вы не можете) для оптимизации.

Внедрение SQL возможно, если вы используете динамические аргументы и используете конкатенацию для их добавления вместо параметризации.Однако, поскольку вы запускаете простую вставку без динамических столбцов / таблиц, EXECUTE не требуется.

CREATE OR REPLACE procedure CreateProject(
   IN projectName  VARCHAR(45),
   IN projectYear  SMALLINT  )
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO projects (projectName, year) VALUES ($1, $2);
END $$;

DEMO

...