Skip to main content
Version: 1.0.16

Functions & Stored Procedures

Halo database supports creating custom functions, aggregate functions, and stored procedures using PL/pgSQL.

Custom Functions

-- Basic function
CREATE FUNCTION add_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;

SELECT add_numbers(10, 20);

-- Function returning a record set
CREATE FUNCTION get_employees_by_salary(min_salary NUMERIC)
RETURNS TABLE(id INT, name TEXT, salary NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT e.id, e.name, e.salary
FROM employees e
WHERE e.salary >= min_salary
ORDER BY e.salary DESC;
END;
$$ LANGUAGE plpgsql;

Custom Aggregate Functions

-- Create state transition function
CREATE FUNCTION sum_sfunc(state NUMERIC, value NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
RETURN COALESCE(state, 0) + COALESCE(value, 0);
END;
$$ LANGUAGE plpgsql;

-- Create final calculation function
CREATE FUNCTION sum_ffunc(state NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
RETURN state;
END;
$$ LANGUAGE plpgsql;

-- Create aggregate function
CREATE AGGREGATE my_sum (NUMERIC) (
SFUNC = sum_sfunc,
STYPE = NUMERIC,
FINALFUNC = sum_ffunc,
INITCOND = '0'
);

Stored Procedures

CREATE PROCEDURE transfer_funds(
from_account INT,
to_account INT,
amount NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE accounts SET balance = balance - amount WHERE id = from_account;
UPDATE accounts SET balance = balance + amount WHERE id = to_account;
COMMIT;
END;
$$;

-- Call the stored procedure
CALL transfer_funds(1, 2, 500.00);

Trigger Functions

-- Create trigger function
CREATE FUNCTION log_update() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log(table_name, operation, changed_at)
VALUES (TG_TABLE_NAME, TG_OP, NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Bind trigger
CREATE TRIGGER trg_log_update
AFTER UPDATE ON employees
FOR EACH ROW EXECUTE FUNCTION log_update();