【问题标题】:Pl/Pgsql, Passing array argument to INSERTPl/Pgsql,将数组参数传递给 INSERT
【发布时间】:2018-07-09 16:20:30
【问题描述】:

假设我有一个带有文本数组参数 TEXT[] 的函数。如果我执行 EXECUTE FORMAT INSERT,如何传递该数组的带引号的文本字符串以插入?

【问题讨论】:

  • 您需要提供当前代码和表定义。 edit 您的问题在 cmets 中发布代码

标签: postgresql plpgsql stored-functions


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多