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


298

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

ストアドプロシージャの構成は何ですか(それぞれがストアドプロシージャである必要あります)?

回答:


243

ストアドプロシージャは、いくつかの方法で実行できる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

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

ストアドプロシージャには欠点があります。基本的に、基本的なCRUDに関連するメンテナンスです。操作に。各テーブルについて、挿入、更新、削除、および主キーに基づく少なくとも1つの選択があるとします。つまり、各テーブルには4つのプロシージャがあります。400テーブルのまともなサイズのデータ​​ベースを取得すると、1600のプロシージャが作成されます。そして、それはあなたがおそらくそうするであろう重複がないことを前提としています。

これは、基本的なCRUD操作を自動生成するためにORMまたはその他の方法を使用することで、非常に多くのメリットが得られる場合です。


1
データを読み取り、操作を行うのがORM好きなストアドプロシージャですか?Entity FrameworkCRUD
shaijut 2017

2
ええ、それは一つの可能​​なアプローチです。レポート以外はすべて
ORM

ストアドプロシージャの詳細については、URL techflirt.com/mysql-stored-procedure-tutorial
Kumar Singh

150

ストアドプロシージャは、特別なタスクを実行するために使用されるプリコンパイルされた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)

次に、従業員テーブルに値を挿入します

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)


1
わかりやすい例
HaFiz Umer

80

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

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

CREATE PROCEDURE test_display
AS
    SELECT FirstName, LastName
    FROM tb_test;

EXEC test_display;

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

  • ストアドプロシージャでは、モジュール式プログラミングが可能です。

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

  • ストアドプロシージャを使用すると、実行を高速化できます。

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

  • ストアドプロシージャは、ネットワークトラフィックを減らすことができます。

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

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

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

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

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

    例:sp_helptext [StoredProcedure_Name]

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

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


37

通常、ストアドプロシージャは「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インジェクション攻撃を防ぐため、より安全であると考えられています。


16

このような状況を考えて、

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

注意:

  • 上記の状況では、「すべてのアプリケーションと対話するために中央データアクセスサーバーを導入できないのはなぜですか?はい。それは可能な代替策です。しかし、
  • そのアプローチに対するSPの主な利点は、インラインクエリを使用したデータアクセスコードとは異なり、SPは事前にコンパイルされたステートメントであるため、実行が高速になります。また、(ネットワーク経由の)通信コストは最小限になります。
  • それとは逆に、SPはデータベースサーバーに負荷を追加します。状況に応じてそれが問題になる場合は、インラインクエリを備えた集中型データアクセスサーバーの方が適しています。

9

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

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

7

ストアドプロシージャは、単一の実行プランにコンパイルされた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

6

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


4
  • ストアード・プロシージャーは、特定のタスクを実行する1つ以上のSQLステートメントのプリコンパイルされたセットです。

  • ストアドプロシージャは、スタンドアロンで実行する必要があります EXEC

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

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


4

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

構文リファレンス

ここに画像の説明を入力してください

; 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

結果

ここに画像の説明を入力してください

別の試み

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 [バッチ開始行3]同じ名前とグループ番号1のプロシージャが現在存在しないため、グループ番号2のプロシージャ 'SecondTest'を作成できませんデータベース。最初にCREATE PROCEDURE 'SecondTest'; 1を実行する必要があります。

参照

  1. 数値の構文を使用したCREATE PROCEDURE
  2. SQL Serverの番号付きストアドプロシージャ-techie-friendly.blogspot.com
  3. ストアドプロシージャのグループ化-sqlmag

注意

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

0

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


0

DBMSでは、ストアドプロシージャは、割り当てられた名前を持つSQLステートメントのセットであり、コンパイルされた形式でデータベースに保存されるため、多くのプログラムで共有できます。

ストアドプロシージャの使用は、

  1. データへの制御されたアクセスの提供(エンドユーザーはデータの入力または変更のみが可能で、プロシージャの作成はできません)

  2. データの整合性の確保(データは一貫した方法で入力されます)および

  3. 生産性が向上します(ストアドプロシージャのステートメントは1回だけ記述する必要があります)


0

簡単に

ストアドプロシージャは、データベースに格納されたプログラム/関数であるストアドプログラムです。

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

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

0

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

これはエッセンシャル・ドット・コムから学びました。とても便利です。


0

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

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

0

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

  • アプリケーションで支払いを処理するためにサードパーティプログラムを使用している場合、ここでデータベースは必要な情報とこのサードパーティが承認したアクティビティのみを公開する必要があります。これにより、ストアドプロシージャを使用して権限を設定することでデータの機密性を確保できます。
  • テーブルの更新は、ターゲットとするテーブルに対してのみ行われるべきですが、トランザクション処理とエラー処理を使用してデータの整合性を実現できる他のテーブルを更新するべきではありません。
  • データ型を持つ1つ以上のアイテムを返す場合は、出力パラメーターを使用することをお勧めします。
  • ストアドプロシージャでは、返される必要のあるものすべてに出力パラメーターを使用します。整数データ型のみのアイテムを1つだけ返す場合は、戻り値を使用することをお勧めします。実際には、戻り値は、ストアドプロシージャの成功または失敗を通知するためだけのものです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.