Programmingデータベース開発者 / DBアーキテクト

SQLで再利用可能なビジネスロジックを実装するためのサブルーチン(プロシージャ/関数)の正しい作成と使用方法、およびパラメータと返り値の管理に関する注意点は何ですか?

Hintsage AIアシスタントで面接を突破

回答。

SQLのサブルーチンには2種類があります:

  • プロシージャ(ストアドプロシージャ): アクション(挿入、更新、削除)を実行し、OUTパラメータや行セットを返すことができます(SELECTを介して)。CALL/EXECを使用して呼び出され、常にSELECT層で使用されるわけではありません。
  • 関数(ユーザー定義関数、UDF): 値(スカラーまたはテーブル)を返し、SELECT、WHERE、ORDER BYなどの構文内で直接使用できます。

重要:

  • プロシージャは通常のSELECTで使用することはできず、EXEC/CALLによってのみ呼び出されます。
  • 関数は1つの値(スカラー)またはテーブル(テーブル関数)のみを返すことができ、任意の式で使用できます。
  • 常にパラメータを文書化してください:IN(入力用)、OUT(結果返却用)、INOUT(双方向)。

スカラー関数の例(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を知ることができなくなり、統合が「壊れた」。


物語

プロジェクト: 様々なルールに基づく税計算の金融サービス。 エラー: スカラー関数をパフォーマンステストなしで大量のクエリに使用 — 行ごとの呼び出しによりクエリがテーブルの処理を遅くした(最適化されていないプラン)。