SQL ์ €์žฅ ํ”„๋กœ์‹œ์ ธ ์ž‘์—…

์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๋˜๋Š” ๋‹ค๋ฅธ ์ €์žฅ ํ”„๋กœ์‹œ์ ธ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์‹œ์ ธ๋Š” ์ž…๋ ฅ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ’์„ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BigQuery ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ํ”„๋กœ์‹œ์ ธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋Š” BigQuery์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์‹œ์Šคํ…œ ํ”„๋กœ์‹œ์ ธ๋ผ๊ณ  ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ํ”„๋กœ์‹œ์ ธ ์ฐธ์กฐ์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋Š” ์ ˆ์ฐจ์  ์–ธ์–ด ๋ฌธ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์ œ์–ด ํ๋ฆ„์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ˆ์ฐจ์  ์–ธ์–ด ๋ฌธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ ˆ์ฐจ์  ์–ธ์–ด ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ €์žฅ ํ”„๋กœ์‹œ์ ธ ๋งŒ๋“ค๊ธฐ

ํ”„๋กœ์‹œ์ ธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด CREATE PROCEDURE ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๊ฐœ๋…์  ์˜ˆ์‹œ์—์„œ procedure_name์€ ํ”„๋กœ์‹œ์ ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํ”„๋กœ์‹œ์ ธ์˜ ๋ณธ๋ฌธ์€ BEGIN๊ณผ END ๋ฌธ ์‚ฌ์ด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

CREATE PROCEDURE dataset_name.procedure_name()
BEGIN
-- statements here
END

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์‹œ์ ธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ฌธ ์ฟผ๋ฆฌ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ , INSERT ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ˜•์‹์ด ์ง€์ •๋œ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE PROCEDURE mydataset.create_customer()
BEGIN
  DECLARE id STRING;
  SET id = GENERATE_UUID();
  INSERT INTO mydataset.customers (customer_id)
    VALUES(id);
  SELECT FORMAT("Created customer %s", id);
END

์•ž์˜ ์˜ˆ์‹œ์—์„œ ํ”„๋กœ์‹œ์ ธ์˜ ์ด๋ฆ„์€ mydataset.create_customer์ด๊ณ  ํ”„๋กœ์‹œ์ ธ ๋ณธ๋ฌธ์€ BEGIN๊ณผ END ๋ฌธ ์‚ฌ์ด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์‹œ์ ธ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด CALL ๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

CALL mydataset.create_customer();

์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’ ์ž…๋ ฅ

ํ”„๋กœ์‹œ์ ธ์—๋Š” ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ”„๋กœ์‹œ์ ธ์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ถœ๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CREATE OR REPLACE PROCEDURE mydataset.create_customer(name STRING)
BEGIN
DECLARE id STRING;
SET id = GENERATE_UUID();
INSERT INTO mydataset.customers (customer_id, name)
  VALUES(id, name);
SELECT FORMAT("Created customer %s (%s)", id, name);
END

์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’ ์ถœ๋ ฅ

ํ”„๋กœ์‹œ์ ธ์—๋Š” ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ”„๋กœ์‹œ์ ธ์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ํ”„๋กœ์‹œ์ ธ์˜ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— OUT ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ํ”„๋กœ์‹œ์ ธ ๋ฒ„์ „์—์„œ๋Š” id ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒˆ ๊ณ ๊ฐ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE PROCEDURE mydataset.create_customer(name STRING, OUT id STRING)
BEGIN
SET id = GENERATE_UUID();
INSERT INTO mydataset.customers (customer_id, name)
  VALUES(id, name);
SELECT FORMAT("Created customer %s (%s)", id, name);
END

์ด ํ”„๋กœ์‹œ์ ธ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ๊ฐ’์„ ์ˆ˜์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--- Create a new customer record.
DECLARE id STRING;
CALL mydataset.create_customer("alice",id);

--- Display the record.
SELECT * FROM mydataset.customers
WHERE customer_id = id;

์ž…๋ ฅ/์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ

ํ”„๋กœ์‹œ์ ธ์—๋Š” ์ž…๋ ฅ/์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ/์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ”„๋กœ์‹œ์ ธ์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ”„๋กœ์‹œ์ ธ์˜ ์ž…๋ ฅ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ/์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— INOUT ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ธ์ˆ˜ ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฃจํ‹ด ์Šน์ธ

์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋ฅผ ๋ฃจํ‹ด์œผ๋กœ ์Šน์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šน์ธ๋œ ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๊ณ ๋„ ํŠน์ • ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šน์ธ๋œ ๋ฃจํ‹ด์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง‘๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ํ…Œ์ด๋ธ” ๊ฐ’์„ ์กฐํšŒํ•˜๊ณ  ์ด ๊ฐ’์„ ๊ณ„์‚ฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šน์ธ๋œ ๋ฃจํ‹ด์€ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ, ์‚ญ์ œ, ํ…Œ์ด๋ธ” ์กฐ์ž‘์€ ๋ฌผ๋ก  ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์—์„œ ๋‹ค๋ฅธ ์ €์žฅ ํ”„๋กœ์‹œ์ ธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์Šน์ธ๋œ ๋ฃจํ‹ด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ €์žฅ ํ”„๋กœ์‹œ์ ธ ํ˜ธ์ถœ

์ €์žฅ ํ”„๋กœ์‹œ์ ธ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด CALL ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ฌธ์€ ์ €์žฅ ํ”„๋กœ์‹œ์ ธ create_customer๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

CALL mydataset.create_customer();

์‹œ์Šคํ…œ ํ”„๋กœ์‹œ์ ธ ํ˜ธ์ถœ

๊ธฐ๋ณธ ์ œ๊ณต ์‹œ์Šคํ…œ ํ”„๋กœ์‹œ์ ธ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด CALL ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ฌธ์€ ์‹œ์Šคํ…œ ํ”„๋กœ์‹œ์ ธ BQ.REFRESH_MATERIALIZED_VIEW๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

CALL BQ.REFRESH_MATERIALIZED_VIEW;