मैंने इसे refcursor
. के साथ किया यदि आप आउटपुट कॉलम सूची पूरी तरह से गतिशील चाहते हैं:
CREATE OR REPLACE FUNCTION is_record_exists(tablename character varying, columns character varying[], keepcolumns character varying[] DEFAULT NULL::character varying[])
RETURNS SETOF refcursor AS
$BODY$
DECLARE
ref refcursor;
keepColumnsList text;
columnsList text;
valuesList text;
existQuery text;
keepQuery text;
BEGIN
IF keepcolumns IS NOT NULL AND array_length(keepColumns, 1) > 0 THEN
keepColumnsList := array_to_string(keepColumns, ', ');
ELSE
keepColumnsList := 'COUNT(*)';
END IF;
columnsList := (SELECT array_to_string(array_agg(name || ' = ' || value), ' OR ') FROM
(SELECT unnest(columns[1:1]) AS name, unnest(columns[2:2]) AS value) pair);
existQuery := 'SELECT ' || keepColumnsList || ' FROM ' || tableName || ' WHERE ' || columnsList;
RAISE NOTICE 'Exist query: %', existQuery;
OPEN ref FOR EXECUTE
existQuery;
RETURN next ref;
END;$BODY$
LANGUAGE plpgsql;
फिर FETCH ALL IN
. पर कॉल करने की जरूरत है परिणाम प्राप्त करने के लिए। विस्तृत सिंटैक्स यहां
या वहाँ:https://stackoverflow.com/a/12483222/630169
. ऐसा लगता है कि यह अभी के लिए एकमात्र रास्ता है। आशा है कि PostgreSQL 11 में PROCEDURES के साथ कुछ बदला जाएगा।