#14 Functions And Procedures
#14.0 Introduction
Functions & Procedure - database object๋ก ํน์ ์์ ์ ์ํํ๋ SQL ๊ตฌ๋ฌธ์ ์ธํธ๋ก ์บก์ํ ๊ฐ๋ฅ
#14.1 Functions
CREATE OR REPLACE FUNCTION hello_world() -- funcion์ value๋ฅผ returnํจ
RETURNS text AS
$$ -- BODY
SELECT 'hello_world';
$$
LANGUAGE SQL; -- ์ธ์ด
SELECT title, hello_world() FROM movies;
CREATE OR REPLACE FUNCTION hello_world(user_name text)
RETURNS text AS
$$ -- BODY
SELECT 'hello ' || user_name;
$$
LANGUAGE SQL;
SELECT title, hello_world('nico') FROM movies;
SELECT title, hello_world() FROM movies; -- ์คํ์ ์์ hello_world()๊ฐ ์คํ๋๋ค
DROP FUNCTION hello_world(); -- ์ญ์
CREATE OR REPLACE FUNCTION hello_world(text, text) -- parameter
RETURNS text AS
$$ -- BODY
SELECT 'hello ' || $1 || ' and ' || $2;
$$
LANGUAGE SQL;
SELECT hello_world('kim', 'son');
#14.2 Return Types
CREATE OR REPLACE FUNCTION is_hit_or_flop(movie movies)
RETURNS TEXT AS
$$
SELECT CASE
WHEN movie.revenue > movie.budget THEN 'Hit'
WHEN movie.revenue < movie.budget THEN 'Flop'
ELSE 'N/A'
END
$$
LANGUAGE SQL;
SELECT
title,
is_hit_or_flop(movies.*) -- movies์ ๋ชจ๋ column
FROM movies;
CREATE OR REPLACE FUNCTION is_hit_or_flop(movie movies)
RETURNS TABLE (hit_or_flop text, other_thing numeric) AS
$$
SELECT CASE
WHEN movie.revenue > movie.budget THEN 'Hit'
WHEN movie.revenue < movie.budget THEN 'Flop'
ELSE 'N/A'
END, 11111;
$$
LANGUAGE SQL;
DROP FUNCTION is_hit_or_flop(movies);
SELECT
title,
(is_hit_or_flop(movies.*)).*
FROM movies;
#14.3 Trigger Functions
-- VOLATILE RECORD ์์ ์ญ์ ๋ฑ ๊ฐ๋ฅ, ๊ฐ์ ์ธ์๋ก ๋ค์ด์จ ์ฑ๊ณต์ ์ธ ์์ฒญ์ ๋ํด ๋ค๋ฅธ ๊ฒฐ๊ณผ RETURN
-- STABLE ๋จ์ผ ๊ตฌ๋ฌธ ๋ด ๋ชจ๋ ROW์์ ๋์ผํ ARGUMENT์ ๋ํด ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ RETURN
-- IMMUTABLE ๋์ผํ ARGUMENT๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ ์์ํ ๊ฐ์ ๊ฐ RETURN
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS
$$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER updated_at
BEFORE UPDATE -- OF title , title์ด ์
๋ฐ์ดํธ ๋๊ธฐ ์
ON movies
FOR EACH ROW EXECUTE PROCEDURE set_updated_at();
#14.4 Procedures
-- procedure returnํ ํ์ ์์ DML command์์ ํธ์ถํ์ง ์์
CREATE PROCEDURE set_zero_revenue() AS
$$
UPDATE movies SET revenue = NULL WHERE revenue = 0;
$$
LANGUAGE SQL;
CALL set_zero_revenue();
-- RETURN ๋ ๊ฐ๋ฅํจ, ๊ท์ฐฎ์
CREATE PROCEDURE hello_world(IN name text, OUT greeting text) AS
$$
BEGIN
greeting = 'Hello ' || name;
END;
$$
LANGUAGE plpgsql;
CALL hello_world('SON', NULL);
#14.5 Python Extension
-- PostgreSQL์ด ๊ฐ์ฅ ๋ฐ์ ๋ ํ๊ฐ๋ฅผ ๋ฐ๋ ์ด์ ๋ EXTENSION ๋๋ฌธ
-- APP STACK BUILDER ํ์ฉ
CREATE OR REPLACE FUNCTION hello_world_py(name text)
RETURNS TEXT AS
$$
def hello(name);
return f'hello {name}'
output = hello(name)
return output
$$
LANGUAGE plpython3u;
SELECT hello_world_py('SON');
CREATE OR REPLACE FUNCTION log_updated_at_py(name text)
RETURNS TRIGGER AS
$$
import json, requests
request.post('http://localhost:3000', data=json.dumps(TD))
$$
LANGUAGE plpython3u;
CREATE TRIGGER updated_at_py
BEFORE UPDATE
ON movies
FOR EACH ROW EXECUTE PROCEDURE log_updated_at_py();
Last updated
Was this helpful?