ホームページ > php教程 > PHP开发 > SQL ストアド プロシージャの定義とストアド プロシージャの利点

SQL ストアド プロシージャの定義とストアド プロシージャの利点

高洛峰
リリース: 2016-12-14 15:26:39
オリジナル
1450 人が閲覧しました

再利用。ストアド プロシージャは再利用できるため、データベース開発者の作業負荷が軽減されます。
(2) パフォーマンスを向上させる。ストアド プロシージャは作成時にコンパイルされ、将来使用するときに再コンパイルする必要はありません。一般的な SQL ステートメントは実行するたびにコンパイルする必要があるため、ストアド プロシージャを使用すると効率が向上します。
(3) ネットワークトラフィックを削減します。ストアド プロシージャはサーバー上に配置されているため、呼び出すときはストアド プロシージャの名前とパラメータを渡すだけで済むため、ネットワーク上で送信されるデータの量が削減されます。
(4) 安全性。パラメーター化されたストアド プロシージャは SQL インジェクション攻撃を防ぐことができ、ストアド プロシージャにアクセス許可の付与、拒否、取り消しを適用できます。
ストアド プロシージャは、ユーザー定義ストアド プロシージャ、拡張ストアド プロシージャ、システム ストアド プロシージャの 3 つのカテゴリに分類されます。
このうち、ユーザー定義ストアドプロシージャは、Transaction-SQL と CLR の 2 種類に分けられます。
Transaction-SQL ストアド プロシージャは、ユーザーが指定したパラメーターを受け入れて返すことができる、保存された Transaction-SQL ステートメントのコレクションを指します。
CLR ストアド プロシージャとは、ユーザー指定のパラメータを受け入れて返すことができる .Net Framework 共通言語ランタイム (CLR) メソッドへの参照を指します。これらは、.Net Framework アセンブリ内のクラスのパブリック静的メソッドとして実装されます。
ストアド プロシージャを作成するステートメントは次のとおりです。
引用された内容は次のとおりです:
CREATE { PROC | PROCEDURE } [schema_name.]procedure_name [ ;number ]
[ { @parameter [ type_schema_name ] data_type }
[ VARYING ] ] [ = デフォルト ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH [ ,n ]
[ FOR REPLICATION ]
AS { [;][ n ] | ; }
[; ]
::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]

::=

{ [ BEGIN ] ステートメント [ END ] }

外部名 Assembly_name.class_name.method_name

[schema_name]: ストレージ プロシージャのアーキテクチャの名前
例:
Create SCHEMA YANGYANG88848

Go
Create PROC Angyang8848.allgoods
as select * from master_goods
Go
の実行: AllGoods の実行でエラーが発生しました。
実行: yangyang8848.AllGoods の実行は正しく実行されます。
[数値]: 同じ名前のプロシージャをグループ化するために使用されるオプションの整数。これらのグループ化されたプロシージャをまとめて削除するには、DROP PROCEDURE ステートメントを使用します。 Re 例: Create Proc S1; 1
AS
Select * from Master_goods

Go

Create PROC S1; 2
AS
SELECT * from Master_Location
Go
は 2 つのストレージ手順を完了します。これらは同じグループ S1 に属します。Exec S1 が実行されると、ストアド プロシージャはデフォルトで Exec S1 を実行します。1.すべての基本情報を取得したい場合は、Exec S1;2 を実行する必要があります。ストアド プロシージャを削除する場合は、Drop Exec S1 を実行するだけで、グループ内のすべてのストアド プロシージャが削除されます。 M [@ パラメータ]: ストレージ プロシージャ内のパラメータ。パラメータがデフォルト値を定義するか、パラメータを別のパラメータと等しいものとして設定しない限り、ストレージ プロセスを呼び出すときにユーザーがパラメータ値を割り当てる必要があります。
ストアド プロシージャには、最大 2100 個のパラメータを含めることができます。
例:

