1

Say I have a function with a text array parameter TEXT[]. If I do a EXECUTE FORMAT INSERT, how do I pass a quoted text string of that array to insert?

1
  • 1
    You need to provide your current code and your table definitions. edit your question do not post code in comments Commented Jul 9, 2018 at 16:41

2 Answers 2

1

You should to use USING clause. The dynamic SQL can use a parameters on usual places (non SQL identifiers):

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)
Sign up to request clarification or add additional context in comments.

Comments

0

Thank you, I now know when to use using, and format. Here's my revised code:

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;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.