web-dev-qa-db-ja.com

ストアドプロシージャとは何ですか?

ストアドプロシージャとは何ですか?どうやって動くの?ストアドプロシージャの構成とは何ですか(各ストアドプロシージャである必要があること)

271
George Stocker

ストアドプロシージャは、いくつかの方法で実行できるSQLステートメントのバッチです。ほとんどの主要なDBMはストアドプロシージャをサポートしています。しかし、すべてがそうではありません。詳細については、特定のDBMSヘルプドキュメントを確認する必要があります。私はSQL Serverに最も精通しているので、それを私のサンプルとして使用します。

ストアドプロシージャを作成するための構文はかなり単純です。

CREATE PROCEDURE <owner>.<procedure name>

     <Param> <datatype>

AS

     <Body>

だから、例えば:

CREATE PROCEDURE Users_GetUserInfo

    @login nvarchar(30)=null

AS

    SELECT * from [Users]
    WHERE ISNULL(@login,login)=login

ストアドプロシージャの利点は、データアクセスロジックを1か所に集中させることができ、DBAにとって最適化が容易になることです。ストアドプロシージャには、ストアドプロシージャに実行権限を付与できるという点でセキュリティ上の利点もありますが、ユーザーは基礎となるテーブルに対する読み取り/書き込み権限を持つ必要がありません。これはSQLインジェクションに対する良い第一歩です。

ストアドプロシージャにはマイナス面があります。基本的には基本的な CRUD 操作に関連するメンテナンスです。各テーブルにInsert、Update、Delete、および主キーに基づく少なくとも1つのselectがあるとしましょう。つまり、各テーブルには4つのプロシージャがあります。今400テーブルのまともなサイズのデータ​​ベースを取りなさい、そしてあなたは1600の手続きを持っている!そしてそれはあなたがあなたがおそらくそうするだろう重複を持っていないと仮定しています。

ここで、 ORM またはその他の基本的なCRUD操作を自動生成する方法を使用すると、非常に大きなメリットがあります。

220
JoshBerke

ストアード・プロシージャーは、特別なタスクを実行するために使用される一連のプリコンパイル済みSQLステートメントです。

例:Employeeテーブルがある場合

Employee ID  Name       Age  Mobile
---------------------------------------
001          Sidheswar  25   9938885469
002          Pritish    32   9178542436

最初にEmployeeテーブルを取得しています。

Create Procedure Employee details
As
Begin
    Select * from Employee
End

SQL Serverでプロシージャを実行するには

Execute   Employee details

--- (Employee details is a user defined name, give a name as you want)

次に、私はEmployee Tableに値を挿入しています

