【SQL】ストアド・プロシージャ

4924 ワード

何ですか.
1、大規模なデータベースシステムでは、特定の機能を果たすためのSQL文セットのセットが、データベースに格納されている(私たちのC#でカプセル化された方法のように、繰り返し呼び出すことができる)最初のコンパイル後に再コンパイルする必要がなく、ユーザーはストレージプロセスの名前を指定し、パラメータ(ストレージプロセスにパラメータがある場合)を与えて実行する.
2、ストレージ中に論理制御文とデータ操作文を含めることができ、パラメータ、出力パラメータを受け入れ、単一または複数の結果セットを返し、値を返すことができる.
メリットとデメリット
1、メリット
①繰り返し使用.ストレージ・プロシージャを繰り返し使用することで、データベース開発者の作業量を削減できます.
②ネットワークトラフィックを減らす.ストレージ・プロシージャはサーバ上にあり、呼び出すときにストレージ・プロシージャの名前とパラメータを渡すだけでよいため、ネットワーク転送のデータ量を低減します.
③安全性.パラメータ化されたストレージ・プロシージャは、SQL注入攻撃を防止し、Grant、Deny、Revoke権限をストレージ・プロシージャに適用します.
簡単に言えば:1.ストレージ・プロシージャは、作成時にのみコンパイルされます.その後、ストレージ・プロシージャを実行するたびに再コンパイルする必要はありません.通常、SQL文は実行するたびにコンパイルされるので、ストレージ・プロシージャを使用するとデータベースの実行速度が向上します.
2.データベースに対して複雑な操作を行う場合(例えば、複数のテーブルに対してUpdate,Insert,Query,Deleteを行う場合)は、この複雑な操作を記憶プロセスでカプセル化する、データベースが提供するトランザクションと組み合わせて使用することができる.
3.ストレージ・プロシージャを繰り返し使用することで、データベース開発者の作業量を削減
4.セキュリティが高く、特定のストレージ・プロシージャに対する使用権があるユーザーのみを設定できます.
2、短所
1:デバッグは面倒ですが、PL/SQL Developerでデバッグするのは便利です!この欠点を補う.2:移植の問題は、データベース側のコードがデータベースに関連していることは当然です.しかし、エンジニアリング型のプロジェクトであれば、移植の問題はほとんどありません.3:バックエンドコードは実行前にコンパイルされているため、参照関係のあるオブジェクトが変更された場合、影響を受けるストレージ・プロシージャ、パッケージは再コンパイルする必要があります(ただし、実行時刻自動コンパイルに設定することもできます).4:メンテナンスが面倒で、1つのプログラムシステムでストレージプロセスを大量に使用している場合、プログラムの交付使用時にユーザーのニーズが増加するにつれてデータ構造の変化を招き、次にシステムに関する問題が発生し、最後にユーザーがこのシステムをメンテナンスするのは難しいと言え、しかも代価が空前のもので、メンテナンスがもっと面倒になる.
操作方法
1、作成
	Create procedure sp_name
	@[   ][   ]@[   ][  ]
	As 
	Begin
	……
	End
	//  :sp_name              ,              

2、呼び出し
	Exec sp_name[   ]

3、削除
	Drop procedure sp_name
	//                   ,           

栗をあげましょう
3つのコンビネーションクエリのSQL文は基本的に同じなので、データベース内の特定のストレージ・プロシージャにカプセル化し、必要に応じてDALレイヤで直接呼び出すことができます.
ユーザ基本情報照会のD層コード

 public List GroupFindTemplateCard(Entity.GroupFindTemplate groupfind)
        {
	//             
            SqlParameter[] sqlparameter =
            {
                new SqlParameter ("@comboOperators1", groupfind .CmbCondition1 ),
                new SqlParameter ("@comboOperators2", groupfind .CmbCondition2 ),
                new SqlParameter ("@comboOperators3",groupfind .CmbCondition3 ),
                new SqlParameter ("@comboFields1", groupfind.CmbParameter1 ),
                new SqlParameter ("@comboFields2",groupfind .CmbParameter2 ),
                new SqlParameter ("@comboFields3",groupfind .CmbParameter3 ),
                new SqlParameter ("@comboCheck1",groupfind .CmbRelationship1 ),
                new SqlParameter ("@comboCheck2",groupfind .CmbRelationship2 ),
                new SqlParameter ("@textBox1",groupfind .textBox1 ),
                new SqlParameter ("@textBox2",groupfind .textBox2 ),
                new SqlParameter ("@textBox3",groupfind .textBox3 ),
                new SqlParameter ("@DbName",groupfind .DbtableName )

            };
	
	//        
            string sql = @"JF_GroupCheck";//       
	
	//  sql  
            DataTable table = sqlhelper.ExecuteQuery(sql, sqlparameter, CommandType.StoredProcedure);
	
	//datatable   
            List mylist = new List();
            CovertListHelper coverlisthelper = new CovertListHelper();

            mylist = coverlisthelper.covertToList(table);
   
            return mylist;
        }


データベース内のストアド・プロシージャ
-- =============================================
-- Author:		ZHY
-- Create date: 2018-12-7
-- Description:	        
-- =============================================
ALTER PROCEDURE [dbo].[JF_GroupCheck]    --         

    @DbName nvarchar(50),    --  sql        
    @comboFields1 nvarchar(20),
    @comboFields2 nvarchar(20),
    @comboFields3 nvarchar(20),
    @comboOperators1 nvarchar(10),
    @comboOperators2 nvarchar(10),
    @comboOperators3 nvarchar(10),
    @textBox1 nvarchar(20),
    @textBox2 nvarchar(20),
    @textBox3 nvarchar(20),
    @comboCheck1 nvarchar(10),
    @comboCheck2 nvarchar(10)

AS 
declare @TempSql varchar(500)--    sql  
--Char(32)       (39)    
BEGIN
      --       
    SET @TempSql=' select * from '+@DbName+' where '+char(32)+@comboFields1+@comboOperators1+char(39)+@textBox1+char(39)
    if(@comboCheck1 ='and' or @comboCheck1='or')
    begin
    --       
    SET @TempSql=@TempSql+char(32)+@comboCheck1+char(32)+@comboFields2+@comboOperators2+char(39)+@textBox2+char(39)
    if(@comboCheck2 ='and' or @comboCheck2='or')
    begin

    --       
    SET @TempSql=@TempSql+char(32)+@comboCheck2+char(32)+@comboFields3+@comboOperators3+char(39)+@textBox3+char(39)
    end
    end
    execute(@Tempsql)
END