Pl/Pgsql,将数组参数传递给 INSERT
Posted
技术标签:
【中文标题】Pl/Pgsql,将数组参数传递给 INSERT【英文标题】:Pl/Pgsql, Passing array argument to INSERT 【发布时间】:2018-07-09 16:20:30 【问题描述】:假设我有一个带有文本数组参数 TEXT[] 的函数。如果我执行 EXECUTE FORMAT INSERT,如何传递该数组的带引号的文本字符串以插入?
【问题讨论】:
您需要提供当前代码和表定义。 edit 您的问题不在 cmets 中发布代码 【参考方案1】:您应该使用USING
子句。动态 SQL 可以在通常的地方使用参数(非 SQL 标识符):
CREATE TABLE foo(a varchar[]);
CREATE OR REPLACE FUNCTION public.fx(tblname text, VARIADIC p character varying[])
RETURNS void LANGUAGE plpgsql AS $function$
BEGIN
EXECUTE format('insert into %I(a) VALUES($1)', tblname) USING p;
END;
$function$
SELECT fx('foo', 'Hi','Hello');
SELECT fx('foo', 'Hi','Hel''lo');
SELECT fx('foo', 'Hi','Hel"lo');
postgres=# SELECT * FROM foo;
┌────────────────┐
│ a │
╞════════════════╡
│ Hi,Hel'lo │
│ Hi,"Hel\"lo" │
│ Hi,Hello │
└────────────────┘
(3 rows)
【讨论】:
【参考方案2】:谢谢,我现在知道什么时候使用 using 和 format 了。这是我修改后的代码:
CREATE OR REPLACE FUNCTION add_property(catid INT, colname TEXT,
ty catalog_column_type, colval TEXT[])
RETURNS jsonb AS $$
DECLARE
tn TEXT;
BEGIN
--check table exists
SELECT tablename INTO tn FROM catalog WHERE catalogid=catid;
IF NOT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name=tn)
THEN
return jsonb_build_object('error','notable');
END IF;
--check if property exists for table
IF EXISTS(SELECT 1 FROM catalog_columns WHERE catalogid=catid AND
columnname=colname) THEN
return jsonb_build_object('error','exists');
END IF;
IF ty='INT'::catalog_column_type THEN
EXECUTE FORMAT ('ALTER TABLE %I ADD COLUMN %I INT',tn,colname);
ELSIF ty='TEXT'::catalog_column_type THEN
EXECUTE FORMAT ('ALTER TABLE %I ADD COLUMN %I TEXT',tn,colname);
ELSIF ty='ENUM'::catalog_column_type THEN
EXECUTE FORMAT ('ALTER TABLE %I ADD COLUMN %I INT',tn,colname);
ELSIF ty='BOOLEAN'::catalog_column_type THEN
EXECUTE FORMAT ('ALTER TABLE %I ADD COLUMN %I BOOLEAN',tn,colname);
END IF;
EXECUTE 'INSERT INTO catalog_columns (catalogid,columnname,'
|| 'columntype,columnnvalues) VALUES ($1,$2,$3,$4)' USING catid,colname,
ty,colval;
return jsonb_build_object('error','OK');
END;
$$ LANGUAGE plpgsql;
【讨论】:
以上是关于Pl/Pgsql,将数组参数传递给 INSERT的主要内容,如果未能解决你的问题,请参考以下文章