Create Procedure employee_insert
    (@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
    Insert Into Employee
    Values (@EmployeeID, @Name, @Age, @Mobile)
End

SQL Serverでパラメータ化プロシージャを実行するには

Execute employee_insert 003,’xyz’,27,1234567890

  --(Parameter size must be same as declared column size)

例:@Name Varchar(30)

Employeeテーブルでは、Name列のサイズはvarchar(30)である必要があります。

139
sidhewsar

ストアドプロシージャは、データベースに作成および保存されたSQLステートメントのグループです。ストアドプロシージャは、異なる入力データを使用する複数のクライアントがネットワーク上で単一のプロシージャを使用できるように、入力パラメータを受け入れます。ストアドプロシージャは、ネットワークトラフィックを削減し、パフォーマンスを向上させます。ストアドプロシージャを変更すると、すべてのクライアントが更新されたストアドプロシージャを取得します。

ストアドプロシージャを作成するサンプル

CREATE PROCEDURE test_display
AS
    SELECT FirstName, LastName
    FROM tb_test;

EXEC test_display;

ストアドプロシージャを使用する利点

  • ストアドプロシージャにより、モジュールプログラミングが可能になります。

    プロシージャを1回作成してデータベースに保存し、プログラムで何度でも呼び出すことができます。

  • ストアドプロシージャにより、より高速に実行できます。

    操作が繰り返し実行される大量のSQLコードを必要とする場合、ストアドプロシージャはより高速になります。それらは最初に実行されるときに解析および最適化され、ストアドプロシージャのコンパイルされたバージョンは後で使用するためにメモリキャッシュに残ります。これは、使用するたびにストアドプロシージャを再解析および再最適化する必要がないため、実行時間が大幅に短縮されることを意味します。

  • ストアドプロシージャを使用すると、ネットワークトラフィックを削減できます。

    ネットワーク上で数百行のコードを送信するのではなく、数百行のTransact-SQLコードを必要とする操作を、プロシージャ内のコードを実行する単一のステートメントで実行できます。

  • ストアドプロシージャにより、データのセキュリティが向上します。

    ユーザーは、プロシージャのステートメントを直接実行する権限を持っていなくても、ストアドプロシージャを実行する権限を付与できます。

    SQL Serverには、さまざまな種類のストアドプロシージャがあります。

    • システムストアドプロシージャ
    • ユーザー定義のストアドプロシージャ
    • 拡張ストアドプロシージャ
  • システム-ストアドプロシージャはmasterデータベースに格納され、sp_プレフィックスで始まります。これらの手順を使用して、システムテーブル内の外部アプリケーション呼び出しのSQL Server機能をサポートするためのさまざまなタスクを実行できます。

    例:sp_helptext [StoredProcedure_Name]

  • ユーザー定義ストアドプロシージャは通常ユーザーデータベースに格納され、通常はユーザーデータベースのタスクを完了するように設計されています。これらのプロシージャをコーディングしている間使用しないsp_プレフィックスを使用する場合、最初にsp_プレフィックスを使用すると、masterデータベースがチェックされ、次にユーザー定義データベースになります。

  • 拡張ストアドプロシージャは、DLLファイルから関数を呼び出すプロシージャです。現在、拡張ストアドプロシージャは、拡張ストアドプロシージャの使用を避けた方がよいという理由で廃止されています。

75
Kanwar Singh

一般に、ストアドプロシージャは "SQL関数"です。彼らは持っている:

-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID

これはT-SQLに焦点を当てた例です。ストアドプロシージャは、ほとんどのSQLステートメントを実行し、スカラー値とテーブルベースの値を返すことができ、SQLインジェクション攻撃を防ぐためより安全であると見なされます。

34
Dave Swersky

このような状況を考えてください。

  • あなたはデータを持ったデータベースを持っています。
  • その中央データベースにアクセスするために必要なさまざまなアプリケーションがあり、将来的にはいくつかの新しいアプリケーションも必要になります。
  • 中央データベースにアクセスするためにインラインデータベースクエリを各アプリケーションのコード内に個別に挿入する場合は、おそらく同じクエリを別のアプリケーションのコード内に何度も何度も複製する必要があります。
  • そのような状況では、ストアドプロシージャ(SP)を使用できます。ストアドプロシージャでは、いくつかの一般的なクエリ(プロシージャ)を作成して中央データベースに格納します。
  • これで、作業の重複が以前のように発生することはなくなり、データアクセスとメンテナンスが集中的に行われます。

注意:

  • 上記の状況では、「すべてのアプリケーションと対話するために中央データアクセスサーバーを導入できないのはなぜでしょうか?はい。それが代替手段になる可能性があります。」
  • このアプローチに対するSPの主な利点は、インラインクエリを使用するデータアクセスコードとは異なり、SPはプリコンパイルされたステートメントであるため、実行速度が速くなることです。そして(ネットワーク上の)通信コストは最小限になります。
  • それとは反対に、SPはデータベースサーバーにさらに負荷をかけます。状況に応じてそれが問題になる場合は、インラインクエリを使用する集中型データアクセスサーバーを使用することをお勧めします。
14

ストアドプロシージャは、主にデータベースに対して特定のタスクを実行するために使用されます。例えば

  • データのビジネスロジックからデータベースの結果セットを取得します。
  • 1回の呼び出しで複数のデータベース操作を実行します。
  • あるテーブルから別のテーブルにデータを移行するために使用されます。
  • Javaのような他のプログラミング言語のために呼ばれることができます。
7
MAA

ストアドプロシージャは、データベーステーブル内のデータの取得、データの変更、およびデータの削除に使用されます。 SQLデータベースでデータを挿入、更新、削除するたびにSQLコマンド全体を書く必要はありません。

5
venkat

ストアドプロシージャは、単一の実行計画にコンパイルされたSQLステートメントのグループに他なりません。

  1. 一度作成し、それをn回呼び出す
  2. ネットワークトラフィックを減らす

例:ストアドプロシージャの作成

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
      SET NOCOUNT ON;

      SELECT FirstName, LastName, BirthDate, City, Country
      FROM Employees 
      WHERE EmployeeID = @EmployeeID
END
GO

ストアドプロシージャを変更または修正します。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
    SET NOCOUNT ON;

    SELECT FirstName, LastName, BirthDate, City, Country
    FROM Employees 
    WHERE EmployeeID = @EmployeeID
END
GO

ストアドプロシージャを削除または削除します。

DROP PROCEDURE GetEmployee
5
user5723819
  • ストアード・プロシージャーは、特定のタスクを実行する1つ以上のSQLステートメントのプリコンパイル済みセットです。

  • ストアドプロシージャはEXECを使ってスタンドアロンで実行されるべきです

  • ストアドプロシージャは複数のパラメータを返すことができます

  • ストアドプロシージャを使用してトランザクションを実装できます。

3
Kedarnath M S

「ストアドプロシージャとは」は、他の投稿で既に回答されています。私が投稿するのは、ストアドプロシージャを使用する方法としてあまり知られていない方法です。 grouping stored proceduresまたはnumbering stored proceduresです。

構文リファレンス

enter image description here

; numberの通り これ

同じ名前のプロシージャをグループ化するために使用されるオプションの整数。これらのグループ化されたプロシージャーは、1つのDROP PROCEDUREステートメントを使用してまとめてドロップすることができます。

CREATE Procedure FirstTest 
(
    @InputA INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO

CREATE Procedure FirstTest;2
(
    @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

使用

exec FirstTest 10
exec FirstTest;2 20,30

結果

enter image description here

もう1つの試み

CREATE Procedure SecondTest;2
(
     @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

結果

メッセージ2730、レベル11、状態1、プロシージャSecondTest、行1 [グループ名2のプロシージャ 'SecondTest'を作成することはできませんデータベースCREATE PROCEDURE 'SecondTest'; 1を最初に実行する必要があります。

参考文献

  1. numberの構文を持つCREATE PROCEDURE
  2. SQL Serverの番号付きストアドプロシージャ - techie-friendly.blogspot.com
  3. ストアドプロシージャのグループ化 - sqlmag

注意

  1. プロシージャをグループ化した後、それらを個別に削除することはできません。
  2. この機能は、将来のバージョンのMicrosoft SQL Serverでは削除される可能性があります。
3
Lijo

簡単に

ストアドプロシージャストアドプログラム、データベースに保存されたプログラム/関数です。

各ストアドプログラムには、SQLステートメントで構成される本体が含まれています。このステートメントは、セミコロン(;)文字で区切られた複数のステートメントで構成された複合ステートメントです。

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
0
AZinkey

DBMSでは、ストアドプロシージャは、データベースにコンパイルされた形式で格納されている、割り当てられた名前を持つ一連のSQL文です。これにより、多数のプログラムで共有できます。

ストアドプロシージャを使用すると便利です。

  1. データへの制御されたアクセスを提供する(エンドユーザーはデータを入力または変更することしかできませんが、手順を書くことはできません)

  2. データの完全性の確保(データは一貫した方法で入力されます)

  3. 生産性が向上します(ストアード・プロシージャーのステートメントは一度だけ書く必要があります)。

0
Naina

SQL Serverのストアドプロシージャは、入力パラメータを受け取り、複数の値の出力パラメータを返すことができます。 SQL Serverでは、ストアドプロシージャは、データベース内で操作を実行し、呼び出し元のプロシージャまたはバッチにステータス値を返すようにステートメントをプログラムします。

SQL Serverでストアドプロシージャを使用する利点

それらはモジュール式プログラミングを可能にします。それらはより速い実行を可能にします。それらはネットワークトラフィックを減らすことができます。それらはセキュリティメカニズムとして使用することができます。

これは、パラメータを受け取り、クエリを実行し、結果を返すストアドプロシージャの例です。具体的には、ストアード・プロシージャーはBusinessEntityIDをパラメーターとして受け入れ、これを使用してHumanResources.Employee表の主キーと突き合わせて、要求された従業員を返します。

> create procedure HumanResources.uspFindEmployee    `*<<<---Store procedure name`*
@businessEntityID                                     `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId,              <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId     <<<---parameter used as criteria
end

私はessential.comからこれを学びました...それはとても役に立ちます。

0
Jammy Nemo

ストアドプロシージャでは、ステートメントは1回だけ書き込まれ、クライアントとサーバー間のネットワークトラフィックを削減します。 SQLインジェクション攻撃も回避できます。

  • あなたが支払い処理のためにあなたのアプリケーションで第三者のプログラムを使用している場合、ここでデータベースはそれが必要とする情報とこの第三者が承認された活動を公開するだけです.
  • テーブルの更新は、それが対象としているテーブルに対してのみ行われるべきですが、それは他のテーブルを更新するべきではありません。
  • データ型を持つ1つ以上の項目を返したい場合は、出力パラメータを使用することをお勧めします。
  • ストアドプロシージャでは、返される必要があるものすべてに対して出力パラメータを使用します。整数データ型のみを持つアイテムを1つだけ返したい場合は、戻り値を使用してください。実際には、戻り値はストアドプロシージャの成功または失敗を知らせるためだけのものです。
0

ストアドプロシージャは、サーバーでコードを作成するのに役立ちます。パラメータを渡して出力を見つけることができます。

create procedure_name (para1 int,para2 decimal)
as
select * from TableName
0
Biddut

ストアドプロシージャは、SQL文と手続き型ロジックの名前付きコレクション、つまりコンパイル、検証、およびサーバーデータベースへの格納です。ストアドプロシージャは通常、他のデータベースオブジェクトと同様に扱われ、サーバーセキュリティメカニズムを通じて制御されます。

0
Nirmala Hansdak