PostgreSQL Functions
Functions for retrieving return types and input parameters from PostgreSQL procedures.
wizards.getreturntypes
Retrieves return types of functions within a schema, breaking down TABLE return types into individual columns.
Function Definition
CREATE OR REPLACE FUNCTION wizards.getreturntypes(input_schemaname text)
RETURNS TABLE(
schemaname_ text,
functionname_ text,
returncolumnname_ text,
returncolumntype_ text
) AS $$
DECLARE
funcname text;
returntype text;
column_definition text;
column_name text;
column_type text;
BEGIN
FOR funcname, returntype IN
SELECT p.proname, pg_catalog.pg_get_function_result(p.oid)
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = input_schemaname
LOOP
IF returntype LIKE 'TABLE%' THEN
returntype := substr(returntype, 7, length(returntype) - 7);
returntype := substr(returntype, 1, length(returntype) - 1);
FOR column_definition IN
SELECT unnest(string_to_array(returntype, ','))
LOOP
column_definition := trim(column_definition);
column_name := trim(split_part(column_definition, ' ', 1));
column_type := trim(split_part(column_definition, ' ', 2));
schemaname_ := input_schemaname;
functionname_ := funcname;
returncolumnname_ := column_name;
returncolumntype_ := column_type;
RETURN NEXT;
END LOOP;
ELSE
schemaname_ := input_schemaname;
functionname_ := funcname;
returncolumnname_ := NULL;
returncolumntype_ := returntype;
RETURN NEXT;
END IF;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Process
- Extract function names and return types using
pg_get_function_result - Check if return type is TABLE
- Remove TABLE( prefix and trailing )
- Split column definitions using
string_to_arrayandunnest - Parse each column into name and type
wizards.getinputparams
Retrieves input parameters of functions within a schema.
Function Definition
CREATE OR REPLACE FUNCTION wizards.getinputparams(input_schemaname text)
RETURNS TABLE(
schemaname_ text,
functionname_ text,
paramname_ text,
paramtype_ text
) AS $$
DECLARE
funcname text;
paramstring text;
param_definition text;
param_name text;
param_type text;
BEGIN
FOR funcname, paramstring IN
SELECT p.proname, pg_catalog.pg_get_function_arguments(p.oid)
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = input_schemaname
LOOP
FOR param_definition IN
SELECT unnest(string_to_array(paramstring, ','))
LOOP
param_definition := trim(param_definition);
IF position(' ' IN param_definition) > 0 THEN
param_name := trim(split_part(param_definition, ' ', 1));
param_type := trim(split_part(param_definition, ' ', 2));
ELSE
param_name := NULL;
param_type := trim(param_definition);
END IF;
schemaname_ := input_schemaname;
functionname_ := funcname;
paramname_ := param_name;
paramtype_ := param_type;
RETURN NEXT;
END LOOP;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Process
- Extract function names and parameters using
pg_get_function_arguments - Split parameter string into individual parameters
- Parse each parameter into name and type
- Handle unnamed parameters (type only)
Notes on String Manipulation
The functions use substr instead of regular expressions to handle TABLE return types. This avoids issues with unbalanced parentheses that can occur with regex patterns like ^TABLE\((.*)\)$.