SQLのサブルーチンには2種類があります:
CALL/EXECを使用して呼び出され、常にSELECT層で使用されるわけではありません。重要:
スカラー関数の例(PostgreSQL):
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- 使用法: SELECT *, get_tax(price) AS tax FROM product;
ストアドプロシージャの例(SQL Server):
CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;
ストアドプロシージャをSELECT内で直接使用できますか?
多くの人が「はい」と答えますが、これは誤りです。
回答:
EXEC/CALL)、しかし関数はSELECTで使用できます。物語
プロジェクト: 初期会計システム、レポートの実装。 エラー: 合計を計算するために関数の代わりにプロシージャを書いたため — SELECTが動作せず、ユーザー報告のロジック全体を書き直さなければならなかった。
物語
プロジェクト: 外部パラメータを持つERPシステム。 エラー: プロシージャにOUTキーを設定せず、結果的にクライアントが追加されたレコードのIDを知ることができなくなり、統合が「壊れた」。
物語
プロジェクト: 様々なルールに基づく税計算の金融サービス。 エラー: スカラー関数をパフォーマンステストなしで大量のクエリに使用 — 行ごとの呼び出しによりクエリがテーブルの処理を遅くした(最適化されていないプラン)。