如何在存储函数中使用 select 和传递参数的组合进行插入

How to make an insert with a combination of a select and passed parameters in a stored function

我有两个table,例如:

    CREATE TABLE table_1
    (
        one_column   INTEGER,
        two_column   INTEGER,
        three_column INTEGER
);

    CREATE TABLE table_2
    (
        id        SERIAL,
        column_1  INTEGER,
        column_2  INTEGER,
        column_3  INTEGER,
        name      TEXT,
        step      INTEGER
);

我有一个接收多个参数的存储函数。在该函数中,我需要使用 SELECT 和两个函数参数的结果的(动态?)组合将 INSERT 行转换为 table。目前我有类似于以下伪代码的东西...

CREATE OR REPLACE FUNCTION function_p (
    p_id       INTEGER,
    p_name     TEXT    DEFAULT '',
    p_step     INTEGER DEFAULT NULL
    )
RETURNS VOID AS $$
BEGIN
    INSERT INTO table_2 (
        column_1,
        column_2,
        column_3,
        p_name,
        p_step
        )
        SELECT
            one_column,
            two_column,
            three_column
            FROM table_1
            WHERE id = p_id;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

INSERT 应该更像这样吗?

    INSERT INTO table_2 (
        column_1,
        column_2,
        column_3,
        name,
        step
        )
        (SELECT
            one_column,
            two_column,
            three_column
            FROM table_1
            WHERE id = p_id),
        p_name,
        p_step;

使用format创建插入语句。此外,您可能需要一个程序,例如

CREATE OR REPLACE PROCEDURE function_p (
    p_name TEXT DEFAULT '',
    p_step INT DEFAULT NULL
    )
LANGUAGE plpgsql AS $$
BEGIN
  EXECUTE format('
    INSERT INTO table_2 (column_1,column_2,column_3,name,step)
    SELECT one_column, two_column,three_column,%L,%s
    FROM table_1',p_name,p_step);   
END;
$$

请记住,INSERT 语句中使用的列号(和类型)必须与来自 SELECT.

的列号相匹配

演示:db<>fiddle