CREATE OR REPLACE FUNCTION insert_data(tablename TEXT, rows INT)
RETURNS INT AS $$
DECLARE
i INT := 0;
BEGIN
WHILE i < rows LOOP
EXECUTE 'INSERT INTO ' || tablename || ' (id, col1, col2) VALUES ($1, $2, $3)' USING i, 'value' || i, 'value' || i;
i := i + 1;
END LOOP;
RETURN i;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE mytable (id SERIAL PRIMARY KEY, col1 TEXT, col2 TEXT);
SELECT insert_data('mytable', 1000000);
优化#1
可以将创建表的语句添加到该函数中,以确保如果指定的表不存在,则会自动创建该表。
以下是修改后的函数代码:
CREATE OR REPLACE FUNCTION insert_data1(tablename TEXT, rows INT)
RETURNS INT AS $$
DECLARE
i INT := 0;
BEGIN
-- 如果指定的表不存在,则创建它
EXECUTE 'CREATE TABLE IF NOT EXISTS ' || tablename || ' (id SERIAL PRIMARY KEY, col1 TEXT, col2 TEXT)';
WHILE i < rows LOOP
EXECUTE 'INSERT INTO ' || tablename || ' (id, col1, col2) VALUES ($1, $2, $3)' USING i, 'value' || i, 'value' || i;
i := i + 1;
END LOOP;
RETURN i;
END;
$$ LANGUAGE plpgsql;
在该函数中,我们增加了一个 EXECUTE 语句,用于检查指定的表是否存在。如果不存在,则会创建该表。这样,在调用该函数时,无需手动创建表。
需要注意的是,如果要向表中插入的数据有特殊字符(例如引号、反斜杠等),则需要对这些特殊字符进行转义,以避免 SQL 注入攻击。可以使用 openGauss 提供的 QUOTE_IDENT 和 QUOTE_LITERAL 函数来执行此操作。例如:
EXECUTE 'INSERT INTO ' || QUOTE_IDENT(tablename) || ' (id, col1, col2) VALUES ($1, $2, $3)'
USING i, QUOTE_LITERAL('value' || i), QUOTE_LITERAL('value' || i);
这个命令会转义表名和列值,以确保 SQL 查询不会受到恶意输入的影响。