Ich entwickle ein Framework, das dynamisch Tabellen für die Speicherung von Inhalten auf PostgreSQL 9.1 erstellt. Eine der API-Funktionen ermöglicht dem Aufrufer das Speichern eines neuen Inhaltseintrags durch Angabe aller Felder innerhalb eines bestimmten Objekts (z. B. Webformular). Um eine Reihe von Feldern zu erhalten, erstellt Framework einen zusammengesetzten Typ.Ist es möglich, explizite Umwandlungen für zusammengesetzte Typen in plpgsql-Funktionen zu vermeiden?
Betrachten Sie den folgenden Code ein:
CREATE SEQUENCE seq_contents MINVALUE 10000;
CREATE TABLE contents (
content_id int8 not null,
is_edited boolean not null default false,
is_published boolean not null default false,
"Input1" varchar(60),
"CheckBox1" int2,
"TheBox" varchar(60),
"Slider1" varchar(60)
);
CREATE TYPE "contentsType" AS (
"Input1" varchar(60),
"CheckBox1" int2,
"TheBox" varchar(60),
"Slider1" varchar(60)
);
CREATE OR REPLACE FUNCTION push(in_all anyelement) RETURNS int8 AS $push$
DECLARE
_c_id int8;
BEGIN
SELECT nextval('seq_contents') INTO _c_id;
EXECUTE $$INSERT INTO contents
SELECT a.*, b.*
FROM (SELECT $1, true, false) AS a,
(SELECT $2.*) AS b$$ USING _c_id, in_all;
RETURN _c_id;
END;
$push$ LANGUAGE plpgsql;
Nun, um diese Funktion ich so explizite Umwandlung, hinzufügen müssen, rufen:
SELECT push(('input1',1,'thebox','slider1')::"contentsType");
Gibt es eine Möglichkeit explizite Umwandlung zu vermeiden? Da ich möchte, dass externe Anrufer sich nicht mit Umwandlungen befassen, d. H. Die Logik hinter den PostgreSQL-Funktionen verbergen. Zur Zeit habe ich einen solchen Fehler:
SELECT push(('input1',1,'thebox','slider1'));
ERROR: PL/pgSQL functions cannot accept type record
CONTEXT: compilation of PL/pgSQL function "push" near line 1
Basierend auf dem Fehler 'PL/pgSQL Funktionen können Typ record nicht annehmen 'nehme ich an, dass dies PL/pgSQL Problem ist. Also könnte eine der Optionen diese Funktion in C machen. – vyegorov