Eu quero criar uma função para criar uma tabela com uma estrutura específica passando parte do nome da tabela como argumento para que o nome da tabela seja t_ . Semelhante a isto:
CREATE OR REPLACE FUNCTION create_table_type1(t_name VARCHAR(30)) RETURNS VOID AS $$
BEGIN
EXECUTE "CREATE TABLE IF NOT EXISTS t_"|| t_name ||"
(
id SERIAL,
customerid INT,
daterecorded DATE,
value DOUBLE PRECISION,
PRIMARY KEY (id)
)"
END
$$ LANGUAGE plpgsql
Então chame assim:
SELECT create_table_type1('one');
É possível?
A resposta é sim . :)
Estou usando
format()
with%I
para limpar o nome da tabela e evitar a injeção de SQL. Requer PostgreSQL 9.1 ou superior.Certifique-se de usar aspas simples (
''
) para dados. Aspas duplas (""
) são para identificadores em SQL.sim, isso é possível. no entanto, você tem que ter um pouco de cuidado. DDLs em um procedimento armazenado geralmente funcionam. em alguns casos desagradáveis, você pode acabar com erros de "pesquisa de cache". A razão é que um procedimento é basicamente uma parte de uma instrução e modificar esses objetos do sistema em tempo real pode, em casos raros, causar erros (tem que ser). No entanto, isso não pode acontecer com CREATE TABLE. Então, você deve estar seguro.