ストアドプロシージャとは何ですか?どうやって動くの?ストアドプロシージャの構成とは何ですか(各がストアドプロシージャである必要があること)
ストアドプロシージャは、いくつかの方法で実行できる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操作を自動生成する方法を使用すると、非常に大きなメリットがあります。
ストアード・プロシージャーは、特別なタスクを実行するために使用される一連のプリコンパイル済み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)
である必要があります。
ストアドプロシージャは、データベースに作成および保存された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ファイルから関数を呼び出すプロシージャです。現在、拡張ストアドプロシージャは、拡張ストアドプロシージャの使用を避けた方がよいという理由で廃止されています。
一般に、ストアドプロシージャは "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インジェクション攻撃を防ぐためより安全であると見なされます。
このような状況を考えてください。
注意:
ストアドプロシージャは、主にデータベースに対して特定のタスクを実行するために使用されます。例えば
ストアドプロシージャは、データベーステーブル内のデータの取得、データの変更、およびデータの削除に使用されます。 SQLデータベースでデータを挿入、更新、削除するたびにSQLコマンド全体を書く必要はありません。
ストアドプロシージャは、単一の実行計画にコンパイルされたSQLステートメントのグループに他なりません。
例:ストアドプロシージャの作成
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
ストアード・プロシージャーは、特定のタスクを実行する1つ以上のSQLステートメントのプリコンパイル済みセットです。
ストアドプロシージャはEXEC
を使ってスタンドアロンで実行されるべきです
ストアドプロシージャは複数のパラメータを返すことができます
ストアドプロシージャを使用してトランザクションを実装できます。
「ストアドプロシージャとは」は、他の投稿で既に回答されています。私が投稿するのは、ストアドプロシージャを使用する方法としてあまり知られていない方法です。 grouping stored procedures
またはnumbering 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
結果
もう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を最初に実行する必要があります。
参考文献:
注意
簡単に
ストアドプロシージャはストアドプログラム、データベースに保存されたプログラム/関数です。
各ストアドプログラムには、SQLステートメントで構成される本体が含まれています。このステートメントは、セミコロン(;)文字で区切られた複数のステートメントで構成された複合ステートメントです。
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @x = 0;
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
DBMSでは、ストアドプロシージャは、データベースにコンパイルされた形式で格納されている、割り当てられた名前を持つ一連のSQL文です。これにより、多数のプログラムで共有できます。
ストアドプロシージャを使用すると便利です。
データへの制御されたアクセスを提供する(エンドユーザーはデータを入力または変更することしかできませんが、手順を書くことはできません)
データの完全性の確保(データは一貫した方法で入力されます)
生産性が向上します(ストアード・プロシージャーのステートメントは一度だけ書く必要があります)。
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からこれを学びました...それはとても役に立ちます。
ストアドプロシージャでは、ステートメントは1回だけ書き込まれ、クライアントとサーバー間のネットワークトラフィックを削減します。 SQLインジェクション攻撃も回避できます。
ストアドプロシージャは、サーバーでコードを作成するのに役立ちます。パラメータを渡して出力を見つけることができます。
create procedure_name (para1 int,para2 decimal)
as
select * from TableName
ストアドプロシージャは、SQL文と手続き型ロジックの名前付きコレクション、つまりコンパイル、検証、およびサーバーデータベースへの格納です。ストアドプロシージャは通常、他のデータベースオブジェクトと同様に扱われ、サーバーセキュリティメカニズムを通じて制御されます。