プロセス yangyang8848.OneGoods を作成します
@GoodsCode varchar(10)
@Code varchar(10) を宣言
@Code = '0004' を設定
@Code yangyang8848.OneGoods を実行パラメーターの後に Output を追加すると、パラメーターが出力であることを示しますパラメータ。 O Create PROC Yangyang8848.Onegoods
@GOODSCODE2 VARCHAR (10) 出力、@GOODSCODE VARCHAR (10) = '0011'
AS
From Master_GOODS WHERE GOODSCODE = @GOODSCODE
SET @GOODSCODE2 = '0005'
Go
callメソッド:
Declare @vv2 varchar (10)
Exec yangyang8848.onegoods @Code Out
注: ストレージ プロシージャの 2 つのパラメーターにデフォルト値がある場合は、デフォルトのデフォルトを設定する必要があります。そうしないと、問題が発生します ~~
。注意深い人なら、上記のステートメントにはいくつかの違いがあることに気づくかもしれません。たとえば、ストアド プロシージャは出力を使用しますが、呼び出し側ステートメントは out を使用します。私がここで言いたいのは、どちらも同じです。

[RECOMPILE]: 実行時にコンパイルされるこのプロシージャのプランをキャッシュしないようにデータベース エンジンに指示します。 FOR REPLICATION が指定されている場合、このオプションは使用できません。 CLR ストアド プロシージャの場合、RECOMPILE は指定できません。
これは非常に便利な関数です。 OBJECT_ID: スキーマのスコープ内のオブジェクトのデータベース オブジェクト識別番号を返します。
例: ストアド プロシージャを作成するときは、次のようにコードを記述できます

If Object_ID('yangyang8848.OneGoods') Is Not Null

Drop Proc yangyang8848.OneGoods Go

Create Proc yangyang8848.OneGood s
@GoodsCode2 varchar (10) 出力、@GoodsCode varchar(10) = '0011'
次の SQL クエリを呼び出します

定義を選択しますここで、 object_id = Object_ID('yangyang8848.OneGoods');

しかし、ストアド プロシージャに [ENCRYPTION] を追加すると、結果は何も表示されなくなります

If Object_ID('yangyang8848.OneGoods') Is Not Null
gyang8848.OneGoods
@GOODSCODE2 VARCHAR (10) OUT, @ GOODSCODE VARCHAR (10) = '0011'

Encryption
s 付き
Select * from Master_goods where goodScode = @GOODSCODE
SET OODSCODE2 = '0005'
Go

次に、sys .sql_modules カタログ ビューをチェックすると、Null が返されます。

次に、次の SQL を実行します: Exec sp_helptext 'yangyang8848.OneGoods'
次の結果が得られます: オブジェクト 'yangyang8848.OneGoods' のテキストは暗号化されています。

この時点で、パラメータ [ENCRYPTION]: は CREATE PROCEDURE ステートメントの元のテキストをファジー形式に変換する暗号化関数であることを理解する必要があります。難読化されたコードの出力は、SQL Server 2005 のカタログ ビューに直接表示できません。システム テーブルまたはデータベース ファイルにアクセスできないユーザーは、難読化されたテキストを取得できません。ただし、このテキストは、DAC ポートを介してシステム テーブルにアクセスするか、データベース ファイルに直接アクセスできる特権ユーザーによって使用できます。さらに、デバッガをサーバー プロセスに接続できるユーザーは、実行時にメモリから復号化されたプロセスを取得できます。
2 日前にカーソルに関する紹介記事を書きました。ストアド プロシージャでカーソルを使用する例を次に示します。

If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go O Create Proc GetmasterGoods

@Mycursor Cursor Variing Output

With Encryption
as SET @Mycursor = Cursor
Select GoodsCode, Goodsname From_go ODS
Open @MyCursor
Go

- 以下の別のストレージ プロシージャ カーソル出力結果をトラバースします

Create Proc GetAllGoodsIDAndName

として

@GoodsCode varchar(18) を宣言します

@GoodsName nvarchar(20) を宣言します
Ex Cursor ec GetMasterGoods @MasterGoodsCursor out

@MasterGoodsCursor から次を取得します

InTo @GoodsCode, @GoodsName
@MasterGoodsCursor から次を取得
InTo @GoodsCode,@ GoodsName
End
Close @MasterGoodsCursor
Deallocate @ MasterGoodsCursor
Go

Exec GetAllGoodsIDAndName を実行した最終結果は次のとおりです

0003: Product 0003
0004: Product 0004
0005:123123
0006: 製品 0006
0007: 製品 0007
0008: 製品 0008
0009: 製品 0009

0010: 品目 0010

0011: 品目 0011

0012: 品目 0012

0013: 品目 0013
0014: 品目 0014



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート