Created
June 2, 2025 19:47
-
-
Save joelonsql/ae3a5863e305661f1e58fc8b6f09e180 to your computer and use it in GitHub Desktop.
Demo showing some differences between sql vs plpgsql PostgreSQL functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- | |
-- sql function demo | |
-- | |
CREATE TABLE example_table | |
( | |
id INT NOT NULL, | |
name TEXT NOT NULL, | |
PRIMARY KEY (id) | |
); | |
INSERT INTO example_table (id, name) VALUES (1, 'Adam'); | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
BEGIN ATOMIC | |
SELECT t.name FROM example_table_mispelled t WHERE t.id = get_name.id; | |
END; | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
BEGIN ATOMIC | |
SELECT t.name FROM example_table t WHERE t.id = get_name.id; | |
END; | |
DROP TABLE example_table; | |
DROP TABLE example_table CASCADE; -- force dropping | |
-- | |
-- plpgsql function demo | |
-- | |
CREATE TABLE example_table | |
( | |
id INT NOT NULL, | |
name TEXT NOT NULL, | |
PRIMARY KEY (id) | |
); | |
INSERT INTO example_table (id, name) VALUES (1, 'Adam'); | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
LANGUAGE plpgsql | |
AS $$ | |
BEGIN | |
RETURN (SELECT t.name FROM example_table_mispelled t WHERE t.id = get_name.id); | |
END; | |
$$; | |
-- no compile-time error | |
SELECT get_name(1); | |
-- run-time error | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
LANGUAGE plpgsql | |
AS $$ | |
BEGIN | |
RETURN (SELECT t.name FROM example_table t WHERE t.id = get_name.id); | |
END; | |
$$; | |
SELECT get_name(1); | |
DROP TABLE example_table; | |
-- no error | |
SELECT get_name(1); | |
-- run-time error | |
/* | |
joel@Joels-MacBook-Pro ~ % psql -a -f ~/example.sql | |
-- set client_min_messages = log; | |
-- set debug_print_parse to on; | |
-- | |
-- sql function demo | |
-- | |
CREATE TABLE example_table | |
( | |
id INT NOT NULL, | |
name TEXT NOT NULL, | |
PRIMARY KEY (id) | |
); | |
CREATE TABLE | |
INSERT INTO example_table (id, name) VALUES (1, 'Adam'); | |
INSERT 0 1 | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
BEGIN ATOMIC | |
SELECT t.name FROM example_table_mispelled t WHERE t.id = get_name.id; | |
END; | |
psql:/Users/joel/example.sql:18: ERROR: relation "example_table_mispelled" does not exist | |
LINE 4: SELECT t.name FROM example_table_mispelled t WHERE t.id ... | |
^ | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
BEGIN ATOMIC | |
SELECT t.name FROM example_table t WHERE t.id = get_name.id; | |
END; | |
CREATE FUNCTION | |
DROP TABLE example_table; | |
psql:/Users/joel/example.sql:26: ERROR: cannot drop table example_table because other objects depend on it | |
DETAIL: function get_name(integer) depends on table example_table | |
HINT: Use DROP ... CASCADE to drop the dependent objects too. | |
DROP TABLE example_table CASCADE; -- force dropping | |
psql:/Users/joel/example.sql:28: NOTICE: drop cascades to function get_name(integer) | |
DROP TABLE | |
-- | |
-- plpgsql function demo | |
-- | |
CREATE TABLE example_table | |
( | |
id INT NOT NULL, | |
name TEXT NOT NULL, | |
PRIMARY KEY (id) | |
); | |
CREATE TABLE | |
INSERT INTO example_table (id, name) VALUES (1, 'Adam'); | |
INSERT 0 1 | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
LANGUAGE plpgsql | |
AS $$ | |
BEGIN | |
RETURN (SELECT t.name FROM example_table_mispelled t WHERE t.id = get_name.id); | |
END; | |
$$; | |
CREATE FUNCTION | |
-- no compile-time error | |
SELECT get_name(1); | |
psql:/Users/joel/example.sql:54: ERROR: relation "example_table_mispelled" does not exist | |
LINE 1: (SELECT t.name FROM example_table_mispelled t WHERE t.id = g... | |
^ | |
QUERY: (SELECT t.name FROM example_table_mispelled t WHERE t.id = get_name.id) | |
CONTEXT: PL/pgSQL function get_name(integer) line 3 at RETURN | |
-- run-time error | |
CREATE OR REPLACE FUNCTION get_name(id INT) | |
RETURNS TEXT | |
LANGUAGE plpgsql | |
AS $$ | |
BEGIN | |
RETURN (SELECT t.name FROM example_table t WHERE t.id = get_name.id); | |
END; | |
$$; | |
CREATE FUNCTION | |
SELECT get_name(1); | |
get_name | |
---------- | |
Adam | |
(1 row) | |
DROP TABLE example_table; | |
DROP TABLE | |
-- no error | |
SELECT get_name(1); | |
psql:/Users/joel/example.sql:73: ERROR: relation "example_table" does not exist | |
LINE 1: (SELECT t.name FROM example_table t WHERE t.id = get_name.id... | |
^ | |
QUERY: (SELECT t.name FROM example_table t WHERE t.id = get_name.id) | |
CONTEXT: PL/pgSQL function get_name(integer) line 3 at RETURN | |
-- run-time error | |
joel@Joels-MacBook-Pro ~ % | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment