将动态参数传递给函数

时间:2017-05-16 16:01:37

标签: postgresql

我需要将动态数量的参数传递给函数及其数据类型,然后返回一个将这些参数作为字段的表。 这有可能在postgres中做到吗? 感谢任何想法或例子

1 个答案:

答案 0 :(得分:0)

这是一个可能会改进的例子。

小心SQL注入!

CREATE OR REPLACE FUNCTION create_table(
   tabname text,
   VARIADIC coldef text[]
) RETURNS void
   LANGUAGE plpgsql STRICT AS
$$DECLARE
   l integer;
   i integer;
   sql text;
   sep text := '';
BEGIN
   l := array_upper(coldef, 1);

   IF l % 2 <> 0 THEN
      RAISE EXCEPTION 'Number of arguments must be odd';
   END IF;

   sql := 'CREATE TABLE ' || quote_ident(tabname) || '(';

   FOR i IN 1 .. l/2 LOOP
      sql := sql || sep || quote_ident(coldef[2*i-1]) || ' ' || quote_ident(coldef[2*i]);
      sep := ', ';
   END LOOP;

   sql := sql || ')';

   EXECUTE sql;
END;$$;

可以像这样使用:

test=> SELECT create_table('tabname', 'col1', 'int4', 'col2', 'text');

test=> \d tabname
    Table "laurenz.tabname"
┌────────┬─────────┬───────────┐
│ Column │  Type   │ Modifiers │
├────────┼─────────┼───────────┤
│ col1   │ integer │           │
│ col2   │ text    │           │
└────────┴─────────┴───────────┘